springcloud 课程学习笔记 2

1. consul

安装和启动

  • brew安装
  • 启动consul服务
    sudo consul agent -dev

服务提供方 / 消费方 配置

  • 导 spring-cloud-starter-consul-discovery
  • 写yml :指定注册到consul 服务器
  • 消费方调用 测试ok

2. 负载均衡 Load Banance --> LB

  1. 服务端LB Nginx :服务端分流
  2. 进程内LB ribbon: 本地的;到注册中心上查询服务可用列表,根据指定分流策略实行远程调用;ribbon只是一个类库,继承消费方进程
  3. Ribbon:负载均衡 +RestTemplate调用:在Bean RestTemplate上加@LoadBanance注解
  4. cloud-consumer-order80 中存在ribbon相关的代码,有无法发现服务的问题;如需重用,需注释掉,包括pom依赖

3. OpenFeign

  1. 接口调用绑定
    1. 写service接口,并绑定feign;@FeignClient(value = "CLOUD-PAYMENT-SERVICE")
    2. 主启动加注解 @EnableFeignClients
    3. 写controller
  2. 超时时间自定义 见yml参数
  3. 日志增强 -- feign接口的调用情况和监控、日志输出
    1. 配置bean -- return Logger.Level.FULL
    2. 加yml参数

4. Hystrix

概念

  1. 服务降级 fallback:服务临时出现问题时给出临时解决方法,而不宕机
  2. 服务熔断 break :保险丝,达到最大访问量时拒绝访问
  3. 服务限流 flowlimit : 秒杀高并发的工作

服务提供模块 cloud-provider-hystrix-payment8001

  1. 标准步骤 导包 - spring-cloud-starter-netflix-hystrix
  2. 服务端服务降级处理:增加服务超时fallback兜底方法; 并主启动@EnableHystrix //开启Hystrix服务

服务消费模块

  1. 客户端fallback
    1. yml开启Hystrix
    2. 主启动加@EnableHystrix
    3. 配置使用全局fallback
      1. 写全局兜底方法
      2. 在类头上加@DefaultProperties(defaultFallback = "payment_Global_FallbackMethod") //使用全局的fallback
    4. 在feign定义的接口上实现
      1. 建fallback类,实现该接口
      2. 在接口类上绑定该fallback兜底类 ??测试没通过??

服务熔断

  1. 修改cloud-provider-hystrix-payment8001;添加熔断判断代码和fallback
  2. 工作流程图:可参考官网图片

dashboard

  1. 建dashboard cloud-consumer-hystrix-dashboard9001;测试成功
    1. 导包 spring-cloud-starter-netflix-hystrix-dashboard
    2. yml中 加proxy-stream-allow-list: "localhost" 属性 解决dashboard不能正确连接的问题
    3. 启动服务后即可访问测试 http://localhost:9001/hystrix
  2. 服务监控的服务器pom都要包含actuator依赖
  3. 在被监控服务器8001/2主启动程序加适配代码 解决dashboard不能正确连接的问题

5. 网关

Gateway

  1. 概念:使用Webflux中的reactor-netty响应式编程组件,底层用了netty通讯框架;基于异步非阻塞模型
  2. Webflux: 异步非阻塞框架
  3. Gateway核心:请求转发 + 执行过滤连
    1. router:转发前后的精细化控制
    2. predicate: 匹配条件
    3. filter:拦截器
  4. 创建步骤
    1. 建模 cloud-gateway-gateway9527
    2. 增加yml中网关配置
    3. 配置路由地址两种方式
      1. yml中写:通过注册服务名,负载均衡,测试ok;
      2. 写注册类 转发到百度 测试ok
    4. predicate的多种过滤条件使用
    5. filter使用
      1. 使用yml定义,类似于predicate
      2. 自定义filter
        1. 创建filter类 继承2个接口: GlobalFilter, Ordered
        2. 设置过滤条件即可
  5. 测试

6. 配置中心

服务端配置

  1. 创建module cloud-config-center3344
  2. 导包、写yml、主程序 config + bus-amqp
  3. 改hosts文件 加映射 127.0.0.1 config-3344.com
  4. 测试 访问地址 config-3344.com:3344/main/application.yml 读不到文件内容
    1. http://config-3344.com:3344/config/dev/main 测试ok

客户端配置步骤

  1. 建cloud-config-client3355
  2. 写bootstrap代替application.yml,优先从3344加载配置文件
  3. 测试 访问地址 http://localhost:3355/configInfo 见controller
  4. 动态刷新:需要手动刷新
    1. pom里要加acuator监控依赖
    2. 暴露监控端点
    3. controller加注解开启 @RefreshScope //开启动态监控
    4. 修改github内容后,需要运维人员手动发送post请求 :curl -X POST "http://localhost:3355/actuator/refresh" ,刷新

