Nacos注册中心
Nacos服务分级存储模型
- 一级是服务,例如userservice
- 二级是集群,例如杭州或上海
- 三级是实例,例如杭州机房的某台部署了userservice的服务器
服务跨集群调用问题
服务调用尽可能选择本地集群的服务,跨集群调用延迟较高本地集群不可访问时,再去访问其它集群
服务集群属性
修改application.yml,添加如下内容
spring:
datasource:
url: jdbc:mysql://localhost:3306/cloud_order?serverTimezone=GMT%2B8&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
application:
name: userServer
cloud:
nacos:
server-addr: localhost:8848
#配置集群名称,也就是机房位置,例如:HZ,杭州
discovery:
cluster-name: HZ
根据集群负载均衡
配置yml文件
userService:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
根据权重负载均衡
在Nacos中后台配置权重 0-1 ,权重越大访问频率越高
环境隔离
Nacos中使用namespace进行环境隔离
在yml中加入配置选项
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: SH
namespace: 452e6df5-0717-48db-9020-1f4439f96d6e #命名空间的ID
Nacos配置管理
1.1.统一配置管理
1.1.1.在nacos中添加配置文件
在Nacos中的配置列表中新建配置
注意:项目的核心配置,需要热更新的配置才有放到nacos管理的必要。基本不会变更的一些配置还是保存在微服务本地比较好。
1.1.2.从微服务拉取配置
微服务要拉取nacos中管理的配置,并且与本地的application.yml配置合并,才能完成项目启动。
但如果尚未读取application.yml,又如何得知nacos地址呢?
因此spring引入了一种新的配置文件:bootstrap.yaml文件,会在application.yml之前被读取,流程如下:
1)引入nacos-config依赖
首先,在user-service服务中,引入nacos-config的客户端依赖:
<!--nacos配置管理依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2)添加bootstrap.yaml
然后,在user-service中添加一个bootstrap.yaml文件,内容如下:
spring:
application:
name: userservice # 服务名称
profiles:
active: dev #开发环境,这里是dev
cloud:
nacos:
server-addr: localhost:8848 # Nacos地址
config:
file-extension: yaml # 文件后缀名
这里会根据spring.cloud.nacos.server-addr获取nacos地址,再根据
${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}作为文件id,来读取配置。
本例中,就是去读取userservice-dev.yaml:
3)读取nacos配置
在user-service中的UserController中添加业务逻辑,读取pattern.dateformat配置:
1.2 Nacos实现热更新
通过@RefreshScop 或者 @ComponentProperties()实现
- 在类的方法上新增@RefreshScop属性
- 新增配置类,添加@ConfigurationProperties(prefix = “key”)
1.3.配置共享
其实微服务启动时,会去nacos读取多个配置文件,例如:
[spring.application.name]-[spring.profiles.active].yaml
,例如:userservice-dev.yaml[spring.application.name].yaml
,例如:userservice.yaml
而[spring.application.name].yaml
不包含环境,因此可以被多个环境共享。