微服务系列001

/ 默认分类 / 0 条评论 / 800浏览

github地址 nacos文档

一.写在前面

Nacos可以快速提供动态服务发现、服务配置、服务元数据及流量管理。所谓服务发现,其实就是,每个服务启动的时候,告诉注册中心,我在这,这是我家地址,需要我就来这就能找到我, 所以在每个服务中其实都配置了注册中心的地址,这样服务就都知道要去哪里注册自己了。

二.springcloud的中的应用

下面我以网关为例子,在微服务里面,最重要的就是服务,网关也是一个服务

pom.xml

<dependencies>
        <!--注册中心-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!--网关-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

    </dependencies>

application.yml

#spring
spring:
  application:
    name: api-gateway
#springcloud
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.12.146:8848  #注册中心地址
        cluster-name: cluster-01   #注册到注册中心的哪个集群中(如果这个集群不存在,那么会默认创建,然后将当前服务放进去,作为一个实例instance)
#        group: g001 #服务注册到哪个组
        namespace: 4769ae11-993a-40e4-9b02-b3190ad3baf9  #注册到nacos中的命名空间位置
#server
server:
  port: 11101

启动类

/**
 * @author zuohui@wondershare.cn
 * @date 2021/5/11 - 14:40
 */
@SpringBootApplication
@EnableDiscoveryClient
public class GateWaySpringbootAplication {

    public static void main(String[] args) {
        SpringApplication.run(GateWaySpringbootAplication.class, args);
    }

}

按照前面的分析,启动网关服务后,应该就将自己注册到了配置好的Nacos注册中心了,登录Nacos查看 Nacos后台服务列表

可以看到网关服务成功注册到了Nacos注册中心,其实这就是简单的在启动的时候,网关服务会自动发起一个注册请求到nacos,为什么会发呢?我们又没有写程序, 没错,其实就是我们在服务项目中引入了spring-cloud-starter-alibaba-nacos-discovery ,可以看作是一个Nacos的客户端,用来和Nacos通信的.他 引入在项目中之后,就会按照我们的配置发送相应的请求到Nacos中,就是简单的C/S的客户端和服务端的意思。 所以之前的文章和大家介绍过Nacos中的openapi, 这些api中也就有一个是专门提供给服务来注册自己的,只要服务请求了Nacos的这个openapi,带上了自己的详细信息,就会被注册到Nacos中 。 点我跳转文章

为了更加更加深入的了解,我在idea中设置了jvm的端口代理,使用fiddle抓包,详细如下:
抓包
对应的就是如下openapi
openapi

ps: 这里转包可以看到,没有指定组名的时候,serviceName参数值为DEFAULT_GROUP@@api-gateway,原因如下

serverProxy.registerService(NamingUtils.getGroupedName(serviceName, groupName), groupName, instance);  
    
    public static String getGroupedName(String serviceName, String groupName) {
        return groupName + Constants.SERVICE_INFO_SPLITER + serviceName;
    }

现在,我们在本地启动多个网关服务实例来验证前面Nacos源码中给出的服务结构管理模型

元数据: Nacos中为每个服务提供了元数据配置(kv键值对),可以显示和获取服务的一些信息,并且这一块等于也是一个可拓展的点
配置元数据的方式:

  1. application.properties方式

metadata是map格式,下面两种方式都是yml中配置map的方式

#spring
spring:
  application:
    name: api-gateway
#springcloud
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.12.146:8848  #注册中心地址
        cluster-name: cluster-02   #注册到注册中心的哪个集群中(如果这个集群不存在,那么会默认创建,然后将当前服务放进去,作为一个实例instance)
        group: g002 #服务注册到哪个组
        namespace: 4769ae11-993a-40e4-9b02-b3190ad3baf9  #注册到nacos中的命名空间位置
        metadata: {"nickname":"服务1","hot":"1000"}
        metadata:
          nickname: 服务1
          hot: 100
#server
server:
  port: 11106


  1. 代码修改配置
import com.alibaba.cloud.nacos.ConditionalOnNacosDiscoveryEnabled;
import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
import com.alibaba.cloud.nacos.discovery.NacosWatch;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.cloud.client.CommonsClientAutoConfiguration;
import org.springframework.cloud.client.discovery.simple.SimpleDiscoveryClientAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.text.SimpleDateFormat;
import java.util.*;

/**
 * nacos客户端注册至服务端时,更改服务详情中的元数据
 */
@Configuration
@ConditionalOnNacosDiscoveryEnabled
@AutoConfigureBefore({SimpleDiscoveryClientAutoConfiguration.class, CommonsClientAutoConfiguration.class})
public class NacosDiscoveryClientConfiguration {
    @Value("${spring.application.name}")
    private String applicationName;

    @Bean
    @ConditionalOnMissingBean
    @ConditionalOnProperty(value = {"spring.cloud.nacos.discovery.watch.enabled"}, matchIfMissing = true)
    public NacosWatch nacosWatch(NacosDiscoveryProperties nacosDiscoveryProperties) {
        //更改服务详情中的元数据,增加服务注册时间
        nacosDiscoveryProperties.getMetadata().put("startup.time", new SimpleDateFormat("yyyy-MM-dd HH🇲🇲ss").format(new Date()));
        return new NacosWatch(nacosDiscoveryProperties);
    }

}