SpringCloud-Nacos:服务注册+配置中心
SpringCloud-Nacos:服务注册+配置中心
1.下载安装包
在Nacos的GitHub页面,提供有下载链接,可以下载编译好的Nacos服务端或者源代码:
GitHub主页:https://github.com/alibaba/nacos
GitHub的Release下载页:https://github.com/alibaba/nacos/releases
2.解压
解压后在bin目录下打开cmd,输入
1
| startup.cmd -m standalone
|
启动nacos,默认用户名和密码都是nacos
nacos默认端口是8848
3.
在项目的父级pom加入springCloud的alibaba依赖
1 2 3 4 5 6 7
| <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.5.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency>
|
再需要使用nacos管理的微服务中加入nacos客户端依赖,并注释eruka的依赖
1 2 3 4 5
| <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
|
再application.yml文件中加入nacos配置
1 2 3 4 5 6 7 8 9 10 11 12
| spring: datasource: url: jdbc:mysql://localhost:3306/cloud_order?useSSL=false username: root password: root driver-class-name: com.mysql.jdbc.Driver application: name: orderservice cloud: nacos: server-addr: localhost:8848
|
启动项目

4.设置集群
在application.yml文件中设置集群名称
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| spring: datasource: url: jdbc:mysql://localhost:3306/cloud_order?useSSL=false username: root password: root driver-class-name: com.mysql.jdbc.Driver application: name: orderservice cloud: nacos: server-addr: localhost:8848 discovery: cluster-name: HZ
|
当多个实例想设置多个集群时,可以在不同实例中设置不同的集群并重启对应实例

orderservice使用restTemplate实现负载均衡
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } public Order queryOrderById(Long orderId) { Order order = orderMapper.findById(orderId);
String url = "http://userservice/user/" +order.getUserId(); User user = restTemplate.getForObject(url, User.class); order.setUser(user); return order; }
|
通过在orderservice配置文件中配置集群访问的策略,实现负载均衡优先使用同局域网下的集群用例
1 2 3 4
| userservice: ribbon: NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
|



优先访问了同集群下的8081和8082端口的服务,8083不访问,当同集群下的服务挂了才去访问
5.设置开发环境
使用nacos的命名空间,将服务部署到开发环境,不会影响生成环境

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| spring: datasource: url: jdbc:mysql://localhost:3306/cloud_order?useSSL=false username: root password: root driver-class-name: com.mysql.jdbc.Driver application: name: orderservice cloud: nacos: server-addr: localhost:8848 discovery: cluster-name: HZ namespace: e915565d-ba06-4c02-823a-62bea0e82947
|
namespace对应的是生成的命名空间id, orderservice启动后就会把服务部署到dev环境,orderservice的服务便不会访问到public空间下的服务了(隔离)
6. 配置配置中心
(配置中心需要先把服务注册上一次,再使用bootstrap.yml文件配置)
在nacos中新建配置文件,DataID格式为 服务名-环境.yaml

因为实现配置中心必须spring需要先获取nacos配置才再去获取application.yml,获取nacos配置需要在读取application.yml之前完成,因此将nacos的配置信息放在bootstrap.yml中(读取优先级比application.yml更高)
bootstarp.yml
1 2 3 4 5 6 7 8 9 10 11
| spring: application: name: userservice profiles: active: dev cloud: nacos: server-addr: localhost:8848 config: file-extension: yaml
|
并把application中的nacos信息去掉
测试:

结果:

实现配置的热更新:
方式一:
在@Value注入的变量所在的类上添加注解@RefreshScope



实现日期格式热更新
方式二:
使用@ConfigurationProperties注解 写一个配置类或者相关配置
1 2 3 4 5 6 7
| @Data @Component @ConfigurationProperties(prefix = "pattern") public class PatternProperties { private String dateoformat; }
|
获取配置信息

7. 配置文件多环境共享
nacos在启动时会加载配置中心的两种类型的配置文件
- 服务名+环境.文件后缀
- 服务名.文件后缀
因此可以配置userservice.yaml作为userservice的多环境共享配置文件

在PatternProperties类中增加字段envShareValue

编写测试接口

将8082的userservice服务设为test环境作为对比

结果:dev环境下可以访问到全部,test只能访问到共享的配置文件

