2021-09-25 spring cloud 微服务入门操作

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注册中心

  1. pom.xml添加 eureka server 依赖
  2. application.yml
    - 开发时禁用自我保护模式
    - 设置主机名
    - 针对单台服务器,不向自己注册,不从自己拉取
  3. 启动类的注解: @EnableEurekaServer
    - 通过注解来触发自动配置

3.2 eureka客户端

  1. 添加 eureka client 依赖
  2. application.yml 配置 eureka 服务器连接地址
  3. (可选) 启动类添加@EnableDiscoveryClient

3.3 eureka四条运行机制

  1. 注册
    客户端会一次一次反复连接服务器进行注册,直到注册成功为止
  2. 拉取
    客户端每30秒拉取一次注册表,来刷新注册表
  3. 心跳
    客户端每30秒发送一次心跳,如果服务器连续三次收不到一个服务的心跳,会删除这个服务
  4. 自我保护模式
    由于网络不稳定,网络中断,15分钟内,85%服务器出现心跳异常,就会进入自我保护模式
    在这种特殊情况下,所有服务都不删除
    网络恢复正常后,可以自动退出保护模式
    开发调试期间,可以禁用保护模式,避免影响测试

4. 服务高可用

右键点服务的启动配置 – edit configuration
在 program arguments 中填 --server.port=8001
右键点服务的启动配置 – copy configuration
在 program arguments 中将端口改成 8002
这样可以同时启动两个相同的服务进行负载均衡远程调用

5. OpenFeign远程调用

添加 Feign,用Feign的声明式客户端接口做远程调用

  1. pom.xml 添加 openfeign 依赖
  2. 启动类添加注解: @EnableFeignClients
  3. 定义远程调用服务的客户端接口,如:
    ItemClient
    UserClient
  4. 修改调用者业务实现类OrderServiceImpl 完成远程调用

5.1 集成 Ribbon实现负载均衡和重试

  1. 默认已经启用负载均衡和重试
  2. Ribbon 重试
    远程调用后台服务失败时,可以自动重试调用
    失败原因: 服务出现异常、宕机、阻塞延迟超时
    重试参数:
    MaxAutoRetries: 单台服务器重试次数,默认值是 0
    MaxAutoRetriesNextServer: 更换服务器的次数, 默认值是 1
    ReadTimeout: 等待响应的超时时间,默认值是 1000
    OkToRetryOnAllOperations: 是否对所有请求方式都重试,默认只对GET重试
    ConnectTimeout: 与后台服务器建立网络连接的超时时间

6. Zuul 网关

6.1 统一的调用入口

  1. pom.xml添加依赖: zuul、eureka client
  2. application.yml添加配置:
# 转发规则
# service-id 作为访问子路径是默认配置,zuul会根据注册表完成自动配置
# 最好手动配置,防止注册表不全
zuul:
  routes:
    item-service: /item-service/**
    user-service: /user-service/**
    order-service: /order-service/**
  1. 启动类注解: @EnableZuulProxy

6.2 统一的权限校验

通过Zuul的过滤器,判断用户权限

  • 有权限,继续转发调用
  • 没有权限,从网关直接返回结果

http://localhost:3001/item-service/u56y5g4 没登录,不允许访问
http://localhost:3001/item-service/u56y5g4?token=u6y54t 已登录,可以访问

  1. 继承 ZuulFilter
  2. 添加 @Component

Zuul的自动配置类,可以从 spring 容器自动发现过滤器实例,完成自动配置

6.3 集成 Ribbon

  1. zuul默认启用负载均衡
  2. zuul默认不启用重试,zuul不推荐启用重试
    一般不在网关执行重试,否则,会造成后台大面积服务器压力倍增
  3. zuul如何启用 ribbon 重试
    添加 spring-retry 依赖
    application.yml配置启用 zuul 重试: zuul.retryable=true
    (可选)配置重试参数

6.4 集成 Hystrix

  • 降级
    zuul默认已经启用了 Hystrix,可以直接写降级代码
  1. 实现 FallbackProvider 接口

  2. 添加 @Component

    zuul会用自动配置类,对降级类进行自动配置

  • 熔断
    当流量过大,后台服务出现故障,可以断开后台服务的链路,等待后台服务恢复

      短路器的打开条件:
      1. 10秒20次请求(必须首先满足)
      2. 50%失败,执行的降级代码
    
      半开状态:
      		断路器打开一段时间后,会进入半开状态,会尝试发送一次客户端调用
      		成功,关闭断路器,恢复正常
      		失败,继续保持打开状态
    
  • Hystrix 监控
    对 Hystrix 降级和熔断的情况进行监控,可以快速定位错误,查找系统中的问题
    在 zuul服务中,Hystrix利用 actuator 来暴露自己的监控日志数据

  1. 添加 actuator 依赖
  2. application.yml 配置暴露监控日志
#暴露所有监控日志
management:
  endpoints:
    web:
      exposure:
        include: "*"
  1. 访问 http://localhost:3001/actuator
  • 搭建Hystrix Dashboard
  1. 添加依赖:Hystrix Dashboard
  2. application.yml配置允许抓取的服务器列表: localhost, a, b, c
hystrix:
  dashboard:
    proxy-stream-allow-list: localhost
  1. 启动类注解: @EnableHystrixDashboard

访问: http://localhost:4001/hystrix
在输入框中填写日志数据的地址 http://localhost:3001/actuator/hystrix.stream

  • 搭建Turbine
    聚合监控数据
    同时启动两个zuul服务进行负载均衡访问
  1. 添加 eureka client,turbine 依赖
  2. application.yml 配置:
turbine:
  app-config: zuul   #抓取的服务id列表 a,b,c
  cluster-name-expression: new String("default")  #为聚合后的数据命名
  1. 启动类注解: @EnalbleTurbine
  2. 查看聚合的日志数据:http://localhost:5001/turbine.stream
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值