当前位置: 首页 > news >正文

​《Nacos终极指南:集群配置+负载均衡+健康检查+配置中心全解析,让微服务稳如老狗!》​

在生产环境比较恶劣的情况下,我们需要通过负载均衡对服务的流量分散到多个服务器中,避免单点故障,而Nacos支持多种负载均衡策略,包括权重,同机房,同地域,同环境等。

1.服务下线

当一个节点上接口的性能较差时,我们可以第一时间对该节点进行下线,等排查完故障后,我们在上线该节点

操作步骤:详情->下线

下线端口号为9091的接口后,当再进行访问订单服务后,发现通过IDEA日志发现该服务没有接收到请求

再次点击上线端口为9091的节点,接着多次访问订单服务,观察运行日志,发现端口号为9091的节点又可以重新接收请求

2.权重配置 

2.1 权重配置 

除了下线接口性能较差的节点之外,我们还可以配置这个节点的流量权重

操作步骤:找到对应的节点->编辑->在弹出的窗口修改权重值 

2.2 开启Nacos的负载均衡策略

如果我们仅仅是在Nacos修改了权重配置,这样是不生效的。

因为Spring Cloud LoadBalance组件自身有负载均衡的配置方式,所以不支持Nacos的权重属性配置,我们需要开启Nacos的负载均衡策略,让权重配置生效

我们需要在服务消费者(订单服务)的配置文件中添加一下配置,如下图

 修改完配置后记得重新启动服务,然后继续多次访问订单服务,此时观察日志发现端口号为9090的节点接收到的请求流量就会明显减少

2.3 常见问题 

修改权重配置时,可能会出现下图的报错日志 

原因:Nacos采用raft算法来计算Leader,并且会计算前一次启动的集群环境,当服务器的IP改变时会导致raft记录的集群地址失效,导致Leader出现问题(网络环境发生变化时,IP地址可能会发生变化) 

 解决方法:删除Nacos根目录下data文件中的protocol文件夹中的raft文件夹,如下图

3.同集群优先访问 

Nacos把可以把同一个机房内的实例,划分为一个集群,所以同集群优先访问,在一定程度上也可以理解为同机房的实例优先访问

在微服务架构中,一个服务通常可以由多个实例共同提供服务,这些实例可以部署在不同的机器上,这些机器也可以分布在不同的机房,比如produc-service

实例1和实例2部署在上海机房,而实例3部署在北京机房

微服务访问时,应尽量访问同机房的实例,当本机房实例不可用时,才去访问其他机房的实例

比如order-service服务在上海机房,product-service在北京和上海都有实例,当使用订单服务时,希望优先访问上海机房,如果上海机房没有实力或者实例不可用,订单服务在去访问部署在上海机房的产品服务。

通常情况下,希望优先访问同一个机房间的服务,因为同一个机房属于一个局域网,局域网的访问速度更快一点

3.1 给实例配置集群名称 

通过在添加一下配置来实现

注意:也要添加配置开启Nacos的负载均衡策略,如果之前添加过开启Nacos负载均衡策略的配置,这次就不用再次配置了 

此时,就发现有一个product-service的实例是在名字为BJ的集群中的,而orders-service服务也是配置在BJ集群

此时,再去调用订单服务时,订单服务就会先优先访问与自己在同一个集群中的产品服务 

此时,在将端口号为9091和9092的产品服务放在SH集群中

通过观察Nacos主页发现成功将端口号为9091和9092的产品服务放在SH集群中,当我们将部署在BJ集群的产品服务下线后,这时候再去调用订单服务时,此时订单服务访问的就是部署在SH集群中的产品服务 

4.Nacos检查机制 

Nacos作为注册中心,需要感知服务的健康状态,才能为服务消费者提供良好的服务,Nacos中提供了两种健康检查机制:

1.客户端主动上报机制:

1.服务注册方通过上传心跳的上报方式告知Nacos注册中心自己的健康状态,默认心跳的间隔为5秒

