From d4ad93508b94fe883b4116fa88c62e2f45732dbc Mon Sep 17 00:00:00 2001 From: qyx <565485304@qq.com> Date: Tue, 3 Sep 2024 18:17:37 +0800 Subject: [PATCH 1/6] feat(master):Hystrix1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 后备1 + 合并 --- .../NetflixHystrix.md | 4 +- .../dev-protocol-springcloud-hystrix/pom.xml | 21 +++ .../example/controller/HystrixController.java | 153 ++++++++++++++++++ .../NacosClientBatchCommand.java | 50 ++++++ .../NacosClientCollapseCommand.java | 85 ++++++++++ .../AuthorityFeignClientHystrixDemo.java | 30 ++++ .../NacosClientService4HystrixDemo.java | 47 ++++++ .../bak/AuthorityFeignClientFallback.java | 21 +++ .../AuthorityFeignClientFallbackFactory.java | 27 ++++ 9 files changed, 436 insertions(+), 2 deletions(-) create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-hystrix/src/main/java/org/example/hystrix/request_merge/NacosClientBatchCommand.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-hystrix/src/main/java/org/example/hystrix/request_merge/NacosClientCollapseCommand.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-hystrix/src/main/java/org/example/service/AuthorityFeignClientHystrixDemo.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-hystrix/src/main/java/org/example/service/hystrix/bak/AuthorityFeignClientFallback.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-hystrix/src/main/java/org/example/service/hystrix/bak/AuthorityFeignClientFallbackFactory.java diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/NetflixHystrix.md b/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/NetflixHystrix.md index ff18d86..11924a2 100644 --- a/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/NetflixHystrix.md +++ b/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/NetflixHystrix.md @@ -33,10 +33,10 @@ ### 编程方式应用 Hystrix 请求合并 - +- ### 注解方式应用 Hystrix 请求合并 - +- 使用注解的方式比较多 ### OpenFeign 集成 Hystrix 开启后备模式 diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/pom.xml b/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/pom.xml index 3c5d3cb..deb2130 100644 --- a/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/pom.xml +++ b/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/pom.xml @@ -49,6 +49,27 @@ fastjson 1.2.51 + + + + io.github.openfeign + feign-micrometer + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + + io.github.openfeign + feign-okhttp + + + + io.github.openfeign + feign-gson + 12.1 + + dev-protocol-springcloud-hystrix-dashboard + Hystrix Dashboard + + + + 8 + 8 + UTF-8 + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.cloud + spring-cloud-starter-netflix-hystrix + + + org.springframework.cloud + spring-cloud-starter-netflix-hystrix-dashboard + + + + + + ${artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + + \ No newline at end of file diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-hystrix-dashboard/src/main/java/org/example/HystrixDashboardApplication.java b/dev-protocol-springcloud/dev-protocol-springcloud-hystrix-dashboard/src/main/java/org/example/HystrixDashboardApplication.java new file mode 100644 index 0000000..ce530dc --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-hystrix-dashboard/src/main/java/org/example/HystrixDashboardApplication.java @@ -0,0 +1,21 @@ +package org.example; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard; + +/** + *

hystrix dashboard 入口

