Nacos服务改造
-
启动nacos 实例
-
添加nacos的依赖
-
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-loadbalancer</artifactId> </dependency>
-
-
在application.yml中添加配置信息
-
Spring:application:name: course-agg-servicecloud:nacos:discovery:server-addr: 192.168.200.130:8848
-
1Nacos的保护阈值
保护阈值:为了防止因过多实例故障,导致所有流量全部流入剩余健康实例,继而造成流量压力将剩余健康实例被压垮形成雪崩效应。应将健康保护阈值定义为一个0到1之间的浮点数。当域名健康实例数占总服务实例数的比例小于该值时,无论实例是否健康都会将这个(健康或不健康的)实例返回给客户端。这样做虽然损失了一部分流量,但是保证了集群中剩余健康实例能正常工作。
假设生产中部署了100台服务实例,假设有90台故障,正常逻辑是从90台从注册表中剔除,剩下10台去承担所有的流量,有可能发生雪崩,整个服务都会停止
2Nacos负载均衡
3服务的数据隔离模型
namespace+group+service:就可以定位到一个具体的服务
- 命名空间:Nacos数据模型中最顶层的也是包含范围最广的概念,用于在类似环境或租户等需要强制隔离的场景中定义,Nacos的服务也需要使用命名空间来进行隔离
- 分组(Group):Nacos数据模型中次于命名空间的一种隔离概念,区别于命名空间的强制隔离属性,分组属于一个弱隔离概念,主要用于逻辑区分不同的服务
- 服务名:该服务实例的名字,一般描述该服务提供了某个功能或者能力
在application.yml下进行配置,将生成的命名空间ID进行配置
4Nacos作为配置中心
通过Namespace-Group-DataId,做唯一标识,会在项目启动时区配置中心拉取配置文件
(1) 新建配置中心
(2) 新增配置信息
server:port: 10000
Spring:application:name: course-agg-servicecloud:nacos:config:server-addr: 192.168.200.130:8848namespace: ce6fa22e-fc35-4fd3-9568-2cf609059088group: JIAGOU_GROUPfile-extension: yamlprefix: ${Spring.application.name}profiles:active: dev
在本地配置文件中,仅仅保留启动和配置管理所必须得配置项目即可,
在启动服务时,Nacos Config Client会向注册中心发起请求获取指定DataId所对应的配置集,需要将application.yml改为bootstrap.yml
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
(3)在Nacos面板新建配置集
5不停机的动态刷新
案例代码:
@RestController
@RequestMapping("/api/Refresh")
@RefreshScope
public class DynamicRefreshController {@Value("${url}")private String url;@GetMapping("/getUrl")public String getUrl(){return url;}
}
原理分析:
@RefreshScope是SpringCloud提供的一个注解,用于标注SpringBean,使其在配置发生变化时能够自动刷新,核心原理如下:
- 代理模式:被@RefreshScope标记的Bean会创建一个代理对象,这个代理对象会在运行时获取最新的配置值
- 缓存机制:SpringCloud内部维护一个缓存,用于存储被@RefreshScope标记的Bean,当配置变化时,会销毁Bean实例,并在下次访问时重新创建
- 事件机制:SpringCloud提供了一个ContextRefresher类,用于触发上下文刷新事件,当配置发生变化时,SpringCloud会发布一个RefreshScopeRefreshedEvent时间,通知所有的监听器进行相应的处理
7.6共享配置
(1) 抽取出来一个公共配置
(2)让他生效并且支持自动刷新
shared-configs: # 共享配置且支持自动刷新- data-id: nacos-common.yamlgroup: JIAGOU_GROUPrefresh: true
7.7多环境配置的切换方案
配置多个命名空间进行配置隔离
在配置列表中克隆多个配置,并在yaml文件中进行动态切换
server:port: 10000
Spring:application:name: course-agg-servicecloud:nacos:config:server-addr: 192.168.200.130:8848namespace: 8d0561ce-6e19-457a-9f77-ce201e3cb98e # 此时是生产环境的命名空间group: JIAGOU_GROUPfile-extension: yamlprefix: ${Spring.application.name}shared-configs: # 共享配置且支持自动刷新- data-id: nacos-common.yamlgroup: JIAGOU_GROUPrefresh: true