7. Bus

理论

  1. 配合config组件实现配置动态刷新
  2. 整合了java时间处理机制和消息中间件的功能
  3. 支持RabbitMQ/Kafka
  4. 作用:管理和传播分布式系统间的消息
  5. 机制:springClient会关注MQ中同一个主题(默认为bus)
    当一个服务刷新数据时,将该消息放入topic, 这样其他监听同一服务的都会收到通知

测试步骤

  1. 建模 cloud-config-client3366
  2. 安装RabbitMQ - 安装erlang环境和 RabbitMQ 访问地址 //localhost:15672
    1. 相关命令见博客园
      1. 在安装目录中sbin目录下开启服务 -->. /usr/local/Cellar/rabbitmq
      2. 开启网页管理后 即可登陆网页管理页面,表示安装成功
  3. 两种消息通知的方式
    1. 中央广播:bus通知config server, 有服务器广播:更符合应用模式
    2. 小道消息:bus通知各应用客服端,有各应用服务对外扩散:服务器迁移时有更多修改
  4. 本例采用中央广播的方式构建
    1. 在配置服务器端增加广播支持
      1. 3344中增加spring-cloud-starter-bus-amqp依赖
      2. yml中增加 RabbitMQ支持和刷新端口
    2. 客户端3355/3366 也要改代码
      1. 增加spring-cloud-starter-bus-amqp依赖
      2. yml中增加 RabbitMQ支持和刷新端口
    3. 测试
      1. 修改github上的配置文件内容
      2. 配置服务器 刷新一次,全局广播 curl -X POST "http://localhost:3344/actuator/bus-refresh" 刷新失败!!
      3. 配置中心测试 http://config-3344.com:3344/config/dev/main
      4. 客户端测试 //localhost:3355/configInfo //localhost:3366/configInfo
      5. 定点广播:curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355" 只对3355广播

8. cloud stream

  1. 统一管辖 屏蔽底层消息中间件的差异,同一消息的编程模型 RabbitMQ/Kafka;目前只支持前两种;RocketMQ\ActiveMQ\
  2. 发布-订阅模式
  3. 使用步骤
    1. 建模 cloud-stream-rabbitmq-provider8801 导包spring-cloud-starter-stream-rabbit 注意用eureka-lient
      1. 在controller中使用 streamBridge 发送消息,其中包含bindingname和消息
      2. 改yml
        1. bindings: sms-out-0: 名字指定为 方法名 + out/in + index
        2. function:destination: sms 名字为方法名
    2. 消费端 cloud-stream-rabbitmq-consumer8802 更改
      1. yml中增加绑定和函数名
        bindings: sms1-in-0: function: sms1
      2. 主程序中添加打印功能的bean
    3. 测试 访问http://127.0.0.1:8801/sendsms1 rabbitmq网页管理中会动态显示访问量 测试ok
    4. 同时有两个时,测试失败
  4. 重复消费:同一个应用下的不同消费者8802/3,通过分组来决定是否重复消费;若在同一组,则竞争,不重复;不同组,则重复广播
  5. 持久化:只要分组配置还在,即使该消费者下线再上线,也可以收到属于他分组的消息;

模块简介

1.1 cloud-providerconsul-payment8006

  • 注册服务到consul 端口 8500

1.2 cloud-consumerconsul-order80

  • 注册服务到consul,通过RestTemplate调用payment8006

3. cloud-consumer-feign-order80

  • 通过openFeign调用服务
  • 注册了feign的log.level

4.1 cloud-provider-hystrix-payment8001

  • 注册到rureka,在service方法上加注解参数实现服务端服务降级或熔断

4.2 cloud-consumer-feign-hystrix-order80

  • 注册到rureka,在controller方法上加注解@HystrixCommand实现调用方服务降级或熔断

4.3 cloud-consumer-hystrix-dashboard9001

  • 开启dashboard服务

5.1 cloud-gateway-gateway9527

  • 自定义全局过滤
  • 通过写注册类实现网关路由 转发到百度
  • 通过yml写过滤访问接口实现路由控制

6.1 cloud-config-center3344

  • 配置github仓库地址
  • 开启rabbitmq端口

6.2&7 cloud-config-client3355/3366

  • 关联配置中心地址,开启rabbitmq支持和刷新端口
  • bootstrap优先加载配置

8.1 cloud-stream-rabbitmq-provider8801

  • 使用 streamBridge 发送消息
  • yml中绑定bindings

8.2 cloud-stream-rabbitmq-consumer8802

  • 老方法测试不成功

8.3 cloud-stream-rabbitmq-consumer8803

  • yml绑定bindings,主启动下注册bean打印,测试成功
posted @   蓝天可乐  阅读(59)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示