2.如果Nacos在15秒内没有接收到来自服务注册方的心跳,会将该服务的健康状态设置为不健康状态,如果Nacos没有接收心跳的时间间隔超过30秒,Nacos就会将该注册的服务删除。

2.服务端反向探测机制:

1.Nacos主动探知客户端的健康状态,默认间隔为20秒

2.健康检查失败后对应注册在Nacos的服务会被标记为不健康的状态,不会立即被删除

但是Nacos中的健康检查机制不能主动设置,健康检查机制是和Nacos的服务实例类型强相关的 

4.1 Nacos服务类型实例 

Nacos的服务实例(注册的服务)分为临时实例和非临时实例 

临时实例:如果该注册的服务宕机超过一定时间,会从服务列表中删除,这是向Nacos注册服务时默认的实力类型

非临时实例:如果实例宕机,不会从服务列表中删除,也可以叫永久实例  

Nacos对临时实例采取的是客户端主动上报机制,对非临时实例采取服务端反向探测机制 

4.2 配置永久实例 

只需要给注册的服务类型添加一下配置即可 

重新启动服务,观察Nacos服务列表

去IDEA停止服务,再去观察Nacos服务列表,发现即使停止服务,注册在Nacos中的服务也不会从服务列表中删除

4.3 常见问题 

Nacos服务实例类型是不允许改变的,此时如果直接增加上面的配置,重新启动该服务,就会包下图的错误

原因:因为Nacos会记录每个实例的IP和端口号,当发现IP和端口号都没有发生变化时,Nacos不允许服务类型发生变化,比如从临时实例变为非临时实例,或者从非临时实例变成临时实例 

解决方法:

1,先停掉Nacos

2,删除nacos目录下的/data/protocol中的raft文件夹,raft文件夹里面会保存应用实例的元数据信息,注意如果你访问的是云服器上的Nacos,就去删云服务器上的raft文件夹,如果是本机上的Nacos,就去删除本机上的raft文件夹,路径都是一样的 

5. Nacos环境隔离

在开发中,一个服务会分为开发环境,测试环境和生产环境,我们希望开发环境的服务只能访问开发环境中的服务,不能跨环境访问 

Nacos中提供了namespace(命名空间)来实现环境的隔离,不同的namespace的服务之间不可相互访问 

先在Nacos创建几个环境,如下图 

新增命名空间

在服务列表页面就可以看到三个环境了

配置namespace 

namespace创建完成后,对服务进行配置 ,如下图

重新启动服务,发现两个服务都被部署在了test的环境下

进行测试:发现服务调用成功

测试不同环境下能否访问成功:

public环境下只有product-service服务 

dev环境下只有order-service 

此时去访问订单服务,会出现下图的报错

通过实验证明,在Nacos中,不同环境下的服务是不可相互调用的。 

6.Nacos配置中心 

除了注册中心和负载均衡之外,Nacos还是一个配置中心,具备配置管理的功能

为什么需要配置中心呢?

我们当前的代码有一个问题,就是我们的配置都是写在代码里面的,当我们需要对配置进行修改时,就要对代码的配置文件进行修改,然后重新打包和上线,且一个微服务中可能有成百个实例,挨个部署容易出错

配置中心就是对这些配置项进行统一管理,通过配置中心,可以集中查看,修改和删除配置,无需再逐个修改配置文件,提供效率的同时,也降低了出错的分险

6.1配置中心的工作流程 

1.服务启动时,从配置中心读取配置项的内容,进行配置的初始化

2.当配置中心的配置项发生改变时,配置中心会通知微服务,实现配置的更新加载

6.2Nacos配置中心的快速上手 

1.添加配置 

在Nacos控制台中添加配置项

注意事项:配置管理的命名空间和服务列表的命名空间是隔离的,两个是分别设置的,默认都是public,也就是服务列表的命名空间≠配置管理的命名空间 

新建配置项

 2.获取配置 

1.在对应项目中的pom文件中引入下面的依赖 

        <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!-- SpringCloud 2020.*之后版本需要引⼊bootstrap--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency>

2.增加bootstrap.propertities配置文件 

