服务治理-Nacos
Nacos下载: mac下第一个 windows下的二个
下载地址:https://github.com/alibaba/nacos/releaseshttps://github.com/alibaba/nacos/releases
-
进入安装路径的bin目录,通过cmd命令行输入
startup.cmd -m standalone
即可启动 -
访问控制台现实的nacos管理页面,完成登录:
用户名和密码:nacos
那么之前我们是用的Eureka进行的服务注册,现在使用Nacos进行相同的功能使用。
修改提供者和消费者中的依赖和配置文件。
① 在pom文件中引入nacos-discovery依赖,==注释掉eureka的依赖==
<!--nacos注册中心客户端依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
② 在application.yml中添加nacos地址,==注释掉eureka相关配置==
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848 # 连接nacos注册中心
然后重启一下微服务,既然我们不使用Eureka了,那么Eureka的服务就不需要再启动了。
然后就可以进行访问测试了。
服务分级存储
这里的分级存储实际上就是增加的分类的类别,我们目前讨论的就只有微服务的区别,提供者和消费者,这里的分级存储又引入了服务集群的概念,一个服务可以有多个集群,这里就以地方作为分类类别,同一个服务可以在北京有一个服务集群,也可以在上海有一个服务集群。
服务调用尽可能选择本地集群的服务,跨集群(区域)调用延迟较高 。
① 将部分微服务配置到北京集群
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
cluster-name: BJ # 服务所在集群名称
② 新建1个user微服务配置到上海集群
-Dserver.port=8083 -Dspring.cloud.nacos.discovery.cluster-name=SH
③ 启动三个服务,并访问注册中心观察
④ 修改order-service的负载均衡策略
Ribbon默认的策略并不能实现根据同集群优先来实现负载均衡,需要切换成Nacos中的一个NacosRule
来实现。
user-service: # 给某个微服务配置负载均衡规则,这里是user-service服务
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
⑤ 访问测试
多访问几次消费者,就会发现,提供者中,会优先查询相同集群下的微服务,而不会跨域查询另一个集群下的微服务,除非本集群中所有的提供者都失效了,才会去访问非同一集群下的提供者
权重配置
nacos支持权重配置来控制不同实例的访问频率,权重越大则访问频率越高。0 <= 权重值 <= 1
临时节点
Nacos的服务实例分为两种类型:
-
临时实例:如果实例宕机超过一定时间,会从服务列表剔除,默认的类型。
-
非临时实例:如果实例宕机,不会从服务列表剔除,也可以叫永久实例。
验证:停止掉8082端口,实例会从列表删除
配置一个服务实例为永久实例:
spring: cloud: nacos: discovery: ephemeral: false # 设置为非临时实例
-Dserver.port=8082 -Dspring.cloud.nacos.discovery.ephemeral=false
重启服务,查看Nacos服务列表,可以看到已经不是临时节点
临时和持久化的区别主要在健康检查失败后的表现,
==持久化实例健康检查失败后会被标记成不健康,而临时实例会直接从列表中被删除==
对于临时实例,健康检查失败,则直接可以从列表中删除。这种特性就比较适合那些需要应对流量突增的场景,服务可以进行弹性扩容。当流量过去之后,服务停掉即可自动注销了。
对于持久化实例,健康检查失败,会被标记成不健康状态。它的好处是运维可以实时看到实例的健康状态,便于后续的警告、扩容等一些列措施。
Nacos和Eureka的区别
Nacos和Eureka整体结构类似,服务注册、服务拉取、心跳等待,但是也存在一些差异:
模块 | Nacos | Eureka | 说明 |
---|---|---|---|
注册中心 | 是 | 是 | 服务治理基本功能,负责服务中心化注册 |
配置中心 | 是 | 否 | Eureka需要配合Config实现配置中心,且不提供管理界面 |
动态刷新 | 是 | 否 | Eureka需要配合MQ实现配置动态刷新,Nacos采用Netty保持TCP长连接实时推送 |
可用区AZ | 是 | 是 | 对服务集群划分不同区域,实现区域隔离,并提供容灾自动切换 |
分组 | 是 | 否 | Nacos可用根据业务和环境进行分组管理 |
元数据 | 是 | 是 | 提供服务标签数据,例如环境或服务标识 |
权重 | 是 | 否 | Nacos默认提供权重设置功能,调整承载流量压力 |
健康检查 | 是 | 是 | Nacos支持由客户端或服务端发起的健康检查,Eureka是由客户端发起心跳 |
负载均衡 | 是 | 是 | 均提供负责均衡策略 |
管理界面 | 是 | 否 | Nacos支持对服务在线管理,Eureka只是预览服务状态 |
环境隔离:
Nacos的环境隔离中有命名空间和分组的概念,那么不同的命名空间之间的服务是不能相互调用的。默认不配的话就是在public命名空间,DefaultGroup分组下。
不同环境之间隔离:
-
Namespace —> 不同环境
-
Group —> 不同项目 / 模块
-
Data Id —> 不同配置文件
第四步这里,除了可以添加命名空间,还可以添加分组,创建分组之后,在namespace之后配置分组即可:
spring:
application:
name: user-service
# profiles:
# active: test # 指定环境
cloud:
nacos:
config:
server-addr: localhost:8848 # nacos 配置中心地址
file-extension: yaml # 文件扩展名
namespace: f81a11fe-73f4-4dff-b70d-04009fa36710 # 指定namespace的id
group: USER_GROUP # 指定组名
配置完成后,重启服务,服务注册信息就会跑到对应的命名空间下 。此时,两个不同命名空间中的微服务就不能再相互调用了。所以我们明白,要想让服务可以相互访问要放到相同的环境下。
Nacos配置管理
Nacos除了可以做注册中心,同样可以做配置管理来使用。
统一配置管理
在nacos中添加配置
① 点击配置列表,添加新的配置信息
② 然后在弹出的表单中,填写配置信息
==注意:项目的核心配置,需要热更新的配置才有放到nacos管理的必要。基本不会变更的一些配置还是保存在微服务本地比较好。==
从微服务拉取配置
微服务要拉取nacos中管理的配置,并且与本地的application.yml配置合并,才能完成项目启动。
但如果尚未读取application.yml,又如何得知nacos地址呢?
因此springboot引入了一种新的配置文件:bootstrap.yml文件,它会在application.yml之前被读取,而且其内容优先级高于application.yaml
① 引入nacos-config依赖
在微服务中,引入nacos-config的客户端依赖:
<!--nacos配置管理依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
② 添加bootstrap.yml
在微服务中添加一个bootstrap.yml文件,内容如下:
spring:
application:
name: user-service
cloud:
nacos:
config:
server-addr: localhost:8848 # nacos 配置中心地址
file-extension: yaml # 文件扩展名
这里会根据spring.cloud.nacos.server-addr获取nacos地址,再根据
${spring.application.name}.${spring.cloud.nacos.config.file-extension}
作为文件==Data ID==,来读取nacos的配置。
③ 在代码中读取配置信息
在微服务中的使用到配置文件信息的地方添加业务逻辑,读取conf对象的相关配置
最后可以查看到读取到的配置信息,证明微服务的配置信息拉取成功。
配置热更新
局部热更新:方式一,搭配@Value使用
使用@RefreshScope
注解标注在使用配置信息的类上
全局热更新:方式二,搭配@ConfigurationProperties使用
先使用@ConfigurationProperties
注解将配置读取读取到一个对象上,然后在需要使用配置的类中注入配置对象
多环境共享配置:
这个图片中配置信息可以读到userservice-dev.yaml和userservice.yaml两个配置文件,问题来了!带后缀的和不带后缀的配置文件都读取到之后,使用哪个呢?万一代码中的application.yml中也有相同名称的配置信息,又该使用哪个呢?这里就涉及到优先级的问题:
当nacos、服务本地同时出现相同属性时,优先级有高低之分:
总结:
Nacos集群搭建:
Nacos集群搭建使用到了nginx的负载均衡。
这里就需要配置多台Nacos服务,并且修改端口号,不能全是8848,要修改成不一样的,然后供nginx做负载均衡。
配置多台Nacos,
搭建步骤:
1、搭建数据库,文件在nacos的conf文件中有
2、nacos的下载
在文章开头
3、配置nacos
复制三份nacos到非中文目录下,然后:
在这个配置文件中添加集群的地址信息:这里就是后面那三个
配置配置文件中mysql的信息:
到这里,将所有注释都去掉之后,保存关闭,完成nacos集群配置。
仍然在application.properties中修改端口
4、启动三台nacos 因为是集群模式启动,默认就是这个模式,所以命令就输入下面的就可以了
startup.cmd
5、配置nginx反向代理和负载均衡
6、启动nginx
然后访问localhost:80/nacos就能看到nacos的界面了
那么我们的JAVA代码中怎么配置呢?没那么麻烦,直接将原来的8848改成80就可以了
这样配置完成之后,再创建爱配置文件,配置文件的信息就会保存在mysql中的config_info表中,完成持久化。