+ * 控制台页面 http://127.0.0.1:9999/dev-protocol-springcloud-hystrix-dashboard/hystrix/ + * 需要监控的服务 stream 拼接: http://127.0.0.1:8111/dev-protocol-springcloud-hystrix/actuator/hystrix.stream + * */ +@EnableDiscoveryClient +@SpringBootApplication +@EnableHystrixDashboard // 开启 Hystrix Dashboard +public class HystrixDashboardApplication { + public static void main(String[] args) { + + SpringApplication.run(HystrixDashboardApplication.class, args); + } +} \ No newline at end of file diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-hystrix-dashboard/src/main/resources/bootstrap.yml b/dev-protocol-springcloud/dev-protocol-springcloud-hystrix-dashboard/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..976837d --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-hystrix-dashboard/src/main/resources/bootstrap.yml @@ -0,0 +1,33 @@ +server: + port: 9999 + servlet: + context-path: /dev-protocol-springcloud-hystrix-dashboard + +spring: + application: + name: dev-protocol-springcloud-hystrix-dashboard + cloud: + nacos: + # 服务注册发现 + discovery: + enabled: true # 如果不想使用 Nacos 进行服务注册和发现, 设置为 false 即可 + server-addr: 127.0.0.1:8848 + # server-addr: 127.0.0.1:8848,127.0.0.1:8849,127.0.0.1:8850 # Nacos 服务器地址 + namespace: 1ccc74ae-9398-4dbe-b9d7-4f9addf9f40c + metadata: + management: + context-path: ${server.servlet.context-path}/actuator + +hystrix: + dashboard: + proxy-stream-allow-list: "127.0.0.1" + +# 暴露端点 +management: + endpoints: + web: + exposure: + include: '*' + endpoint: + health: + show-details: always diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-hystrix-dashboard/src/main/resources/http/dashboard.http b/dev-protocol-springcloud/dev-protocol-springcloud-hystrix-dashboard/src/main/resources/http/dashboard.http new file mode 100644 index 0000000..2395cb6 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-hystrix-dashboard/src/main/resources/http/dashboard.http @@ -0,0 +1,31 @@ +### 获取 Token +POST http://127.0.0.1:9001/dev-protocol-springcloud-gateway/dev-protocol-springcloud-hystrix/communication/token-by-feign +Content-Type: application/json +e-commerce-user: eyJhbGciOiJSUzI1NiJ9.eyJlLWNvbW1lcmNlLXVzZXIiOiJ7XCJpZFwiOjEwLFwidXNlcm5hbWVcIjpcIlFpbnlpQGltb29jLmNvbVwifSIsImp0aSI6IjJlMTgwYzA2LWIwZGQtNDJjYy1iNzk5LTZiNGI4N2Q3NTM3NCIsImV4cCI6MTYyNTQxNDQwMH0.P8gKWcwiibEmq80idCl9QzUaqJnQ7FVQ5yxzlMLfRNcG3nWMYh0o1kBO2vKvDGG8BofQ4__xn210R2P7zjH-uEn7hic0jbBt97vLkzvATnFegxaDSjUp9At9BIGl9Ecu7RPCwSQJFdw6NBMBz02Uom8yvHpUJEfv8_jZRurBp94tzES6IAACKC6NFq-3_mQfT4o_zA51U4hBbIBw6qNXvMSqK-VtaqkTNFfJsP_8Y0nmQck0jxmgdtLfRVfZCCp3rhcLNDBX37THQI6U7lvNFETceAKyJ5NFaA8p68lw_3D2IiZER1jEU3M2QIMQGeU0pmQ6IPwGDdA0MP5IKKzj8A +token: imooc + +{ + "username": "Qinyi@imooc.com", + "password": "25d55ad283aa400af464c76d713c07ad" +} + + +### 根据提供的 serviceId 获取实例信息 +GET http://127.0.0.1:9001/dev-protocol-springcloud-gateway/ecommerce-nacos-client/hystrix/hystrix-command-annotation?serviceId=e-commerce-nacos-client +Content-Type: application/json +e-commerce-user: eyJhbGciOiJSUzI1NiJ9.eyJlLWNvbW1lcmNlLXVzZXIiOiJ7XCJpZFwiOjEwLFwidXNlcm5hbWVcIjpcIlFpbnlpQGltb29jLmNvbVwifSIsImp0aSI6IjJlMTgwYzA2LWIwZGQtNDJjYy1iNzk5LTZiNGI4N2Q3NTM3NCIsImV4cCI6MTYyNTQxNDQwMH0.P8gKWcwiibEmq80idCl9QzUaqJnQ7FVQ5yxzlMLfRNcG3nWMYh0o1kBO2vKvDGG8BofQ4__xn210R2P7zjH-uEn7hic0jbBt97vLkzvATnFegxaDSjUp9At9BIGl9Ecu7RPCwSQJFdw6NBMBz02Uom8yvHpUJEfv8_jZRurBp94tzES6IAACKC6NFq-3_mQfT4o_zA51U4hBbIBw6qNXvMSqK-VtaqkTNFfJsP_8Y0nmQck0jxmgdtLfRVfZCCp3rhcLNDBX37THQI6U7lvNFETceAKyJ5NFaA8p68lw_3D2IiZER1jEU3M2QIMQGeU0pmQ6IPwGDdA0MP5IKKzj8A +token: imooc + + +### 根据提供的 serviceId 获取实例信息 +GET http://127.0.0.1:9001/dev-protocol-springcloud-gateway/ecommerce-nacos-client/hystrix/simple-hystrix-command?serviceId=e-commerce-nacos-client +Content-Type: application/json +e-commerce-user: eyJhbGciOiJSUzI1NiJ9.eyJlLWNvbW1lcmNlLXVzZXIiOiJ7XCJpZFwiOjEwLFwidXNlcm5hbWVcIjpcIlFpbnlpQGltb29jLmNvbVwifSIsImp0aSI6IjJlMTgwYzA2LWIwZGQtNDJjYy1iNzk5LTZiNGI4N2Q3NTM3NCIsImV4cCI6MTYyNTQxNDQwMH0.P8gKWcwiibEmq80idCl9QzUaqJnQ7FVQ5yxzlMLfRNcG3nWMYh0o1kBO2vKvDGG8BofQ4__xn210R2P7zjH-uEn7hic0jbBt97vLkzvATnFegxaDSjUp9At9BIGl9Ecu7RPCwSQJFdw6NBMBz02Uom8yvHpUJEfv8_jZRurBp94tzES6IAACKC6NFq-3_mQfT4o_zA51U4hBbIBw6qNXvMSqK-VtaqkTNFfJsP_8Y0nmQck0jxmgdtLfRVfZCCp3rhcLNDBX37THQI6U7lvNFETceAKyJ5NFaA8p68lw_3D2IiZER1jEU3M2QIMQGeU0pmQ6IPwGDdA0MP5IKKzj8A +token: imooc + + +### 根据提供的 serviceId 获取实例信息 +GET http://127.0.0.1:9001/dev-protocol-springcloud-gateway/ecommerce-nacos-client/hystrix/hystrix-observable-command?serviceId=e-commerce-nacos-client +Content-Type: application/json +e-commerce-user: eyJhbGciOiJSUzI1NiJ9.eyJlLWNvbW1lcmNlLXVzZXIiOiJ7XCJpZFwiOjEwLFwidXNlcm5hbWVcIjpcIlFpbnlpQGltb29jLmNvbVwifSIsImp0aSI6IjJlMTgwYzA2LWIwZGQtNDJjYy1iNzk5LTZiNGI4N2Q3NTM3NCIsImV4cCI6MTYyNTQxNDQwMH0.P8gKWcwiibEmq80idCl9QzUaqJnQ7FVQ5yxzlMLfRNcG3nWMYh0o1kBO2vKvDGG8BofQ4__xn210R2P7zjH-uEn7hic0jbBt97vLkzvATnFegxaDSjUp9At9BIGl9Ecu7RPCwSQJFdw6NBMBz02Uom8yvHpUJEfv8_jZRurBp94tzES6IAACKC6NFq-3_mQfT4o_zA51U4hBbIBw6qNXvMSqK-VtaqkTNFfJsP_8Y0nmQck0jxmgdtLfRVfZCCp3rhcLNDBX37THQI6U7lvNFETceAKyJ5NFaA8p68lw_3D2IiZER1jEU3M2QIMQGeU0pmQ6IPwGDdA0MP5IKKzj8A +token: imooc diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/NetflixHystrix.md b/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/NetflixHystrix.md index 11924a2..ac687ef 100644 --- a/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/NetflixHystrix.md +++ b/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/NetflixHystrix.md @@ -21,25 +21,72 @@ - 请求依赖项失败后,可以选择出错或者是兜底回退 ### 使用注解方式实现服务的容错、降级 - +--- +- SpringCloud Netflix Hystrix 的三种模式 + - Hystrix 的断路器模式和后备策略模式 + - 断路器模式:设置超时或者失败等熔断策略 + - 后备策略模式:断路器模式触发之后,如果存在后备策略,则执行后备 + - Hystrix 的舱壁模式:Hystrix 舱壁模式的启发:货船为了进行防止漏水和火灾的扩散,会将货仓分隔为多个当发生灾害时,将所在货仓进行隔离就可以降低整艘船的风险 + - 舱壁模式功能就是:我们可以通过为各个服务分别指定线程池 + - 每一个远程资源调用都被放置在自己的线程池中,每一个线程池只有一定数量的线程来处理远程调用 + - 一个性能低下的服务,只会影响到同一个线程池中的其他服务调用。所以降低了会产生的负面影响 ### 使用编程方式实现服务的容错、降级 - [NacosClientHystrixCommand.java] - [NacosClientHystrixObservableCommand.java] ### 编程方式开启 Hystrix 请求缓存 - +- Hystrix 的结果缓存指的是在一次 Hystrix 的请求上下文中 +- Hystrix 请求缓存的两种实现方式 + - 编程(继承 HystrixCommand)方式,重写 getCacheKey 方法即可 + - 注解方式 + - @CacheResult:该注解用来标记请求命令返回的结果应该被缓存,它必须与@HystrixCommand注解结合使用, 属性: cacheKeyMethod + - @CacheRemove: 该注解用来让请求命令的缓存失效,失效的缓存根据commandKey进行查找。属性: commandKey,cacheKeyMethod + - @CacheKey: 该注解用来在请求命令的参数上标记,使其作为cacheKey,如果没有使用此注解则会使用所有参数列表中的参数作为cacheKey, 属性: value ### 注解方式开启 Hystrix 请求缓存 - - +- ### 编程方式应用 Hystrix 请求合并 -- - +- 默认情况下,每一个请求都会占用一个线程和一次网络请求,高并发场景下效率不高\ +- 使用 Hystrix 的请求合并,将多个请求 merge 为一个,提高服务的并发能力 +--- +- 请求合并的适用场景与注意事项 + - 适用场景:单个对象的查询并发数很高,服务提供方负载较高,就可以考虑使用请求合并 + - 注意事项 + - 请求在代码中人为的设置了延迟时间,会降低请求的响应速度 + - 可能会提高服务提供方的负载,因为返回 List 结果数据量偏大 + - 实现请求合并比较复杂 ### 注解方式应用 Hystrix 请求合并 - 使用注解的方式比较多 ### OpenFeign 集成 Hystrix 开启后备模式 - - +- OpenFeign 集成 Hystrix 的步骤 + - 在配置文件中开启 Hystrix 的熔断功能:feign.hystrix.enabled: true + - @FeignClient 注解的 fallback 和 fallbackFactory 属性 + - fallback 和 fallbackFactory 都是用于配置响应回退,但是不可以同时使用 + - fallbackFactory 能够获取到 OpenFeign 调用抛出的异常 ### 使用 Hystrix 监控面板监测客户端容错 - -### SpringCloud Netflix Hystrix 容错组件总结 \ No newline at end of file +- Hystrix Dashboard 是一个单独的应用,用来实时的对 Hystrix 的『使用情况』进行实时的监控 +### SpringCloud Netflix Hystrix 容错组件总结 +- ![Hystrix工作流程图.png](pic/Hystrix工作流程图.png) +--- +- Hystrix 完整的工作流程 + - 构造-个 HystrixCommand 或者 HystrixObservableCommand 对象 + - 表示对一个对依赖项请求的包装 + - 执行命令获取响应 + - execute():阻塞,直到收到响应或者抛出异常, 同步执行的, 调用的是 queue().get() + - queue():返回一个 Future, 异步执行的, 调用的是 observable.toBlocking().toFuture() + - observe():订阅代表响应的 Observable + - toObservable():返回一个 Observable,当你订阅它以后,将会执行Hystrix 命令并且推送它的响应 + - 总结: 最终每一个 HystrixCommand, 都是 Observable 的实现 + - 响应是否已经被缓存 + - 如果请求在缓存中的结果是存在的, 该请求在缓存中对应的结果是可用的, 缓存就会立即以一个 Observable 的形式被返回 + - 断路器是否打开 + - 缓存不存在的时候, 当你执行命令的时候, Hystrix 检查断路器是否打开, 如果打开, 不会执行任何命令, 执行回退逻辑, 如果是关闭, 检查容量是否可用 + - 线程池、信号量是否已经使用率 100% + - 判断, 线程池和信号量是否已经满了, 如果满了, 不会执行命令, 立马执行回退逻辑 + - HystrixObservableCommand.construct() or HystrixCommand.run() + - 对依赖项的调用请求, 真正的逻辑编写在这里, run 会返回一个响应, 或者抛出一个异常, construct 会返回一个 Observable 对象, 会推送一个响应或者一个 ERROR 通知, 会抛出一个 Timeout 异常 + - 计算电路健康 + - Hystrix 报告成功, 失败, 拒绝, 超时给断路器, 断路器会维护一组计算统计的计数器, 断路器会用这些统计数据来决定, 什么时候要跳闸, 后续的所有请求都会被短路, 直到一个恢复周期耗尽以后, 在第一次检查健康检查之后, 才会重新打开电路 + - 回退或返回成功响应 + - 一, 当你失败以后, HystrixCommand 会回退一个单一的回退值, HystrixObservableCommand 会返回一个或者多个回退值, 通过 fallback, 当 fallback 有异常也会被进一步抛出, 给调用者发送 ERROR 通知, 命令调用者进行处理 + - 二, 成功会直接抛出响应给调用者, 返回一个 Observable \ No newline at end of file diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/pic/Hystrix工作流程图.png b/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/pic/Hystrix工作流程图.png new file mode 100644 index 0000000000000000000000000000000000000000..639892f81be68555a2d9a611e68d2ec8fbbc2def GIT binary patch literal 136126 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%0A@|hVTL&HJjB)! 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

