版本说明:本次使用的是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对象
待补充
服务配置中心和服务注册中心