nacos做注册中心,openfeign作为微服务客户端,搭建测试
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
nacos作为注册中心是通过一个nacos-server服务端的应用,默认端口号是8088
nacos注册中心我已经起了两个微服务,一个nacos-user-service(有两个节点),一个nacos-custom1-service(一个节点)
见代码:
引入依赖:
<!-- 用于注册中心发现服务 也就是将服务注册进注册中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--配置中心 -->
<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-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
配置文件:
# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
server:
port: 8071
spring:
application:
name: nacos-user-service
datasource:
driver-class-name: oracle.jdbc.OracleDriver
url: jdbc:oracle:thin:@127.0.0.1:1521:orcl
username: szwy
password: szwy
cloud:
nacos:
discovery:
# Nacos认证信息
username: nacos
password: nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
server-addr: http://localhost:8848
# 注册到 nacos 的指定 namespace,默认为 public
namespace: public
#配置中心
config:
# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
# Nacos认证信息
username: nacos
password: nacos
context-path: nacos
# 设置配置中心服务端地址
server-addr: http://localhost:8848
# Nacos 配置中心的namespace。需要注意,如果使用 public 的 namcespace ,请不要填写这个值,直接留空即可
namespace:
config:
import: nacos:nacos-config-example.properties?refresh=true
nacos-user-service另一个节点只是端口号不同 server.port=8072
这两个微服务节点发布一个http服务,返回调用服务的端口号服务url
客户端:
依赖于服务端相同
配置文件:
server:
port: 8070
spring:
datasource:
url: jdbc:oracle:thin:@127.0.0.1:1521:orcl
driver-class-name: oracle.jdbc.OracleDriver
username: szwy
password: szwy
application:
name: nacos-custom1-service
cloud:
nacos:
discovery:
# Nacos认证信息
username: nacos
password: nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
server-addr: http://localhost:8848
# 注册到 nacos 的指定 namespace,默认为 public
namespace: public
#配置中心
config:
# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
# Nacos认证信息
username: nacos
password: nacos
context-path: nacos
# 设置配置中心服务端地址
server-addr: http://localhost:8848
# Nacos 配置中心的namespace。需要注意,如果使用 public 的 namcespace ,请不要填写这个值,直接留空即可
namespace:
config:
import: nacos:nacos-config-example.properties?refresh=true
loadbalancer:
retry:
#关闭loadBanlancer的重试机制 目前使用openFeign的重试机制
enabled: false
feign:
circuitbreaker:
enabled: true
client:
config:
default:
#设置连接超时时间 与服务端建立connect连接的超时时间
connectTimeout: 2000
#建立连接后 拿到服务端response响应的超时时间
readTimeout: 60000
nacos-user-service:
#设置连接超时时间 与服务端建立connect连接的超时时间
connectTimeout: 1000
#建立连接后 拿到服务端response响应的超时时间
readTimeout: 3000
hystrix:
command:
default:
execution:
timeout:
enable: true
isolation:
thread:
# 熔断服务超时时间 必须比feign服务超时时间长 不然就会影响feign重发 一般是(重发次数-1)*重发最大间隔时间 + fegin.readTimeout
# 我目前设置的是重发5次,最大重发间隔4秒,因此 (5-1)*4+3=19秒 19秒内就完成了全部重发 还是失败则服务降级
timeoutInMilliseconds: 20000
#配置单个服务的单个方法的熔断超时时间 类名#method(参数) 参数 String/int 对象直接写对象的类名
FeignController#testRibbonProvider():
execution:
timeout:
enable: true
isolation:
thread:
# 熔断服务超时时间 必须比feign服务超时时间长 不然就会影响feign重发
timeoutInMilliseconds: 100000
新建feign类 映射的服务名是nacos-user-service
对应的restController
发布服务成功后,开始测试:
调用四次,成功通过负载均衡(轮询)调用微服务集群的不同节点
然后测试超时重发机制
我设置的超时readTimeout是5秒 我在8071服务上人为打断点不放开,来模拟建立connect后,获取response超时的情况。(也可以增加线程休眠来模拟)
8071节点由于断点没放开,8071服务与注册中心的心跳函数无法交互,节点失效,服务节点从两个变成了一个,后续访问也直接变成了访问8072节点
如果使用线程休眠的方法,那么会发现注册中心和8071一直保持连接,节点不会失效,后续访问依旧会访问8071,但是因为线程休眠拿不到response,如果不配置重发就会进入熔断回调方法,
这时我将8071节点也增加断点,再次访问
提示该微服务没有节点可用
发现进入了熔断回调方法。
由此可知,如果开启了重发机制微服务节点集群只要有任意一个节点可用就不会进入熔断回调,除非重发所使用的所有节点服务都不可用才进入回调。
我关闭重发机制后,增加断点,重新访问,直接进入回调方法。
微服务不可用。
降级:调用回调方法 降级分三种方式
超时降级:不会让节点服务不可用
熔断降级:达到访问错误阀值时让服务不可用且调用降级(回调)
限流降级:访问线程数达到限额后,超出的线程调用降级(回调),超出前的线程正常。
------------------------------------------------------------------------------------------------------------------------------------------------------
我在8071服务上增加线程休眠8秒钟,则判断超时是配置文件中的readTimeout 3秒钟,然后就进入熔断回调方法
----------------------------------------------------------------------------------------------------------------------------------------------------------
测试熔断降级,已知熔断的默认值是10秒内20次请求访问,错误率超过50%即触发熔断降级
测试成功 8701触发熔断降级后故后续一直访问8702节点 我统计45次访问8701访问12次 8702访问33次 前面是因为轮询策略交替访问 且该节点不会恢复
因为熔断恢复机制是将熔断器打开的节点放出来重新放服务去访问(半关闭状态),能成功才会彻底将熔断器关闭,因为8701线程休眠,永远访问超时,故不会恢复,但是心跳一直是OK的。
熔断可参考文章(https://blog.csdn.net/weixin_42679286/article/details/131426030)
(https://blog.csdn.net/qq_27184497/article/details/119993725)
降级:调用回调方法 降级分三种方式
超时降级:不会让节点服务不可用
熔断降级:达到访问错误阀值时让服务不可用且调用降级(回调)
限流降级:访问线程数达到限额后,超出的线程调用降级(回调),超出前的线程正常。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人