微服务启动前,需要先获取Nacos中的配置,并于application.yml配置合并,在微服务启动前,Nacos要求必须使用bootstrap.properties配置文件来配置Nacos Server地址

3.编写controller层代码 

@RefreshScope
@RestController
public class NacosController {@Value("${nacos.config}")private String config;@RequestMapping("/getConfig")public String getConfig(){return "从Nacos中获取配置信息nacos.config:"+config;}}

 

4.测试接口 

发现获取配置成功 

此时,修改配置中心的配置,刷新发现此时也成功获取修改后的配置信息

 

3.常见问题

1.配置格式出现错误

此时访问接口时会出现下面的报错 

此时如果重新启动服务则会出现下图的报错 

2.未引入相关依赖 

 出现下图的报错

 

原因:bootstrap.properties是系统及的资源配置文件,用于程序执行更加早期配置信息读取,但是SpringCloud2020.*之后的版本把bootstrap禁用了,导致在读取文件时读取不到而报错,此时将bootstrap包重新导入进来进行了

6.3配置中心详解

1.设置命名空间 

Nacos配置中心的命名空间和服务列表的命名空间是分别设置,默认都是public,Nacos命名空间的配置依然是在bootstrap.properties文件中进行配置 

添加一下配置 

重启服务,接着去获取Nacos配置中心的配置,此时就是从test环境下获取配置

2.Data Id详解 

Data Id格式介绍

在Nacos Spring Cloud中,Data Id的完整格式如下:

${prefix}-${spring.profiles.active}.${file-extension} 

信息介绍

1.prefix默认为spring.application.name的值

2.spring.profiles.active对应当前环境的profile,当spring.profiles.active为空时,对应的连接符-也将不存在,dataId的拼接格式变成${prefix}.${file-extension}  

3.file-extension为配置内容的数据格式,现在只支持yaml和properties这两种格式

当微服务启动时,会从Nacos中读取读个配置文件,我们可以通过启动服务时的日志来观察

要想读取product-service.properties和product-service-test.properties里面的配置信息,需要在bootstrap配置文件中添加下面的配置

这三个配置文件的读取的优先级为:

product-service-test.properties>product-service.properties>product-service

实验证明

有这3个配置文件时,从Nacos中获取配置时

 

在Nacos中product-service-test.properties配置 

然后从Nacos中删除product-service.properties 

http://www.xdnf.cn/news/623179.html

相关文章:

  • SQLAlchemy 2.0 查询使用指南
  • python使用pycharm和conda 设置默认使用清华镜像
  • 枚举类扩充处理
  • 【Qt】Qt 5.9.7使用MSVC2015 64Bit编译器
  • 基于SamOutV8的序列生成模型实现与分析
  • 如何把vue项目部署在nginx上
  • 用 AI 让学习更懂你:如何打造自动化个性化学习系统?
  • Linux10正式版发布,拥抱AI了!
  • PCB设计实践(二十七)电感的形态分类与应用场景深度解析
  • 【Linux】进程基本概念与基本操作
  • wordpress主题开发中常用的12个模板文件
  • 黑马k8s(十五)
  • 【触想智能】什么是工控一体机,工控一体机有什么用途?
  • 前端框架6
  • 折半搜索【2024华为智联杯 K.时光】
  • 安卓无障碍脚本开发全教程
  • Android-Glide学习总结
  • 当AI Agent遇上聊天机器人:一场关于效率与能力的较量
  • Day 0017:Web漏洞扫描(OpenVAS)解析
  • 【Java学习笔记】代码块
  • Express笔记
  • 塔能节能平板灯:点亮苏州某零售工厂节能之路
  • Oracle表索引变为不可用状态了怎么办
  • UniApp === H5实现主题切换
  • 【检索增强生成(RAG)全解析】从理论到工业级实践
  • commonmark.js 源码阅读(二) - Inline Parser
  • leetcode 两两交换链表中的节点 java
  • 【R语言科研绘图】
  • 讯飞AI相关sdk集成springboot
  • Matlab实战训练项目推荐