n*BSo0CNPT-_ej;iyZ_f1qGitZe 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 RIf8=xq{S7)s=gZr{vR`?qP+kB literal 0 HcmV?d00001 diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/src/main/java/org/example/service/AuthorityFeignClientHystrixDemo.java b/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/src/main/java/org/example/service/AuthorityFeignClientHystrixDemo.java index bc684ae..02cedd5 100644 --- a/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/src/main/java/org/example/service/AuthorityFeignClientHystrixDemo.java +++ b/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/src/main/java/org/example/service/AuthorityFeignClientHystrixDemo.java @@ -1,6 +1,7 @@ package org.example.service; import org.example.service.hystrix.bak.AuthorityFeignClientFallback; +import org.example.service.hystrix.bak.AuthorityFeignClientFallbackFactory; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -12,8 +13,8 @@ import org.springframework.web.bind.annotation.RequestMethod; @FeignClient( // contextId 是对 FeignClient 的声明, 每一个进行的通信都要进行定义, value 表示需要进行通信的服务id是什么 contextId = "AuthorityFeignClient", value = "e-commerce-authority-center", - fallback = AuthorityFeignClientFallback.class -// fallbackFactory = AuthorityFeignClientFallbackFactory.class +// fallback = AuthorityFeignClientFallback.class, // fixme fallback 和 fallbackFactory 只能使用一个 + fallbackFactory = AuthorityFeignClientFallbackFactory.class ) public interface AuthorityFeignClientHystrixDemo { diff --git a/pom.xml b/pom.xml index 3d14b7d..d1d50db 100644 --- a/pom.xml +++ b/pom.xml @@ -62,6 +62,7 @@ dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk dev-protocol-springcloud/dev-protocol-springcloud-project-goods-service dev-protocol-springcloud/dev-protocol-springcloud-hystrix + dev-protocol-springcloud/dev-protocol-springcloud-hystrix-dashboard From d87b716acedba7583d0170c9c1de41ea2fa03e94 Mon Sep 17 00:00:00 2001 From: qyx <565485304@qq.com> Date: Wed, 4 Sep 2024 16:35:53 +0800 Subject: [PATCH 4/6] =?UTF-8?q?feat(master):=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 文档补充 --- .../SpringCloud项目介绍.md | 3 ++- .../SpringCloud-Stream.md | 23 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-stream/SpringCloud-Stream.md diff --git a/dev-protocol-springcloud/SpringCloud项目介绍.md b/dev-protocol-springcloud/SpringCloud项目介绍.md index a48e422..e4af839 100644 --- a/dev-protocol-springcloud/SpringCloud项目介绍.md +++ b/dev-protocol-springcloud/SpringCloud项目介绍.md @@ -10,7 +10,8 @@ - 分布式链路、日志追踪 - (Sleuth + Zipkin) - [dev-protocol-springcloud-sleuth-zipkin](dev-protocol-springcloud-sleuth-zipkin) - 微服务容错 - (SpringCloud Netflix Hystrix) - - todo + - [dev-protocol-springcloud-hystrix](dev-protocol-springcloud-hystrix) + - [dev-protocol-springcloud-hystrix-dashboard](dev-protocol-springcloud-hystrix-dashboard) - 消息驱动微服务 - (SpringCloud Stream) - todo - 分布式事务 - (SpringCloud Alibaba Seata) diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-stream/SpringCloud-Stream.md b/dev-protocol-springcloud/dev-protocol-springcloud-stream/SpringCloud-Stream.md new file mode 100644 index 0000000..fd4d062 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-stream/SpringCloud-Stream.md @@ -0,0 +1,23 @@ +## 基于 SpringCloud Stream 构建消息驱动微服务 + + + +### SpringBoot 集成 Kafka 构建消息驱动微服务 + + +### SpringBoot 集成 RocketMQ 构建消息驱动微服务 + + +### SpringCloud Stream 消息驱动组件概览 + + +### 基于 SpringCloud Stream 消息驱动的简单应用 + + +### 自定义 Stream 消息通信信道实现定制分发 + + +### SpringCloud Stream 消息分组和消费分区的配置与说明 + + +### SpringCloud Stream 消息驱动组件总结 From 02898b00e4ebe88601cde4400ad4bc75b3a8321c Mon Sep 17 00:00:00 2001 From: qyx <565485304@qq.com> Date: Thu, 5 Sep 2024 18:04:33 +0800 Subject: [PATCH 5/6] =?UTF-8?q?feat(master):kafka=20=E6=80=BB=E7=BB=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit kafka 的相关代码 --- .../SpringCloud-Stream.md | 4 +- .../pom.xml | 99 +++++++++++++++++++ .../main/java/org/example/Application.java | 14 +++ .../example/controller/KafkaController.java | 41 ++++++++ .../java/org/example/kafka/KafkaConfig.java | 81 +++++++++++++++ .../java/org/example/kafka/KafkaConsumer.java | 56 +++++++++++ .../java/org/example/kafka/KafkaProducer.java | 77 +++++++++++++++ .../main/java/org/example/vo/QMessage.java | 27 +++++ .../src/main/resources/application-dev.yml | 49 +++++++++ .../src/main/resources/bootstrap.yml | 16 +++ .../main/resources/http/kafka-controller.http | 7 ++ .../resources/http/rocket-mq-controller.http | 15 +++ .../resources/http/transactional-lose.http | 7 ++ pom.xml | 1 + 14 files changed, 492 insertions(+), 2 deletions(-) rename dev-protocol-springcloud/{dev-protocol-springcloud-stream => dev-protocol-springcloud-message-study}/SpringCloud-Stream.md (99%) create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-message-study/pom.xml create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/Application.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/controller/KafkaController.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/kafka/KafkaConfig.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/kafka/KafkaConsumer.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/kafka/KafkaProducer.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/vo/QMessage.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/resources/application-dev.yml create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/resources/bootstrap.yml create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/resources/http/kafka-controller.http create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/resources/http/rocket-mq-controller.http create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/resources/http/transactional-lose.http diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-stream/SpringCloud-Stream.md b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/SpringCloud-Stream.md similarity index 99% rename from dev-protocol-springcloud/dev-protocol-springcloud-stream/SpringCloud-Stream.md rename to dev-protocol-springcloud/dev-protocol-springcloud-message-study/SpringCloud-Stream.md index fd4d062..f15be38 100644 --- a/dev-protocol-springcloud/dev-protocol-springcloud-stream/SpringCloud-Stream.md +++ b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/SpringCloud-Stream.md @@ -3,10 +3,10 @@ ### SpringBoot 集成 Kafka 构建消息驱动微服务 - +- ### SpringBoot 集成 RocketMQ 构建消息驱动微服务 - +- ### SpringCloud Stream 消息驱动组件概览 diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-message-study/pom.xml b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/pom.xml new file mode 100644 index 0000000..6a62ee6 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/pom.xml @@ -0,0 +1,99 @@ + + + 4.0.0 + + org.example + dev-protocol + 1.0-SNAPSHOT + ../../pom.xml + + + dev-protocol-springcloud-message-study + 1.0-SNAPSHOT + jar + + dev-protocol-springcloud-message-study + MQ 学习实践 + + + 8 + 8 + UTF-8 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.projectlombok + lombok + true + + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.springframework.cloud + spring-cloud-context + 2.2.6.RELEASE + + + + org.springframework.kafka + spring-kafka + 2.5.0.RELEASE + + + + org.apache.rocketmq + rocketmq-spring-boot-starter + 2.1.0 + + + org.apache.commons + commons-lang3 + 3.11 + + + + mysql + mysql-connector-java + 8.0.19 + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + + ${artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + + \ No newline at end of file diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/Application.java b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/Application.java new file mode 100644 index 0000000..5d8dbdc --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/Application.java @@ -0,0 +1,14 @@ +package org.example; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + *

工程启动入口

+ * */ +@SpringBootApplication +public class Application { + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} \ No newline at end of file diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/controller/KafkaController.java b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/controller/KafkaController.java new file mode 100644 index 0000000..43daacc --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/controller/KafkaController.java @@ -0,0 +1,41 @@ +package org.example.controller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; +import org.example.kafka.KafkaProducer; +import org.example.vo.QMessage; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + *

SpringBoot 集成 kafka 发送消息

+ * */ +@Slf4j +@RestController +@RequestMapping("/kafka") +public class KafkaController { + + private final ObjectMapper mapper; + private final KafkaProducer kafkaProducer; + + public KafkaController(ObjectMapper mapper, KafkaProducer kafkaProducer) { + this.mapper = mapper; + this.kafkaProducer = kafkaProducer; + } + + /** + *

发送 kafka 消息

+ * */ + @GetMapping("/send-message") + public void sendMessage(@RequestParam(required = false) String key, + @RequestParam String topic) throws Exception { + + QMessage message = new QMessage( + 1, + "q-Study-Message" + ); + kafkaProducer.sendMessage(key, mapper.writeValueAsString(message), topic); + } +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/kafka/KafkaConfig.java b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/kafka/KafkaConfig.java new file mode 100644 index 0000000..2882d17 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/kafka/KafkaConfig.java @@ -0,0 +1,81 @@ +package org.example.kafka; + +import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.clients.producer.ProducerConfig; +import org.apache.kafka.common.serialization.StringDeserializer; +import org.apache.kafka.common.serialization.StringSerializer; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory; +import org.springframework.kafka.core.*; + +import java.util.HashMap; +import java.util.Map; + +/** + *

通过代码自定义 Kafka 配置

+ * + * 复杂不会怎么更改的配置信息最好以代码的方式进行配置 + * 一般一些常用的改动的配置, 直接放在配置文件中 + * */ +@Configuration +public class KafkaConfig { + + @Value("${spring.kafka.bootstrap-servers}") + private String bootstrapServers; + + /** + *

Kafka Producer 工厂类配置

+ * */ + @Bean + public ProducerFactory producerFactory() { + + Map configs = new HashMap<>(); + configs.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers); + configs.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class); + configs.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class); + + return new DefaultKafkaProducerFactory<>(configs); + } + + /** + *

Kafka Producer 客户端

+ * */ + @Bean + public KafkaTemplate kafkaTemplate() { + return new KafkaTemplate<>(producerFactory()); + } + + /** + *

Kafka Consumer 工厂类配置

+ * */ + @Bean + public ConsumerFactory consumerFactory() { + + Map props = new HashMap<>(); + props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers); + // 因为配置为拉取模式, 最多拉取 50条记录 + props.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, 50); + props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); + props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); + + return new DefaultKafkaConsumerFactory<>(props); + } + + /** + *

Kafka Consumer 监听器工厂类配置

+ * */ + @Bean + public ConcurrentKafkaListenerContainerFactory + kafkaListenerContainerFactory() { + + ConcurrentKafkaListenerContainerFactory factory = + new ConcurrentKafkaListenerContainerFactory<>(); + // 并发数就是一个消费者实例起几个线程 + factory.setConcurrency(3); + factory.setConsumerFactory(consumerFactory()); + + return factory; + } +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/kafka/KafkaConsumer.java b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/kafka/KafkaConsumer.java new file mode 100644 index 0000000..1d911ae --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/kafka/KafkaConsumer.java @@ -0,0 +1,56 @@ +package org.example.kafka; + +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; +import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.example.vo.QMessage; +import org.springframework.kafka.annotation.KafkaListener; +import org.springframework.stereotype.Component; + +import java.util.Optional; + +/** + *

Kafka 消费者

+ * */ +@Slf4j +@Component +public class KafkaConsumer { + + private final ObjectMapper mapper; + + public KafkaConsumer(ObjectMapper mapper) { + this.mapper = mapper; + } + + /** + *

监听 Kafka 消息并消费

+ * */ + @KafkaListener(topics = {"qinyi-springboot"}, groupId = "qinyi-springboot-kafka") + public void listener01(ConsumerRecord record) throws Exception { + + String key = record.key(); + String value = record.value(); + + QMessage kafkaMessage = mapper.readValue(value, QMessage.class); + log.info("in listener01 consume kafka message: [{}], [{}]", + key, mapper.writeValueAsString(kafkaMessage)); + } + + /** + *

监听 Kafka 消息并消费

+ * 不知道发送的类是什么类型的时候发送的 + * */ + @KafkaListener(topics = {"qinyi-springboot"}, groupId = "qinyi-springboot-kafka-1") + public void listener02(ConsumerRecord record) throws Exception { + + Optional _kafkaMessage = Optional.ofNullable(record.value()); + if (_kafkaMessage.isPresent()) { + Object message = _kafkaMessage.get(); + // 如果不能确定类型的时候, 下面的代码要进行包装 + QMessage kafkaMessage = mapper.readValue(message.toString(), + QMessage.class); + log.info("in listener02 consume kafka message: [{}]", + mapper.writeValueAsString(kafkaMessage)); + } + } +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/kafka/KafkaProducer.java b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/kafka/KafkaProducer.java new file mode 100644 index 0000000..b63987c --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/kafka/KafkaProducer.java @@ -0,0 +1,77 @@ +package org.example.kafka; + +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.kafka.support.SendResult; +import org.springframework.stereotype.Component; +import org.springframework.util.concurrent.ListenableFuture; + +import java.util.concurrent.TimeUnit; + +/** + *

kafka 生产者

+ * */ +@Slf4j +@Component +public class KafkaProducer { + + private final KafkaTemplate kafkaTemplate; + + public KafkaProducer(KafkaTemplate kafkaTemplate) { + this.kafkaTemplate = kafkaTemplate; + } + + /** + *

发送 kafka 消息

+ * */ + public void sendMessage(String key, String value, String topic) { + + if (StringUtils.isBlank(value) || StringUtils.isBlank(topic)) { + throw new IllegalArgumentException("value or topic is null or empty"); + } + + ListenableFuture> future = StringUtils.isBlank(key) ? + kafkaTemplate.send(topic, value) : kafkaTemplate.send(topic, key, value); + + // 异步回调的方式获取通知 + future.addCallback( + success -> { + // 元数据信息不为空 + assert null != success && null != success.getRecordMetadata(); + // 发送到 kafka 的 topic + String _topic = success.getRecordMetadata().topic(); + // 消息发送到的分区 + int partition = success.getRecordMetadata().partition(); + // 消息在分区内的 offset + long offset = success.getRecordMetadata().offset(); + + log.info("send kafka message success: [{}], [{}], [{}]", + _topic, partition, offset); + }, failure -> { + log.error("send kafka message failure: [{}], [{}], [{}]", + key, value, topic); + } + ); + // future 支持多次获取消息, 不需要重新发送消息 + + // 同步等待的方式获取通知 + try { +// SendResult sendResult = future.get(); + SendResult sendResult = future.get(5, TimeUnit.SECONDS); + + // 发送到 kafka 的 topic + String _topic = sendResult.getRecordMetadata().topic(); + // 消息发送到的分区 + int partition = sendResult.getRecordMetadata().partition(); + // 消息在分区内的 offset + long offset = sendResult.getRecordMetadata().offset(); + + log.info("send kafka message success: [{}], [{}], [{}]", + _topic, partition, offset); + } catch (Exception ex) { + log.error("send kafka message failure: [{}], [{}], [{}]", + key, value, topic); + } + } +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/vo/QMessage.java b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/vo/QMessage.java new file mode 100644 index 0000000..7d4c20f --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/vo/QMessage.java @@ -0,0 +1,27 @@ +package org.example.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + *

通过 Kafka 传递的消息对象

+ * */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class QMessage { + + /** + * 唯一的标识一个消息对象 + */ + private Integer id; + + /** + * 项目名称 + */ + private String projectName; + + // todo 自己进行扩展 + +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/resources/application-dev.yml b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/resources/application-dev.yml new file mode 100644 index 0000000..9695606 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/resources/application-dev.yml @@ -0,0 +1,49 @@ +server: + port: 8001 + servlet: + context-path: /dev-protocol-springcloud-message-study + +spring: + # SpringBoot 集成 Kafka 的配置, 最低配置只需要配置 spring.kafka.bootstrap-servers + kafka: + bootstrap-servers: 127.0.0.1:9092 + jpa: + show-sql: true + hibernate: + ddl-auto: none + properties: + hibernate.show_sql: true + hibernate.format_sql: true + open-in-view: false + datasource: + # 数据源 + url: jdbc:mysql://127.0.0.1:3306/dev_protocol_springcloud_project?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8 + username: root + password: root + type: com.zaxxer.hikari.HikariDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + # 连接池 + hikari: + maximum-pool-size: 8 + minimum-idle: 4 + idle-timeout: 30000 + connection-timeout: 30000 + max-lifetime: 45000 + auto-commit: true + pool-name: devProtocolSpringcloudHikariCP +# consumer: + # 如果 Consumer 没有指定 group-id, 则使用配置文件中配置的; 如果配置文件中也没有定义, 则由框架随机生成 +# group-id: imooc-study-ecommerce +# auto-offset-reset: latest +# key-deserializer: org.apache.kafka.common.serialization.StringDeserializer +# value-deserializer: org.apache.kafka.common.serialization.StringDeserializer +# producer: +# key-serializer: org.apache.kafka.common.serialization.StringSerializer +# value-serializer: org.apache.kafka.common.serialization.StringSerializer + +# RocketMQ 的配置, 这是最低配置 +rocketmq: + name-server: 127.0.0.1:9876 + producer: + # 发送同一类消息的设置为同一个 group, 保证唯一 + group: dev-protocol-springcloud-message-study diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/resources/bootstrap.yml b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..2366e3d --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/resources/bootstrap.yml @@ -0,0 +1,16 @@ +spring: + profiles: + # prod, dev + active: dev + application: + name: dev-protocol-springcloud-message-study + +# 暴露端点 +management: + endpoints: + web: + exposure: + include: '*' + endpoint: + health: + show-details: always diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/resources/http/kafka-controller.http b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/resources/http/kafka-controller.http new file mode 100644 index 0000000..6d183bd --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/resources/http/kafka-controller.http @@ -0,0 +1,7 @@ +### kafka-send-message +GET http://127.0.0.1:8001/dev-protocol-springcloud-message-study/kafka/send-message?key=qqq&topic=q-springboot +Content-Type: application/json + +### kafka-send-message - (测试kafka 支持无key消息, key 是用来分区的) +GET http://127.0.0.1:8001/dev-protocol-springcloud-message-study/kafka/send-message?topic=q-springboot +Content-Type: application/json diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/resources/http/rocket-mq-controller.http b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/resources/http/rocket-mq-controller.http new file mode 100644 index 0000000..3fd0c0b --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/resources/http/rocket-mq-controller.http @@ -0,0 +1,15 @@ +### message-with-value +GET http://127.0.0.1:8001/imooc-study-ecommerce-dev/rocket-mq/message-with-value +Content-Type: application/json + +### message-with-key +GET http://127.0.0.1:8001/imooc-study-ecommerce-dev/rocket-mq/message-with-key +Content-Type: application/json + +### message-with-tag +GET http://127.0.0.1:8001/imooc-study-ecommerce-dev/rocket-mq/message-with-tag +Content-Type: application/json + +### message-with-all +GET http://127.0.0.1:8001/imooc-study-ecommerce-dev/rocket-mq/message-with-all +Content-Type: application/json diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/resources/http/transactional-lose.http b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/resources/http/transactional-lose.http new file mode 100644 index 0000000..de7d991 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/resources/http/transactional-lose.http @@ -0,0 +1,7 @@ +### wrong-rollback-for +GET http://127.0.0.1:8001/imooc-study-ecommerce-dev/transactional-lose/wrong-rollback-for +Content-Type: application/json + +### wrong-inner-call +GET http://127.0.0.1:8001/imooc-study-ecommerce-dev/transactional-lose/wrong-inner-call +Content-Type: application/json diff --git a/pom.xml b/pom.xml index d1d50db..fb471b6 100644 --- a/pom.xml +++ b/pom.xml @@ -63,6 +63,7 @@ dev-protocol-springcloud/dev-protocol-springcloud-project-goods-service dev-protocol-springcloud/dev-protocol-springcloud-hystrix dev-protocol-springcloud/dev-protocol-springcloud-hystrix-dashboard + dev-protocol-springcloud/dev-protocol-springcloud-message-study From 08b87590cd9d03c805da746fd75c77205ac55e4a Mon Sep 17 00:00:00 2001 From: qyx <565485304@qq.com> Date: Fri, 6 Sep 2024 16:52:40 +0800 Subject: [PATCH 6/6] =?UTF-8?q?feat(master):RMQ=20=E6=80=BB=E7=BB=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit RMQ 的相关代码 --- .../SpringCloud-Stream.md | 29 +++-- .../controller/RocketMQController.java | 51 +++++++++ .../rocket/RocketMQConsumerMessageExt.java | 29 +++++ .../rocket/RocketMQConsumerObject.java | 27 +++++ .../rocket/RocketMQConsumerString.java | 28 +++++ .../rocket/RocketMQConsumerTagString.java | 28 +++++ .../org/example/rocket/RocketMQProducer.java | 100 ++++++++++++++++++ .../resources/http/rocket-mq-controller.http | 8 +- .../src/main/resources/bootstrap.yml | 12 +-- 9 files changed, 296 insertions(+), 16 deletions(-) create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/controller/RocketMQController.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/rocket/RocketMQConsumerMessageExt.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/rocket/RocketMQConsumerObject.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/rocket/RocketMQConsumerString.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/rocket/RocketMQConsumerTagString.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/rocket/RocketMQProducer.java diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-message-study/SpringCloud-Stream.md b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/SpringCloud-Stream.md index f15be38..703e3f7 100644 --- a/dev-protocol-springcloud/dev-protocol-springcloud-message-study/SpringCloud-Stream.md +++ b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/SpringCloud-Stream.md @@ -3,21 +3,38 @@ ### SpringBoot 集成 Kafka 构建消息驱动微服务 -- +- 下载安装 kafka +- 下载 Kafka :https://kafka.apache.org/quickstart +- 解压、启动 ZK 和 Kafka Server 即可(使用默认配置) +--- +- 基本架构 + - Producer -> Message[Topic] -> Kafka Broker -> Partition <- Consumer[Topic] ### SpringBoot 集成 RocketMQ 构建消息驱动微服务 -- +- 下载、安装 RocketMQ + - 下载 RocketMQ: http://rocketmg.apache.org/docs/quick-start + - 下载以 bin-release 结尾的 zip 包解压即完成安装 +--- +- MQ 的启动, 关注2个 + - mqnamesrv + - sh mqnamesrv + - mqbroker + - sh mqbroker -n localhost:9876 ### SpringCloud Stream 消息驱动组件概览 - +- 为什么会出现 SpringCloud Stream + - 如果没有 SpringCloud Stream,我们会怎么应用消息驱动? + - Producer -> Message -> Kafka/RocketMQ <- Consumer + - 有了Stream + - Producer -> Message -> [Kafka/RocketMQ][Stream] <- Consumer ### 基于 SpringCloud Stream 消息驱动的简单应用 - +- [dev-protocol-springcloud-stream](..%2Fdev-protocol-springcloud-stream) ### 自定义 Stream 消息通信信道实现定制分发 - +- [dev-protocol-springcloud-stream](..%2Fdev-protocol-springcloud-stream) ### SpringCloud Stream 消息分组和消费分区的配置与说明 - +- [dev-protocol-springcloud-stream](..%2Fdev-protocol-springcloud-stream) ### SpringCloud Stream 消息驱动组件总结 diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/controller/RocketMQController.java b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/controller/RocketMQController.java new file mode 100644 index 0000000..8d2bb65 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/controller/RocketMQController.java @@ -0,0 +1,51 @@ +package org.example.controller; + +import com.alibaba.fastjson.JSON; +import lombok.extern.slf4j.Slf4j; +import org.example.rocket.RocketMQProducer; +import org.example.vo.QMessage; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + *

SpringBoot 集成 RocketMQ

+ * */ +@Slf4j +@RestController +@RequestMapping("/rocket-mq") +public class RocketMQController { + + private static final QMessage RocketMQMessage = new QMessage( + 1, + "Q-Study-RocketMQ-In-SpringBoot" + ); + + private final RocketMQProducer rocketMQProducer; + + public RocketMQController(RocketMQProducer rocketMQProducer) { + this.rocketMQProducer = rocketMQProducer; + } + + @GetMapping("/message-with-value") + public void sendMessageWithValue() { + rocketMQProducer.sendMessageWithValue(JSON.toJSONString(RocketMQMessage)); + } + + @GetMapping("/message-with-key") + public void sendMessageWithKey() { + rocketMQProducer.sendMessageWithKey("qy", JSON.toJSONString(RocketMQMessage)); + } + + @GetMapping("/message-with-tag") + public void sendMessageWithTag() { + rocketMQProducer.sendMessageWithTag("qy", + JSON.toJSONString(RocketMQMessage)); + } + + @GetMapping("/message-with-all") + public void sendMessageWithAll() { + rocketMQProducer.sendMessageWithAll("q", "q", + JSON.toJSONString(RocketMQMessage)); + } +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/rocket/RocketMQConsumerMessageExt.java b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/rocket/RocketMQConsumerMessageExt.java new file mode 100644 index 0000000..69a832f --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/rocket/RocketMQConsumerMessageExt.java @@ -0,0 +1,29 @@ +package org.example.rocket; + +import com.alibaba.fastjson.JSON; +import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.common.message.MessageExt; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.springframework.stereotype.Component; + +/** + *

第三个 RocketMQ 消费者,

+ * */ +@Slf4j +@Component +@RocketMQMessageListener( + topic = "q-study-rocketmq", + consumerGroup = "q-springboot-rocketmq-message-ext" +) +public class RocketMQConsumerMessageExt implements RocketMQListener { + + @Override + public void onMessage(MessageExt message) { + + String value = new String(message.getBody()); + log.info("consume message in RocketMQConsumerMessageExt: [{}], [{}]", + message.getKeys(), value); // 能拿到消息中的 key + log.info("MessageExt: [{}]", JSON.toJSONString(message)); // 会慢一些 + } +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/rocket/RocketMQConsumerObject.java b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/rocket/RocketMQConsumerObject.java new file mode 100644 index 0000000..1a58319 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/rocket/RocketMQConsumerObject.java @@ -0,0 +1,27 @@ +package org.example.rocket; + +import com.alibaba.fastjson.JSON; +import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.example.vo.QMessage; +import org.springframework.stereotype.Component; + +/** + *

第四个, RocketMQ 消费者, 指定消费带有 tag 的消息, 且消费的是 Java Pojo

+ * */ +@Slf4j +@Component +@RocketMQMessageListener( + topic = "imooc-study-rocketmq", + consumerGroup = "q-springboot-rocketmq-tag-object", + selectorExpression = "q" // 根据 tag 做过滤 +) +public class RocketMQConsumerObject implements RocketMQListener { + @Override + public void onMessage(QMessage message) { + log.info("consume message in RocketMQConsumerObject: [{}]", + JSON.toJSONString(message)); + // so something + } +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/rocket/RocketMQConsumerString.java b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/rocket/RocketMQConsumerString.java new file mode 100644 index 0000000..5c274bd --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/rocket/RocketMQConsumerString.java @@ -0,0 +1,28 @@ +package org.example.rocket; + +import com.alibaba.fastjson.JSON; +import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.example.vo.QMessage; +import org.springframework.stereotype.Component; + +/** + *

第一个 RocketMQ 消费者

+ * */ +@Slf4j +@Component +@RocketMQMessageListener( + topic = "q-study-rocketmq", + consumerGroup = "q-springboot-rocketmq-string" +) +public class RocketMQConsumerString implements RocketMQListener { + + @Override + public void onMessage(String message) { + + QMessage rocketMessage = JSON.parseObject(message, QMessage.class); + log.info("consume message in RocketMQConsumerString: [{}]", + JSON.toJSONString(rocketMessage)); + } +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/rocket/RocketMQConsumerTagString.java b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/rocket/RocketMQConsumerTagString.java new file mode 100644 index 0000000..c5a8f7d --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/rocket/RocketMQConsumerTagString.java @@ -0,0 +1,28 @@ +package org.example.rocket; + +import com.alibaba.fastjson.JSON; +import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.example.vo.QMessage; +import org.springframework.stereotype.Component; + +/** + *

第二个 RocketMQ 消费者, 指定了消费带有 tag 的消息

+ * */ +@Slf4j +@Component +@RocketMQMessageListener( + topic = "q-study-rocketmq", + consumerGroup = "q-springboot-rocketmq-tag-string", + selectorExpression = "qy" // 根据 tag 过滤, tag 中要带有 qy +) +public class RocketMQConsumerTagString implements RocketMQListener { + @Override + public void onMessage(String message) { + + QMessage rocketMessage = JSON.parseObject(message, QMessage.class); + log.info("consume message in RocketMQConsumerTagString: [{}]", + JSON.toJSONString(rocketMessage)); + } +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/rocket/RocketMQProducer.java b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/rocket/RocketMQProducer.java new file mode 100644 index 0000000..13711ff --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/java/org/example/rocket/RocketMQProducer.java @@ -0,0 +1,100 @@ +package org.example.rocket; + +import com.alibaba.fastjson.JSON; +import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.client.producer.SendCallback; +import org.apache.rocketmq.client.producer.SendResult; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.apache.rocketmq.spring.support.RocketMQHeaders; +import org.example.vo.QMessage; +import org.springframework.messaging.Message; +import org.springframework.messaging.support.MessageBuilder; +import org.springframework.stereotype.Component; + +/** + *

通过 RocketMQ 发送消息

+ * Spring Messaging 模块 + * */ +@Slf4j +@Component +public class RocketMQProducer { + + /** 类似 Kafka 中的 topic, 默认的读写队列都是4个, 默认自动创建topic */ + private static final String TOPIC = "q-study-rocketmq"; + + /** RocketMQ 客户端 */ + private final RocketMQTemplate rocketMQTemplate; + + public RocketMQProducer(RocketMQTemplate rocketMQTemplate) { + this.rocketMQTemplate = rocketMQTemplate; + } + + /** + *

使用同步的方式发送消息, 不指定 key 和 tag

+ * */ + public void sendMessageWithValue(String value) { + + // 随机选择一个 Topic 的 Message Queue 发送消息 + SendResult sendResult = rocketMQTemplate.syncSend(TOPIC, value); + log.info("sendMessageWithValue result: [{}]", JSON.toJSONString(sendResult)); + + SendResult sendResultOrderly = rocketMQTemplate.syncSendOrderly( + TOPIC, value, "QQQ" + ); + log.info("sendMessageWithValue orderly result: [{}]", + JSON.toJSONString(sendResultOrderly)); + } + + /** + *

使用异步的方式发送消息, 指定 key

+ * */ + public void sendMessageWithKey(String key, String value) { + + Message message = MessageBuilder.withPayload(value) + // 这个Key 不是分区的效果, 只是方便进行查询, 在设置的时候, 可以使用空格进行分开, 例如: aaaa bbb + .setHeader(RocketMQHeaders.KEYS, key).build(); + + // 异步发送消息, 并设定回调 + rocketMQTemplate.asyncSend(TOPIC, message, new SendCallback() { + + @Override + public void onSuccess(SendResult sendResult) { + log.info("sendMessageWithKey success result: [{}]", + JSON.toJSONString(sendResult)); + } + + @Override + public void onException(Throwable e) { + log.error("sendMessageWithKey failure: [{}]", e.getMessage(), e); + } + }); + } + + /** + *

使用同步的方式发送消息, 带有 tag, 且发送的是 Java Pojo

+ * 发送消息可以定义自己的消息数据结构 + * */ + public void sendMessageWithTag(String tag, String value) { + + QMessage qMessage = JSON.parseObject(value, QMessage.class); + SendResult sendResult = rocketMQTemplate.syncSend( + String.format("%s:%s", TOPIC, tag), // 不同的消费者组使用不同的 tag + qMessage + ); + log.info("sendMessageWithTag result: [{}]", JSON.toJSONString(sendResult)); + } + + /** + *

使用同步的方式发送消息, 带有 key 和 tag

+ * */ + public void sendMessageWithAll(String key, String tag, String value) { + + Message message = MessageBuilder.withPayload(value) + .setHeader(RocketMQHeaders.KEYS, key).build(); + SendResult sendResult = rocketMQTemplate.syncSend( + String.format("%s:%s", TOPIC, tag), + message + ); + log.info("sendMessageWithAll result: [{}]", JSON.toJSONString(sendResult)); + } +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/resources/http/rocket-mq-controller.http b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/resources/http/rocket-mq-controller.http index 3fd0c0b..dc3cd2d 100644 --- a/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/resources/http/rocket-mq-controller.http +++ b/dev-protocol-springcloud/dev-protocol-springcloud-message-study/src/main/resources/http/rocket-mq-controller.http @@ -1,15 +1,15 @@ ### message-with-value -GET http://127.0.0.1:8001/imooc-study-ecommerce-dev/rocket-mq/message-with-value +GET http://127.0.0.1:8001/dev-protocol-springcloud-message-study/rocket-mq/message-with-value Content-Type: application/json ### message-with-key -GET http://127.0.0.1:8001/imooc-study-ecommerce-dev/rocket-mq/message-with-key +GET http://127.0.0.1:8001/dev-protocol-springcloud-message-study/rocket-mq/message-with-key Content-Type: application/json ### message-with-tag -GET http://127.0.0.1:8001/imooc-study-ecommerce-dev/rocket-mq/message-with-tag +GET http://127.0.0.1:8001/dev-protocol-springcloud-message-study/rocket-mq/message-with-tag Content-Type: application/json ### message-with-all -GET http://127.0.0.1:8001/imooc-study-ecommerce-dev/rocket-mq/message-with-all +GET http://127.0.0.1:8001/dev-protocol-springcloud-message-study/rocket-mq/message-with-all Content-Type: application/json diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-stream/src/main/resources/bootstrap.yml b/dev-protocol-springcloud/dev-protocol-springcloud-stream/src/main/resources/bootstrap.yml index 775c208..500ebe9 100644 --- a/dev-protocol-springcloud/dev-protocol-springcloud-stream/src/main/resources/bootstrap.yml +++ b/dev-protocol-springcloud/dev-protocol-springcloud-stream/src/main/resources/bootstrap.yml @@ -12,7 +12,7 @@ spring: discovery: enabled: true # 如果不想使用 Nacos 进行服务注册和发现, 设置为 false 即可 server-addr: 127.0.0.1:8848 - namespace: 1bc13fd5-843b-4ac0-aa55-695c25bc0ac6 + namespace: 1ccc74ae-9398-4dbe-b9d7-4f9addf9f40c metadata: management: context-path: ${server.servlet.context-path}/actuator @@ -27,15 +27,15 @@ spring: # rocketmq: # binder: # name-server: 127.0.0.1:9876 - # fixme 开启 stream 分区支持 + # 开启 stream 分区支持 instanceCount: 1 # 消费者的总数 - instanceIndex: 0 # 当前消费者的索引 + instanceIndex: 0 # 当前消费者的索引, 多个的时候, 另外一个要配置成 1, 依次类推 bindings: # 默认发送方 output: # 这里用 Stream 给我们提供的默认 output 信道 destination: dev-protocol-springcloud-stream-client-default # 消息发往的目的地, Kafka 中就是 Topic content-type: text/plain # 消息发送的格式, 接收端不用指定格式, 但是发送端要 - # fixme 消息分区 + # 消息分区 - 只对默认接收方和发送方进行配置, 下面自定义的原理相同 producer: # fixme partitionKeyExpression 这种方式需要我们需要对 author 字段进行各种处理, 这里不使用这个方式, 使用下面自定义的配置策略 # partitionKeyExpression: payload.author # 分区关键字, payload 指的是发送的对象, author 是对象中的属性, 不存在 author 可能会报错 @@ -46,9 +46,9 @@ spring: # 默认接收方 input: # 这里用 Stream 给我们提供的默认 input 信道 destination: dev-protocol-springcloud-stream-client-default - # fixme 这里指定了group 方便其进行 分组消费 + # 这里指定了group 方便其进行 分组消费 group: dev-protocol-springcloud-stream-client-group-default - # fixme 消费者开启 分区支持 + # 消费者开启 分区支持 consumer: partitioned: true # q 发送方 destination 对应