nacos详解
-
概念:动态服务发现,配置管理和服务管理平台,即注册中心+配置中心的结合
官网文档:https://nacos.io/zh-cn/index.html
github文档:https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html#_spring_cloud_alibaba_nacos_discovery -
安装运行
- 下载nacos https://github.com/alibaba/nacos/releases
- windows启动 startup.cmd -m standalone
- 默认密码都是nacos
-
实际应用
-
导入pom文件
主模块pom
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.1.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency>
应用模块pom
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
-
配置服务提供者/服务调用者yml文件
spring: application: name: nacos-order-consumer cloud: nacos: discovery: server-addr: localhost:8848 # 指定nacos地址 cluster-name: HZ # 集群名称,配置实例集群属性 ephemeral: false # 设置为非临时实例 非临时实例nacos主动问询服务是否可用,服务不可用也不会被剔除
-
启动类
//添加注解 @EnableDiscoveryClient
-
服务消费者端添加调用负载均衡(注意2021版本后nacos放弃默认集成Ribbon)
@Configuration public class ApplicationContextConfig { @Bean @LoadBalanced public RestTemplate getRestTemplate() { return new RestTemplate(); } }
-
-
nacos和cap
- C是所有节点在同一时间看到的数据是一致的;而A的定义是所有的请求都会收到响应。
-
nacos和eureka比较
-
nacos服务分级存储模型
服务-->集群-->实例
- 服务跨集群调用问题:服务调用尽可能选择本地集群服务,跨集群调用延迟较高,本地集群不可用情况下才去考虑其他集群
当服务提供者实例和服务调用者实例配置到同一个集群中,可以通过调用负载均衡规则优先选择本地集群(本地集群实例随机访问),如果调用的本地集群全部不可访问,会访问外部集群,并产生一个访问外部集群的警告
更改负载均衡规则(通过配置文件方式)
springcloud-nacos-provider: # nacos中的服务id
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule #设置负载均衡策略 优先选择本地集群
-
服务实例权重设置:
nacos控制台可以设置实例的权重值,0~1之间,同一集群的多个实例权重值越高被访问频率越高,权重设置为0则完全不会被访问
设置为0的时候不会被调用访问,可以在系统升级的时候,把一个实例设置为0,这样用户就不会访问,调用者逐渐停止访问后可以重启升级,待升级完成后,先设置较小权重,放进少部分用户查看升级效果,后逐渐提高权重到正常,实现平滑用户无感知升级。
-
nacos作为服务配置中心应用
目的:统一服务配置文件,做热更新
-
pom文件引入
<!--nacos-config--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
Nacos在项目初始化的时候,要保证先从配置中心进行配置拉取,springboot配置文件加载存在优先级,bootstrap优先级高于application,所以nacos信息配置在bootstrap.yml配置文件中
-
yml配置
# nacos配置 server: port: 3377 spring: application: name: nacos-config-client cloud: nacos: discovery: server-addr: localhost:8848 #Nacos服务注册中心地址 config: server-addr: localhost:8848 #Nacos作为配置中心地址 file-extension: yaml #指定yaml格式的配置 group: DEV_GROUP namespace: 7d8f0f5a-6a53-4785-9686-dd460158e5d4 # 不同命名空间服务访问不到,用来做环境隔离 # ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension} # nacos-config-client-dev.yaml
nacos匹配公式{spring.profile.active}.${spring.cloud.nacos.config.file-extension}
-
配置中心分类配置
-
需要解决的问题:在实际项目中通常一个设备会有dev开发环境,test测试环境,prod生产环境如何保证指定环境启动时服务能正确读取到nacos上相应的环境配置文件?
而在上面各种环境中,一个微服务项目又会有许多微服务子项目,如何保证不同的微服务子系统在不同的环境下进行配置管理
-
通过NameSpace+Group+DataId来区分
最外层的NameSpace可以用来区分部署环境,Grop和DataID逻辑上区分两个目标对象
默认情况下Namespace=public,Group=DEFAULT_GROUP, 默认Cluster是DEFAULT
NameSpace
:用来隔离开发、测试、生产等环境,默认是publicGroup
:默认是DEFAULT_GROUP,Group可以把不同的微服务划分到同一个分组里面去Service
:就是微服务;一个Service可以包含多个Cluster(集群),Nacos默认Cluster是DEFAULT,Cluster是对指定微服务的一个虚拟划分。
-
三种方案加载配置
-
DataId方案:利用spring.profile.active和配置文件的DataId来使不同环境下读取不同配置
spring: profiles: active: dev # 表示开发环境 #active: test # 表示测试环境 #active: info
-
Group方案:通过Group实现环境区分
NameSpace方案:通过新建不同的NameSpace根据命名空间id来区分
-
-
-
多环境配置共享
- 多环境配置读取
-
多环境配置如果共同配置了同一属性,则远端单一环境优先级大于多环境配置共享大于本地环境配置文件
优先级排序:[服务名称]-[环境].yaml>服务名称.yaml>本地配置
自动刷新
在业务类中使用
@RefreshScope
//支持Nacos的动态刷新功能,并根据@Value直接获取修改nacos中的yaml配置文件再次调用使用到配置文件的接口的时候发现已经刷新
第二种方式 @ConfigurationProperties
@Data @Component @ConfigurationProperties(prefix = "pattern") //通过prefix + 常量方式将配置文件中的值注入到常量中,当nacos配置更改的时候自动刷新 public class PatternProperties { private String dataformat; } //通过@Component方式加入容器,用的时候通过@Autowired注入
nacos会记录历史配置文件30天,此外还有一键回滚功能,回滚操作时触发配置刷新
-
Nacos集群和持久化配置
官网说明文档:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
-
架构图(非官网,官网架构图和三种集群方式可以去官网查看)
默认Nacos使用嵌入式数据库实现数据的存储。所以,如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的,为了解决这个问题,Nacos采用了 集中式存储的方式来支持集群化部署。
-
Nacos默认的数据库切换到mysql(默认数据库是嵌入式数据库derby)
-
官网中找到sql执行语句:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
或者 https://github.com/alibaba/nacos/blob/master/distribution/conf/mysql-schema.sql
-
在conf文件夹下找到application.properties 地址 https://github.com/alibaba/nacos/blob/master/distribution/conf/application.properties
spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql:// 127.0.0.1:3306/nacos_config? characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user=root db.password=123456
-
-
Linux中Nacos+Mysql生产环境部署
1.环境:一个nginx+三个nacos注册中心+mysql
sql脚本在conf文件夹下nacos-mysql.sql在数据库中执行
修改conf下的application.properties文件,编写数据库连接信息
通过hostname -i 确定nacos所在环境ip
根据conf下的cluster.conf.example 拷贝出 cluster.conf ,编辑cluster.conf 注掉或者删掉原有的ip,编写nacos服务所在的ip和端口
- 编辑bin目录下startup.sh使其接受不同启动端口(./startup.sh -p 3333 启动3333nacos服务端口)修改startup.sh文件(所有文件修改前一定要做基础备份)
启动三个:./startup.sh -p 3333 ./startup.sh -p 4444 ./startup.sh -p 5555
修改nginx配置文件
- 指定nginx配置文件启动