springcloud 课程学习笔记 2
1. consul
安装和启动
- brew安装
- 启动consul服务
sudo consul agent -dev
服务提供方 / 消费方 配置
- 导 spring-cloud-starter-consul-discovery
- 写yml :指定注册到consul 服务器
- 消费方调用 测试ok
2. 负载均衡 Load Banance --> LB
- 服务端LB Nginx :服务端分流
- 进程内LB ribbon: 本地的;到注册中心上查询服务可用列表,根据指定分流策略实行远程调用;ribbon只是一个类库,继承消费方进程
- Ribbon:负载均衡 +RestTemplate调用:在Bean RestTemplate上加@LoadBanance注解
- cloud-consumer-order80 中存在ribbon相关的代码,有无法发现服务的问题;如需重用,需注释掉,包括pom依赖
3. OpenFeign
- 接口调用绑定
- 写service接口,并绑定feign;@FeignClient(value = "CLOUD-PAYMENT-SERVICE")
- 主启动加注解 @EnableFeignClients
- 写controller
- 超时时间自定义 见yml参数
- 日志增强 -- feign接口的调用情况和监控、日志输出
- 配置bean -- return Logger.Level.FULL
- 加yml参数
4. Hystrix
概念
- 服务降级 fallback:服务临时出现问题时给出临时解决方法,而不宕机
- 服务熔断 break :保险丝,达到最大访问量时拒绝访问
- 服务限流 flowlimit : 秒杀高并发的工作
服务提供模块 cloud-provider-hystrix-payment8001
- 标准步骤 导包 - spring-cloud-starter-netflix-hystrix
- 服务端服务降级处理:增加服务超时fallback兜底方法; 并主启动@EnableHystrix //开启Hystrix服务
服务消费模块
- 客户端fallback
- yml开启Hystrix
- 主启动加@EnableHystrix
- 配置使用全局fallback
- 写全局兜底方法
- 在类头上加@DefaultProperties(defaultFallback = "payment_Global_FallbackMethod") //使用全局的fallback
- 在feign定义的接口上实现
- 建fallback类,实现该接口
- 在接口类上绑定该fallback兜底类 ??测试没通过??
服务熔断
- 修改cloud-provider-hystrix-payment8001;添加熔断判断代码和fallback
- 工作流程图:可参考官网图片
dashboard
- 建dashboard cloud-consumer-hystrix-dashboard9001;测试成功
- 导包 spring-cloud-starter-netflix-hystrix-dashboard
- yml中 加proxy-stream-allow-list: "localhost" 属性 解决dashboard不能正确连接的问题
- 启动服务后即可访问测试 http://localhost:9001/hystrix
- 服务监控的服务器pom都要包含actuator依赖
- 在被监控服务器8001/2主启动程序加适配代码 解决dashboard不能正确连接的问题
5. 网关
Gateway
- 概念:使用Webflux中的reactor-netty响应式编程组件,底层用了netty通讯框架;基于异步非阻塞模型
- Webflux: 异步非阻塞框架
- Gateway核心:请求转发 + 执行过滤连
- router:转发前后的精细化控制
- predicate: 匹配条件
- filter:拦截器
- 创建步骤
- 建模 cloud-gateway-gateway9527
- 增加yml中网关配置
- 配置路由地址两种方式
- yml中写:通过注册服务名,负载均衡,测试ok;
- 写注册类 转发到百度 测试ok
- predicate的多种过滤条件使用
- filter使用
- 使用yml定义,类似于predicate
- 自定义filter
- 创建filter类 继承2个接口: GlobalFilter, Ordered
- 设置过滤条件即可
- 测试
- 先关掉FQ软件
6. 配置中心
服务端配置
- 创建module cloud-config-center3344
- 导包、写yml、主程序 config + bus-amqp
- 改hosts文件 加映射 127.0.0.1 config-3344.com
- 测试 访问地址 config-3344.com:3344/main/application.yml 读不到文件内容
客户端配置步骤
- 建cloud-config-client3355
- 写bootstrap代替application.yml,优先从3344加载配置文件
- 测试 访问地址 http://localhost:3355/configInfo 见controller
- 动态刷新:需要手动刷新
- pom里要加acuator监控依赖
- 暴露监控端点
- controller加注解开启 @RefreshScope //开启动态监控
- 修改github内容后,需要运维人员手动发送post请求 :curl -X POST "http://localhost:3355/actuator/refresh" ,刷新
7. Bus
理论
- 配合config组件实现配置动态刷新
- 整合了java时间处理机制和消息中间件的功能
- 支持RabbitMQ/Kafka
- 作用:管理和传播分布式系统间的消息
- 机制:springClient会关注MQ中同一个主题(默认为bus)
当一个服务刷新数据时,将该消息放入topic, 这样其他监听同一服务的都会收到通知
测试步骤
- 建模 cloud-config-client3366
- 安装RabbitMQ - 安装erlang环境和 RabbitMQ 访问地址 //localhost:15672
- 相关命令见博客园
- 在安装目录中sbin目录下开启服务 -->. /usr/local/Cellar/rabbitmq
- 开启网页管理后 即可登陆网页管理页面,表示安装成功
- 相关命令见博客园
- 两种消息通知的方式
- 中央广播:bus通知config server, 有服务器广播:更符合应用模式
- 小道消息:bus通知各应用客服端,有各应用服务对外扩散:服务器迁移时有更多修改
- 本例采用中央广播的方式构建
- 在配置服务器端增加广播支持
- 3344中增加spring-cloud-starter-bus-amqp依赖
- yml中增加 RabbitMQ支持和刷新端口
- 客户端3355/3366 也要改代码
- 增加spring-cloud-starter-bus-amqp依赖
- yml中增加 RabbitMQ支持和刷新端口
- 测试
- 修改github上的配置文件内容
- 配置服务器 刷新一次,全局广播 curl -X POST "http://localhost:3344/actuator/bus-refresh" 刷新失败!!
- 配置中心测试 http://config-3344.com:3344/config/dev/main
- 客户端测试 //localhost:3355/configInfo //localhost:3366/configInfo
- 定点广播:curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355" 只对3355广播
- 在配置服务器端增加广播支持
8. cloud stream
- 统一管辖 屏蔽底层消息中间件的差异,同一消息的编程模型 RabbitMQ/Kafka;目前只支持前两种;RocketMQ\ActiveMQ\
- 发布-订阅模式
- 使用步骤
- 建模 cloud-stream-rabbitmq-provider8801 导包spring-cloud-starter-stream-rabbit 注意用eureka-lient
- 在controller中使用 streamBridge 发送消息,其中包含bindingname和消息
- 改yml
- bindings: sms-out-0: 名字指定为 方法名 + out/in + index
- function:destination: sms 名字为方法名
- 消费端 cloud-stream-rabbitmq-consumer8802 更改
- yml中增加绑定和函数名
bindings: sms1-in-0: function: sms1 - 主程序中添加打印功能的bean
- yml中增加绑定和函数名
- 测试 访问http://127.0.0.1:8801/sendsms1 rabbitmq网页管理中会动态显示访问量 测试ok
- 同时有两个时,测试失败
- 建模 cloud-stream-rabbitmq-provider8801 导包spring-cloud-starter-stream-rabbit 注意用eureka-lient
- 重复消费:同一个应用下的不同消费者8802/3,通过分组来决定是否重复消费;若在同一组,则竞争,不重复;不同组,则重复广播
- 持久化:只要分组配置还在,即使该消费者下线再上线,也可以收到属于他分组的消息;
模块简介
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打印,测试成功
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~