微服务学习04——Nacos
Nacos注册中心Nacos是阿里巴巴的产品,选择是SpringCloud中的一个组件,比Eureka组件功能更加丰富Nacos需要下载安装才能使用GitHub的Release下载页:https://github.com/alibaba/nacos/releasesNacos环境搭建下载安装包解压文件在bin目录下,直接在地址栏输入cmd命令打开,输入startup.cmd -m standalo
Nacos注册中心
Nacos是阿里巴巴的产品,选择是SpringCloud中的一个组件,比Eureka组件功能更加丰富
Nacos需要下载安装才能使用
GitHub的Release下载页:https://github.com/alibaba/nacos/releases
Nacos环境搭建
- 下载安装包
- 解压文件
- 在bin目录下,直接在地址栏输入cmd命令打开,输入startup.cmd -m standalone运行
项目搭建
- 在微服务的父工程中添加spring-cloud-alibaba的管理依赖
<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>
-
在微服务的pom文件中添加nacos的客户端依赖
<!-- nacos客户端依赖包 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
注意,如果使用nacos则需要把Eureka的依赖包注释掉
-
配置application.yml文件
spring: cloud: nacos: server-addr: localhost:8848 #nacos服务地址
这里也要注释掉eureka的配置信息
Nacos服务分解储存模型
这个看见有个文章写的不错,就直接引用了Nacos服务分级存储模型、集群、负载均衡 - 一杯水M - 博客园
修改一下yml配置文件即可
a、修改服务端口server.port=8083 b、设置spring.cloud.nacos.discovery.cluster-name=HZ or SH 这里修改的是集群名称 c、启动服务,如:UserApplication.java
Nacos负载均衡策略
NacosRule负载均衡策略:优先选择本地集群,在本地集群采取随机方式访问的方式,如果本地集群服务器挂掉,再去访问其他地区的集群
配置,在yml文件中改一下负载均衡策略
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule #负载均衡规则--优先选择本地集群,在本地集群采取随机方式访问
Nacos权重策略:服务器的权重越高,被访问的频率越高
在浏览器登录nacos,直接在nacos的控制台编辑,设置服务器权重
Nacos环境隔离
Nacos中服务储存和数据存储的最外层都是一个名为namespace的东西,用来做最外层隔离
- 每个namespace都有唯一的id
- 不同的namespace下的服务不可见(也就是不能相互访问)
具体步骤
- 在nacos控制台新建命名空间
- , 在yml文件中配置,添加一个namespace,内容填写命名空间的id,配置完重启服务
cloud: nacos: server-addr: localhost:8848 #nacos服务地址 discovery: cluster-name: HZ #集群名称 namespace: b6f39d45-2e10-483b-af01-f2ea27f09cdc #命名空间的id 把该服务归类到另一个命名空间
隔离后不同的命名空间不可再相互访问
临时实例
临时的实例,后期可以手动停掉该服务的实例
在yml文件中配置
cloud:
nacos:
server-addr: localhost:8848 #nacos服务地址
discovery:
cluster-name: HZ #集群名称
namespace: b6f39d45-2e10-483b-af01-f2ea27f09cdc #命名空间的id 把该服务归类到另一个命名空间
ephemeral: true #是否是临时实例
Nacos和Eureka的区别
相同点
- 都支持服务注册和服务拉取
- 都支持服务提供者心跳方式做健康检测(由服务提供者定期主动发送请求告知注册中心)
区别
- Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式(该模式效应速度快,但是会增大Nacos中心的工作压力)
- 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
- Nacos支持服务列表变更的推送模式,服务列表更新更及时
- Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;eureka采用AP方式
Nacos配置管理
nacos除了拥有Eureka的注册发现之外,还有配置管理功能,可以实现配置的热更新
配置管理的添加:在nacos控制台添加配置列表里添加新的配置,Data Id由服务名-环境.配置文件后缀名 组成
添加好配置后,项目启动读取配置文件应该先读取我们新添加的配置文件,再加载application.yml文件,所以需要把application.yml中的nacos地址给提取到一个新的文件,即优先级更高的bootstrap.yml文件,顺序如下:
项目启动——读取nacos中的配置文件(新建bootstrap.yml文件)——读取本地配置文件application.yml——创建spring容器——加载Bean
步骤如下:
- 引入Nacos的配置管理依赖
<!--nacos的配置管理依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
-
在项目resource目录添加一个bootstrap.yml文件,该文件优先级更高,优于application.yml文件先加载,配置如下内容
spring: application: name: userservice #服务名称 profiles: active: dev #环境 cloud: nacos: server-addr: localhost:8848 #nacos地址 config: file-extension: yaml #文件后缀名 服务名称+环境+文件后缀名决定了data id
这里的配置信息和我们在nacos控制台添加的配置的data id名字相对应
通过上诉步骤即可完成nacos简单的配置管理功能
Nacos热更新
热更新即在修改了nacos控制台的配置文件信息后,无需重启服务即可实现配置更新
实现热更新有两种方式
- 直接在类上添加@RefreshScope注解,实现自动更新,这里以之前配置的dateformat为例
@RequestMapping("/user") @RefreshScope //实现nacos热更新注解 public class UserController { @Autowired private UserService userService; @Value("${pattern.dateformat}") private String dateformat; @GetMapping("now") public String now(){ return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat)); ); } }
-
通过@ConfigurationProperties注入,自动刷新,新建一个PatternProperties类
@Data @Component @ConfigurationProperties(prefix = "pattern") //prefix = "pattern"表示所有以pattern开头的内容都实现自动更新 public class PatternProperties { private String dateformat; }
在控制层注入该类,实现自动更新
@Slf4j @RestController @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @Autowired private PatternProperties patternProperties;//注入刚刚新建的类 @Value("${pattern.dateformat}") private String dateformat; @GetMapping("now") public String now(){ return LocalDateTime.now().format(DateTimeFormatter.ofPattern(patternProperties.getDateformat())); } } }
多环境配置共享
把一些共有的配置放在共享环境里面,这样所有的环境都可以读到该配置
该配置的data id为 服务名称.后缀 例如:userservice.yaml 该配置不受环境限制,可以实现属性共享
@Data
@Component
@ConfigurationProperties(prefix = "pattern") //prefix = "pattern"表示所有以pattern开头的内容都实现自动更新
public class PatternProperties {
private String dateformat;
private String envSharedValue;//添加一个属性
}
@RestController
@RequestMapping("/user")
@RefreshScope //实现nacos热更新注解
public class UserController {
@Autowired
private UserService userService;
@Autowired
private PatternProperties patternProperties;
@GetMapping("prop")
public PatternProperties patternProperties(){
return patternProperties;
}
多种配置的优先级:
服务名-环境.yaml>服务名.yaml>本地配置
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)