springboot整合nacos实现配置中心和注册中心

666 阅读2分钟

版本说明:本次使用的是nacos2.0的版本

Nacos2.0版本相比1.X新增了gRPC的通信方式

Nacos2.0的服务端完全兼容1.X客户端。也就是说可以用1.x或者2.x的客户端去访问2.0的服务端
Nacos2.0客户端由于使用了gRPC,无法兼容Nacos1.X服务端,
请勿使用2.0以上版本客户端连接Nacos1.X服务端。

官网给出的建议

能否支持Nacos旧版本客户端?

配置中心兼容支持Nacos1.0起的所有版本客户端,服务发现兼容Nacos1.2起所有版本客户端。 因此建议使用Nacos1.2.0之后版本客户端。 但nacos1.X的客户端不具有长连接能力,因此仍然建议使用Nacos2.0客户端。

先使用,后原理,实用为王

1.部署启动nacos步骤

单机模式启动nacos 这里下载的版本为nacos2.1.2。
1.去官网下载压缩包nacos-server-2.1.2.zip
2.解压缩后,先执行初始化sql脚本,完成元数据数据库初始化,脚本文件位置config路径下
nacos-server-2.1.2\nacos\conf\mysql-schema.sql
3.修改配置文件application.propertites,指向刚才的数据库,配置如下

### If use MySQL as datasource:
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://10.10.20.50:3306/nacos212?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=123456

4执行启动文件  单机模式启动
startup.cmd -m standalone

springboot的配置迁移到nacos上

引入maven依赖

版本 [0.2.x.RELEASE]对应的是 Spring Boot 2.x 版本,
版本 [0.1.x.RELEASE] 对应的是 Spring Boot 1.x 版本。
      <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>nacos-config-spring-boot-starter</artifactId>
            <version>0.2.10</version>
        </dependency>
进入到nacos-config-spring-boot-starter的pom文件中会发现0.2.10版本最佳适配的springboot版本是
2.0.3.RELEASE,引入的nacos-client版本是2.0.2
 <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
      <version>2.0.3.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.alibaba.nacos</groupId>
      <artifactId>nacos-spring-context</artifactId>
      <version>1.1.1</version>
      <scope>compile</scope>
      <exclusions>
        <exclusion>
          <artifactId>nacos-client</artifactId>
          <groupId>com.alibaba.nacos</groupId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>com.alibaba.nacos</groupId>
      <artifactId>nacos-client</artifactId>
      <version>2.0.2</version>
      <scope>compile</scope>
    </dependency>

进行配置

##apllication.properties中新增配置
nacos.config.server-addr=10.10.20.47:8848

nacos.config.server-addr指定配置中心的地址

使用注解NacosPropertySource

    @NacosPropertySource(dataId = "example.properties", autoRefreshed = true)

意味着项目启动要去配置中(nacos.config.server-addr)加载dataId为(example.properties)中的配置,autoRefreshed表示动态刷新功能开启

读取配置 @NacosValue注解可以读取到配置中心的配置

 @NacosValue(value = "${person.name:wang}", autoRefreshed = true)
 private String personName;

服务注册发现

引入maven依賴

 <!--注册中心 starter-->
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>nacos-discovery-spring-boot-starter</artifactId>
            <version>0.2.10</version>
        </dependency>

同样注册中心的依赖中 springboot的最佳适配是2.0.3.RELEASE,nacos-client的最佳适配是2.0.2

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
      <version>2.0.3.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.alibaba.nacos</groupId>
      <artifactId>nacos-spring-context</artifactId>
      <version>1.1.1</version>
      <scope>compile</scope>
      <exclusions>
        <exclusion>
          <artifactId>nacos-client</artifactId>
          <groupId>com.alibaba.nacos</groupId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>com.alibaba.nacos</groupId>
      <artifactId>nacos-client</artifactId>
      <version>2.0.2</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.alibaba.boot</groupId>
      <artifactId>nacos-discovery-spring-boot-autoconfigure</artifactId>
      <version>0.2.10</version>
      <scope>compile</scope>
    </dependency>

进行配置

##apllication.properties中新增配置
spring.application.name=hello-world
nacos.discovery.server-addr=10.10.20.47:8848
nacos.discovery.auto-register=true

spring.application.name注册的服务名称

nacos.discovery.server-addr注册中心地址

nacos.discovery.auto-register 开启自动注册功能,必须设置

观察启动日志 发现服务注册成功

2022-11-27 20:48:18.100  INFO 13476 --- [           main] c.a.b.n.d.a.NacosDiscoveryAutoRegister   : Finished auto register service : hello-world, ip : 10.10.20.47, port : 7777

获取服务instance 使用@NacosInjected注解注入NamingService对象,NamingService可以根据服务名称获取服务实例,那么应该如何实现服务的负载均衡呢?

    @NacosInjected
    private NamingService namingService;

    @RequestMapping(value = "/discovery", method = RequestMethod.GET)
    @ResponseBody
    public List<Instance> get(@RequestParam String serviceName) throws NacosException {
        List<Instance> allInstances = namingService.getAllInstances(serviceName);
        for (Instance instance: allInstances){
            System.out.println(instance.getIp());
            System.out.println(instance.getPort());
        }
        return allInstances;
    }

原理 @NacosPropertySource

待补充

原理 @NacosValue

待补充

原理 自动注册原理

待补充

@NacosInjected注解注入NamingService对象

待补充

服务配置中心和服务注册中心