文章目录
版本
springboot: 2.3.2.RELEASE
springcloud: Hoxton.SR12
1. Eureka服务注册和发现
1.1 客户端
- 添加eureka client依赖
- yml配置eureka服务器连接地址
- (可选)启动类添加 @EnableDiscoveryClient 注解
- 客户端启动反复尝试注册,直到注册成功
- 客户端每30秒向服务中心拉取一次注册表
- 客户端每30秒发送一次心跳
1.2 服务端
- 添加 eureka server 依赖
- 启动类添加 @EnableEurekaServer 注解,通过注解来触发自动配置
- 注册中心连续3次收不到心跳,就会删除该服务
- yml配置eureka服务器连接地址
- 自我保护模式:
- 由于网络不稳定,15分钟内85%的服务器心跳异常就会触发自我保护模式.
- 自我保护模式时,保护所有的注册信息,不删除
- 网络稳定后,自动退出保护模式,恢复正常
- 开发期间建议关闭保护模式
- 单台服务器
- 针对单台Eureka服务器,设置为不向自己注册,不向自己拉取
- 集群服务器
- 集群服务器之间互相注册,互相拉取
- yml profile文件特殊写法
2.Feign远程服务调用
2.1 远程服务调用
-
添加openfeign依赖
-
用Feign的声明式客户端接口做远程调用
- 接口上添加 @FeignClient 注解
- 三个配置:
调用哪个服务
调用这个服务的哪个路径
向这个路径传递什么参数
- 三个配置:
- 接口上添加 @FeignClient 注解
-
主启动类添加 @EnableFeignClients 注解
2.2 集成Ribbon(负载均衡)
- 默认已经启用负载均衡和重试
- 重试参数(默认已配置)
MaxAutoRetries: 单台服务器重试次数,默认值是 0
MaxAutoRetriesNextServer: 更换服务器的次数, 默认值是 1
ReadTimeout: 等待响应的超时时间,默认值是 1000毫秒
OkToRetryOnAllOperations: 是否对所有请求方式都重试,默认只对GET重试
ConnectTimeout: 与后台服务器建立网络连接的超时时间
- 重试参数(默认已配置)
2.3 集成Hystrix
- 不建议开启,直接在网关层面做降级熔断
3. Zuul API网关
3.1 统一的调用入口
- 添加 zuul 依赖
- yml配置转发规则(默认已配置,最好手动再配置一次), serviceId: /serviceId/**
- 启动类注解 @EnableZuulProxy
3.2 统一的权限验证
- 通过Zuul的过滤器,判断用户权限
- 继承 ZuulFilter ,重写方法,添加 @Component
- 过滤器类型 pre routing post error
- 默认有5个过滤器,在第5个过滤器执行的时候,才会把当前调用的服务id写到上下文中
3.3 集成Ribbon
- Zuul网关默认启用Ribbon负载均衡
- 默认不启用重试机制(减轻网关压力)
- 如果启用重试策略,需要添加 spring-retry 依赖,配置文件打开重试设置
3.4 集成Hystrix
3.4.1 Zuul默认启用Hystrix
3.4.2 hystrix容错降级:自定义降级策略:
- 实现 FallbackProvider 接口, 重写方法
- 添加 @Component 注解
- zuul会用自动配置类,对降级类进行自动配置
3.4.3 hystrix 限流 – 熔断
当流量过大,后台服务出现故障,可以断开后台服务的链路,等待后台服务恢复.当出现断路时,如果写了降级方案,就会自动调用降级处理方案
- 断路器打开的条件
- 10秒20次请求(必须首先满足)
- 50%失败,执行了降级的代码
- 半开状态
- 断路器打开一段时间后,会进入半开状态
- 会自动尝试发送一次客户端调用
- 成功,关闭断路器,恢复正常
- 失败,继续保持打开状态
3.4.3 Hystrix暴露监控日志
- zuul网关默认关联 actuator 依赖
- yml配置暴露监控日志 (打开监控端点)
3.5 Hystrix Dashboard
- 新建moudle
- 添加 hystrix-dashboard 依赖
- yml配置允许抓取的服务器列表
- 启动类添加 @EnableHystrixDashboard 注解
- 监控网关暴露的 hystrix.stream 端点
- 访问: http://localhost:port/hystrix,在输入框填写日志数据地址(聚合监控地址)
4. Turbine 聚合监控数据
- 新建moudle
- 依赖: eureka client , turbine
- yml配置:
- app-config: 要抓取的服务id列表
- 为聚合后的数据命名: new String(“default”)
- 启动类添加 @EnableTurbine 注解
- 查看日志地址:http://localhost:port/turbine.stream
5. config配置中心
- 准备git仓库存放配置文件
- 在项目目录下新建 config 文件夹
- 添加工程所需要的配置文件,命名为:serviceId-dev.yml
- 把配置文件推送到远程仓库
- 因为本地iten服务设置了启动参数,所以在配置中心可以设置不覆盖本地启动参数,防止8080端口占用,其他参数同理
override-none: true //不覆盖本地参数
- 搭建配置中心服务
- 新建moudle
- 依赖: eureka client、config server
- yml配置文件
git.uri = git仓库地址 search-paths = config(配置文件所在目录) 例: git.uri = https://gitee.com/chen-chenxin/CGB2105V.git search-paths = springcloud1/config 如果是私有库 username = xxxxxx password = xxxxxx
- 启动类 @EnableConfigServer 注解
- 修改需要连接配置中心的客户端工程
- 添加 config client 依赖
- 修改配置文件名为 bootstrap.yml
- 连接eureka注册中心
- 要获取的配置中心的serviceId
- 要下载的配置文件名和profile名
6. BUS 消息总线,配置刷新
目的: 配置中心修改对应服务配置,客户端可以获取到最新配置.
原理: 当修改配置中心的配置后,向 bus-refresh 刷新端点发送 post 请求
http://localhost:port(config-server)/actuator/bus-refresh,然后对应服务会重新连接配置中心重新加载配置信息,以达到实时刷新的目的.
使用的模式为 主题 模式,交换机为 topic
- 配置中心服务
- 依赖 bus、rabbitmq-binder、rabbitmq、actuator
- yml
- 设置rebbitmq连接配置
- 暴露bus-refresh路径
- 客户端
- 依赖 bus、rabbitmq-binder、rabbitmq
- 在要获取更新的类上添加 @RefreshScope 注解
- 更新配置中心的对应服务的配置信息
7. 链路跟踪(sleuth + zipkin)
sleuth: 用来产生链路跟踪日志
zipkin: 收集链路跟踪数据,提供可视化的链路分析
过程分析:
sleuth将日志信息发送到rabbitmq,发送方式为rabbit,然后zipkin从rabbitmq获取日志信息,默认10%抽样比例,使用简单模式,默认交换机.
- sleuth
- 用来产生链路跟踪日志
请求id: 请求到达第一个微服务时生成一个请求id,该id在调用链路中会一直向后面的微服务传递
span id: 链路中每一步微服务调用,都生成一个新的id
默认日志格式 服务id, 请求id, span id, 是否发送到zipkin(默认10%抽样比例) zuul, UHYG45RTG4, UHYG45RTG4, true order-service, UHYG45RTG4, JH4TG456UU, true item-service, UHYG45RTG4, H5T43F35YY, true user-service, UHYG45RTG4, IU56Y4T4FR, true
- 在需要产生链路日志的服务添加 sleuth 依赖
- 无需添加额外配置
- 用来产生链路跟踪日志
- zipkin
- 服务产生的日志发送到zipkin进行处理
- 服务端
- 下载zipkin jar包,运行
- 客户端
- 在需要发送日志的服务添加 zipkin client 依赖
- 在网关服务添加 rabbitmq 依赖,用来把收集到的链路日志发送到zipkin
- 网关配置文件添加rabbit连接信息
- 修改各服务的配置文件,日志发送方式为rabbit
8. eureka客户端,选择正确网卡、注册ip地址
-
选择正确网卡
- bootstrap.yml 添加配置
spring: cloud: inetutils: # 二选一即可 ignored-interfaces: #忽略的网卡 - VM.* preferred-networks: # 要使用的网卡 - 192\.168\.0\..+
- bootstrap.yml 添加配置
-
注册ip地址,不注册主机名
- 修改 application.yml
eureka: instance: prefer-ip-address: true # 使用ip进行注册 instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
- 修改 application.yml