1. 开发环境
- IDEA 插件
Lombok
EditStarters
Free MyBatis Plugin
Maven Helper
AiXcoder Code Completer
Gitee - Maven
使用阿里仓库和中央仓库,来回切换更新(settings.xml 不配置任何镜像仓库,默认使用中央仓库) - springboot版本: 2.3.2.RELEASE
- springcloud版本: Hoxton.SR12
2. spring cloud
集成多种工具,解决微服务中的各种问题
- 注册和发现 - Nacos、Eureka、Zookeeper
- 远程调用 - OpenFeign(集成Ribbon)
负载均衡
重试 - 系统容错和限流 - Sentinel、Hystrix
降级
熔断 - 错误监控 - Hystrix Dashboard、Turbine
- 配置中心 - Nacos、Config
- 链路跟踪 - Sleuth、Zipkin
3. 注册中心
3.1 搭建eureka注册中心
- pom.xml添加 eureka server 依赖
- application.yml
- 开发时禁用自我保护模式
- 设置主机名
- 针对单台服务器,不向自己注册,不从自己拉取 - 启动类的注解: @EnableEurekaServer
- 通过注解来触发自动配置
3.2 eureka客户端
- 添加 eureka client 依赖
- application.yml 配置 eureka 服务器连接地址
- (可选) 启动类添加@EnableDiscoveryClient
3.3 eureka四条运行机制
- 注册
客户端会一次一次反复连接服务器进行注册,直到注册成功为止 - 拉取
客户端每30秒拉取一次注册表,来刷新注册表 - 心跳
客户端每30秒发送一次心跳,如果服务器连续三次收不到一个服务的心跳,会删除这个服务 - 自我保护模式
由于网络不稳定,网络中断,15分钟内,85%服务器出现心跳异常,就会进入自我保护模式
在这种特殊情况下,所有服务都不删除
网络恢复正常后,可以自动退出保护模式
开发调试期间,可以禁用保护模式,避免影响测试
4. 服务高可用
右键点服务的启动配置 – edit configuration
在 program arguments 中填 --server.port=8001
右键点服务的启动配置 – copy configuration
在 program arguments 中将端口改成 8002
这样可以同时启动两个相同的服务进行负载均衡远程调用
5. OpenFeign远程调用
添加 Feign,用Feign的声明式客户端接口做远程调用
- pom.xml 添加 openfeign 依赖
- 启动类添加注解: @EnableFeignClients
- 定义远程调用服务的客户端接口,如:
ItemClient
UserClient - 修改调用者业务实现类OrderServiceImpl 完成远程调用
5.1 集成 Ribbon实现负载均衡和重试
默认已经启用负载均衡和重试
- Ribbon 重试
远程调用后台服务失败时,可以自动重试调用
失败原因: 服务出现异常、宕机、阻塞延迟超时
重试参数:
MaxAutoRetries: 单台服务器重试次数,默认值是 0
MaxAutoRetriesNextServer: 更换服务器的次数, 默认值是 1
ReadTimeout: 等待响应的超时时间,默认值是 1000
OkToRetryOnAllOperations: 是否对所有请求方式都重试,默认只对GET重试
ConnectTimeout: 与后台服务器建立网络连接的超时时间
6. Zuul 网关
6.1 统一的调用入口
- pom.xml添加依赖: zuul、eureka client
- application.yml添加配置:
# 转发规则
# service-id 作为访问子路径是默认配置,zuul会根据注册表完成自动配置
# 最好手动配置,防止注册表不全
zuul:
routes:
item-service: /item-service/**
user-service: /user-service/**
order-service: /order-service/**
- 启动类注解: @EnableZuulProxy
6.2 统一的权限校验
通过Zuul的过滤器,判断用户权限
- 有权限,继续转发调用
- 没有权限,从网关直接返回结果
http://localhost:3001/item-service/u56y5g4 没登录,不允许访问
http://localhost:3001/item-service/u56y5g4?token=u6y54t 已登录,可以访问
- 继承 ZuulFilter
- 添加 @Component
Zuul的自动配置类,可以从 spring 容器自动发现过滤器实例,完成自动配置
6.3 集成 Ribbon
zuul默认启用负载均衡
- zuul默认不启用重试,zuul不推荐启用重试
一般不在网关执行重试,否则,会造成后台大面积服务器压力倍增 - zuul如何启用 ribbon 重试
添加 spring-retry 依赖
application.yml配置启用 zuul 重试: zuul.retryable=true
(可选)配置重试参数
6.4 集成 Hystrix
- 降级
zuul默认已经启用了 Hystrix,可以直接写降级代码
-
实现 FallbackProvider 接口
-
添加 @Component
zuul会用自动配置类,对降级类进行自动配置
-
熔断
当流量过大,后台服务出现故障,可以断开后台服务的链路,等待后台服务恢复短路器的打开条件: 1. 10秒20次请求(必须首先满足) 2. 50%失败,执行的降级代码 半开状态: 断路器打开一段时间后,会进入半开状态,会尝试发送一次客户端调用 成功,关闭断路器,恢复正常 失败,继续保持打开状态
-
Hystrix 监控
对 Hystrix 降级和熔断的情况进行监控,可以快速定位错误,查找系统中的问题
在 zuul服务中,Hystrix利用 actuator 来暴露自己的监控日志数据
- 添加 actuator 依赖
- application.yml 配置暴露监控日志
#暴露所有监控日志
management:
endpoints:
web:
exposure:
include: "*"
- 访问 http://localhost:3001/actuator
- 搭建Hystrix Dashboard
- 添加依赖:Hystrix Dashboard
- application.yml配置允许抓取的服务器列表: localhost, a, b, c
hystrix:
dashboard:
proxy-stream-allow-list: localhost
- 启动类注解: @EnableHystrixDashboard
访问: http://localhost:4001/hystrix
在输入框中填写日志数据的地址 http://localhost:3001/actuator/hystrix.stream
- 搭建Turbine
聚合监控数据
同时启动两个zuul服务进行负载均衡访问
- 添加 eureka client,turbine 依赖
- application.yml 配置:
turbine:
app-config: zuul #抓取的服务id列表 a,b,c
cluster-name-expression: new String("default") #为聚合后的数据命名
- 启动类注解: @EnalbleTurbine
- 查看聚合的日志数据:http://localhost:5001/turbine.stream