微服务Cloud架构快速集成Nacos,Gateway,OpenFeign,Seata,Sentinel,MQ笔记
微服务架构介绍
微服务简介
- 微服务 是一种架构风格,代表着一种通过将应用程序拆分为小型、独立的功能模块(服务)的开发方式。
- 每个模块(服务)实现独立的业务功能不限语言,不限技术;服务之间通过轻量级的通信机制(例如 HTTP/REST 或消息队列)进行交互。
- 微服务架构的核心思想是:解耦应用程序,提升灵活性和维护性。
微服务的优点
- 模块独立解耦:
- 独立部署、快速迭代:
- 灵活技术栈:
- 高扩展性:
- 容错性好:
缺点:
分布式系统复杂性(服务器成本,开发人员成本, 运维成本 增加)
.SpringCloud Alibaba
Spring Cloud 以微服务为核心的分布式系统构建标准
- 这么多小服务,如何管理他们?(服务治理 注册中心[服务注册 发现 剔除]) nacos
- 这么多小服务,他们之间如何通讯? feign
- 这么多小服务,客户端怎么访问他们?(网关) gateway
- 这么多小服务,一旦出现问题了,应该如何自处理?(容错) sentinel
- 这么多小服务,一旦出现问题了,应该如何排错? (链路追踪) skywalking
- 这么多小服务,怎么保证同一组事务一的致性? seata
项目介绍
1. Spring Cloud Gateway:网关
Spring Cloud GateWay 是微服务模块的网关,整合 Nacos,实现动态路由的配置。通过监听 Nacos 配置的改变,实现服务网关路由配置动态刷新,每次路由信息变更,无需修改配置文件而后重启服务。
2. Nacos:服务注册和配置中心
Nacos 是 SCA 微服务模块的服务注册中心和配置中心。整合 Spring Cloud Gateway,所有的微服务模块都注册到 Nacos 中进行服务注册与发现。
3. Sentinel:熔断限流
用于点赞场景的服务熔断限流。整合 Nacos 配置中心与 Spring Cloud Gateway,实现指定路由规则、熔断限流规则动态配置。
4. Seata:分布式事务
基于 Seata 的 AT 模式,用于库存模块,账户模块,订单模块的分布式事务处理。当库存不足/账户余额不足时,进行事务回滚。
5. RocketMQ:消息队列,削峰填谷
用于进行点赞服务流量的削峰填谷。通过将大流量的点赞请求从生产者发送到 mq,消费者模块从 mq 中拉取进行一定频率的消费,不是简单的直接服务熔断限流降级,实现 RocketMQ 针对大流量的削峰填谷能力。
前置知识要求:
- 熟练使用 Maven 管理依赖和项目构建。
- 熟悉 Spring Boot 基础知识。
- 熟练使用 IDEA 开发环境。
环境要求:
- Spring Boot 3.1.5:
-
- 基于最新的 Spring Framework 6.x。
- 支持现代化开发模式,帮助开发更加高效。
- JDK 17 或更高版本:
Spring Boot 3.x 开始要求 Java 17 作为最低运行环境。
Spring Boot 与 Spring Cloud Alibaba 版本对应关系
- 2023.x 分支对应的是 Spring Cloud 2023 与 Spring Boot 3.2.x,最低支持 JDK 17。
请根据您使用的 Spring Boot 版本,选择兼容的 Spring Cloud Alibaba 版本
Spring Boot Version | Spring Cloud Alibaba Version | Spring Cloud Version |
---|---|---|
3.0.2 | 2022.0.0.0 | Spring Cloud 2022.0.0 |
3.0.2 | 2022.0.0.0-RC2 | Spring Cloud 2022.0.0 |
3.0.0 | 2022.0.0.0-RC1 | Spring Cloud 2022.0.0 |
2.6.13 | 2021.0.5.0 | Spring Cloud 2021.0.5 |
2.6.11 | 2021.0.4.0 | Spring Cloud 2021.0.4 |
2.6.3 | 2021.0.1.0 | Spring Cloud 2021.0.1 |
2.4.2 | 2021.1 | Spring Cloud 2020.0.1 |
2.3.12.RELEASE | 2.2.10-RC1 | Spring Cloud Hoxton.SR12 |
2.3.12.RELEASE | 2.2.9.RELEASE | Spring Cloud Hoxton.SR12 |
2.3.12.RELEASE | 2.2.8.RELEASE | Spring Cloud Hoxton.SR12 |
2.3.12.RELEASE | 2.2.7.RELEASE | Spring Cloud Hoxton.SR12 |
2.3.2.RELEASE | 2.2.6.RELEASE | Spring Cloud Hoxton.SR9 |
2.2.5.RELEASE | 2.2.1.RELEASE | Spring Cloud Hoxton.SR3 |
2.2.X.RELEASE | 2.2.0.RELEASE | Spring Cloud Hoxton.RELEASE |
2.1.13.RELEASE | 2.1.4.RELEASE | Spring Cloud Greenwich.SR6 |
2.1.X.RELEASE | 2.1.2.RELEASE | Spring Cloud Greenwich |
2.0.X.RELEASE | 2.0.4.RELEASE(停止维护,建议升级) | Spring Cloud Finchley |
1.5.X.RELEASE | 1.5.1.RELEASE(停止维护,建议升级) | Spring Cloud Edgware |
代码示例
gitee地址: https://gitee.com/xscodeit/xs-springcloudalibaba-2024.git
如何使用
如果需要使用已发布的版本,在 dependencyManagement
中添加如下配置。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2023.0.1.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2023.0.3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Nacos
服务发现是微服务架构体系中最关键的组件之一。如果尝试着用手动的方式来给每一个客户端来配置所有服务提供者的服务列表是一件非常困难的事,而且也不利于 服务的动态扩缩容。Nacos Discovery Starter 可以帮助您将服务自动注册到 Nacos 服务端并且能够动态感知和刷新某个服务实例的服务列表。除此之外,Nacos Discovery Starter 也将服务实例自身的一些元数据信息,例如 host、port,健康检查 URL,主页等注册到 Nacos 。Spring Cloud Alibaba Nacos Discovery 通过一些简单的注解,快速来注册一个服务,并使用经过双十一考验的 Nacos 组件来作为大规模分布式系统的服务注册中心。
本地安装方式
具体启动方式参考 Nacos 官网。
Nacos Server 启动成功之后,浏览器地址栏输入 http://ip:8848/nacos
查看 Nacos 控制台(默认账号名和密码为 nacos/nacos):
直接下载:Nacos Server 下载页
配置 Nacos Server
打开 \nacos-server-2.3.2\conf\application.properties
配置文件,修改以下配置项:
配置数据源
此处以 MySQL 数据库为例,使用 nacos-server-2.3.2\conf\mysql-schema.sql
初始化数据库表文件。同时修改以下配置
#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
db.user.0=root
db.password.0=root
### Connection pool configuration: hikariCP
db.pool.config.connectionTimeout=30000
db.pool.config.validationTimeout=10000
db.pool.config.maximumPoolSize=20
db.pool.config.minimumIdle=2
修改为:单机启动
nacos-server-2.3.2\bin\startup.cmd
启动 Nacos Server
-
启动 Nacos Server,进入下载到本地并解压完成后的文件夹(使用源码构建的方式则进入编译打包好的文件夹),再进去其相对文件夹
nacos/bin
,并对照操作系统实际情况执行如下命令。详情参考此文档。 -
- Linux/Unix/Mac 操作系统,执行命令
sh startup.sh -m standalone
-
- Windows 操作系统,执行命令
cmd startup.cmd
- 访问 Nacos Server Console
浏览器输入地址 http://127.0.0.1:8848/nacos ,首次登陆需要绑定 nacos 用户,因为新版本增加了鉴权,需要应用注册和配置绑定时配置用户名和密码。
Nacos 应用示例
Spring Cloud Alibaba Nacos Config
应用接入
在启动应用示例进行项目功能演示之前,先了解一下 Spring Cloud 应用如何接入 Nacos Config 作为服务配置中心。
注意 本章节只是为了便于理解接入方式,本示例代码中已经完成接入工作,无需再进行修改。
- 首先,修改
pom.xml
文件,引入 spring-cloud-starter-alibaba-nacos-config ;
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
- 在应用的
/src/main/resources/application.yaml
配置文件中配置 Nacos 地址并引入服务配置;
spring:
cloud:
nacos:
serverAddr: 127.0.0.1:8848
config:
import:
- optional:nacos:${spring.application.name}.yaml
optional:代表文件不存在不会报错
随意添加配置测试:
Spring Cloud Alibaba Nacos Discovery
官网:Nacos 融合 Spring Cloud,成为注册配置中心
如何接入
在启动 Nacos Discovery 示例进行演示之前,了解一下 Spring Cloud 应用如何接入 Nacos Discovery。
注意 本章节只是为了便于您理解接入方式,本示例代码中已经完成接入工作,您无需再进行修改。
- 首先,修改
pom.xml
文件,引入 spring-cloud-alibaba-nacos-discovery-starter;
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
在应用的 /src/main/resources/application.properties
配置文件中配置 Nacos Server 地址;
- spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
- 使用 @EnableDiscoveryClient 注解开启服务注册与发现功能;
@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
@RestController
class EchoController {
@GetMapping(value = "/echo/{string}")
public String echo(@PathVariable String string) {
return string;
}
}
}
应用启动
- 增加配置,项目的
/src/main/resources/application.properties
中添加基本配置信息;
spring:
application:
name: xxx-server
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
-
启动应用,支持 IDE 直接启动和编译打包后启动。
-
- IDE直接启动:找到 nacos-discovery-provider-example 项目的主类
ProviderApplication
,执行 main 方法启动应用。
- IDE直接启动:找到 nacos-discovery-provider-example 项目的主类
服务发现集成 Spring Cloud Loadbalancer
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
</dependencies>
增加如下配置,使用 Spring Cloud Alibaba 社区针对 Spring Cloud Loadbalancer 负载均衡依赖提供的负载均衡策略,以便使用 Spring Cloud Alibaba 提供的所有的能力:
spring.cloud.loadbalancer.ribbon.enabled=false
spring.cloud.loadbalancer.nacos.enabled=true
- 添加 @LoadBalanced 注解,使得 RestTemplate 接入 Ribbon
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
集成OpenFeign
依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
启动类加入:
@EnableFeignClients
feign接口
@FeignClient(name="stock-server",path ="/stock")
public interface StockFeignService {
// 声明需要调用的rest接口对应的方法
@RequestMapping("/reduct")
String reduct();
使用 @FeignClient 注解将 EchoService 这个接口包装成一个 FeignClient,属性 name 对应服务名 service-provider。
- 完成以上配置后,将两者自动注入到 TestController 中。
@RestController
public class TestController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private StockFeignService stockFeignService;
}
3.启动应用
验证
- 在浏览器地址栏中输入 http://127.0.0.1:18083/echo-rest/1234,点击跳转,可以看到浏览器显示了 nacos-discovery-provider-example 返回的消息 "hello Nacos Discovery 1234",证明服务发现生效。
- 在浏览器地址栏中输入 http://127.0.0.1:18083/echo-feign/12345,点击跳转,可以看到浏览器显示 nacos-discovery-provider-example 返回的消息 "hello Nacos Discovery 12345",证明服务发现生效。
更多配置项
配置项 | key | 默认值 | 说明 |
---|---|---|---|
服务端地址 | spring.cloud.nacos.discovery.server-addr | ||
服务名 | spring.cloud.nacos.discovery.service | $ | 注册到Nacos上的服务名称,默认值为应用名称 |
权重 | spring.cloud.nacos.discovery.weight | 1 | 取值范围 1 到 100,数值越大,权重越大 |
网卡名 | spring.cloud.nacos.discovery.network-interface | 当IP未配置时,注册的IP为此网卡所对应的IP地址,如果此项也未配置,则默认取第一块网卡的地址 | |
注册的IP地址 | spring.cloud.nacos.discovery.ip | 优先级最高 | |
注册的IP地址类型 | spring.cloud.nacos.discovery.ip-type | 双栈地址 | 可以配置IPv4和IPv6两种类型,如果网卡同类型IP地址存在多个,希望制定特定网段地址,可使用spring.cloud.inetutils.preferred-networks 配置筛选地址 |
注册的端口 | spring.cloud.nacos.discovery.port | -1 | 默认情况下不用配置,会自动探测 |
命名空间 | spring.cloud.nacos.discovery.namespace | 常用场景之一是不同环境的注册的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。 | |
AccessKey | spring.cloud.nacos.discovery.access-key | ||
SecretKey | spring.cloud.nacos.discovery.secret-key | ||
Metadata | spring.cloud.nacos.discovery.metadata | 使用Map格式配置 | |
日志文件名 | spring.cloud.nacos.discovery.log-name | ||
集群 | spring.cloud.nacos.discovery.cluster-name | DEFAULT | Nacos集群名称 |
接入点 | spring.cloud.nacos.discovery.endpoint | 地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址 | |
是否集成LoadBalancer | spring.cloud.loadbalancer.nacos.enabled | false | |
是否开启Nacos Watch | spring.cloud.nacos.discovery.watch.enabled | false | 可以设置成true来开启 watch |
是否启用Nacos | spring.cloud.nacos.discovery.enabled | true | 默认启动,设置为false时会关闭自动向Nacos注册的功能 |
Spring Cloud Gateway
如何接入
在启动示例进行演示之前,了解一下 Spring Cloud 应用如何接入 Spring Cloud 如何接入 Nacos Discovery、Spring Cloud Gateway。
注意 本章节只是为了便于您理解接入方式,本示例代码中已经完成接入工作,您无需再进行修改。
- 首先,修改
pom.xml
文件,引入 Spring Cloud Alibaba Nacos Discovery Starter、Spring Cloud Gateway Starter。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
在应用的 /src/main/resources/application.properties
配置文件中配置 Nacos Server 地址
- 在应用的
/src/main/resources/application.properties
配置文件中配置 Spring Cloud Gateway 路由
# 还需要注册中心、配置中心
spring:
cloud:
gateway:
#路由规则
routes:
- id: order_route # 路由的唯一标识,路由到order
uri: lb://order-server #需要转发的地址 lb: 使用nacos中的本地负载均衡策略 order-service服务名
#断言规则 用于路由规则的匹配
predicates:
- Path=/order/**
- 使用 @EnableDiscoveryClient 注解开启服务注册与发现功能
@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
应用启动
Seata
主要干: 分布式事务
- 点击这个页面 Seata 官网 Github,下载最新版本的 Seata Server 端
Server端存储模式(store.mode)现有file、db、redis、raft,
raft部署方式请访问专门部署文档
注:
- file模式为单机模式,全局事务会话信息内存中读写并异步(默认)持久化本地文件root.data,性能较高;
- db模式为高可用模式,全局事务会话信息通过db共享,相应性能差些;
- redis模式Seata-Server 1.3及以上版本支持,性能较高,存在事务信息丢失风险,请提前配置合适当前场景的redis持久化配置.
file模式:
1. file模式无需改动,直接启动即可
- 运行 bin/seata-server.bat 启动 Seata server。
2. 在order和stock服务分别配置:
依赖spring-cloud-starter-alibaba-seata
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
红色部分改成对应的服务名
seata:
application-id: ${spring.application.name}
tx-service-group: ${spring.application.name}-group
service:
vgroup-mapping:
stock-server-group: default
grouplist:
default: 127.0.0.1:8091
运行测试即可
db模式:
- 为seata配置nacos、 数据库
seata-server-2.0.0\seata\conf\application.yml
seata:
# nacos配置
config:
type: nacos
nacos:
server-addr: 127.0.0.1:8848
namespace:
# group: SEATA_GROUP
username: nacos
password: nacos
context-path:
data-id: seata.properties
##if use MSE Nacos with auth, mutex with username/password attribute
#access-key:
#secret-key:
registry:
# nacos配置
type: nacos
nacos:
application: seata-server
server-addr: 127.0.0.1:8848
# group: SEATA_GROUP
namespace:
cluster: default
username: nacos
password: nacos
store:
# support: file 、 db 、 redis 、 raft
mode: db
session:
mode: db
lock:
mode: db
db:
datasource: druid
db-type: mysql
driver-class-name: com.mysql.jdbc.Driver 对应的数据库驱动
url: jdbc:mysql://127.0.0.1:3306/seata?rewriteBatchedStatements=true
user: mysql
password: mysql
min-conn: 10
max-conn: 100
global-table: global_table
branch-table: branch_table
lock-table: lock_table
distributed-lock-table: distributed_lock
query-limit: 1000
max-wait: 5000
- 新增nacos配置文件:
创建:group: SEATA_GROUP data-id: seataServer.properties
-
- 将: script/config-center/config.txt 复制到 seataServer.properties
- 再追加如下内容
service.vgroupMapping.order-server-tx-group=default
service.vgroupMapping.stock-server-tx-group=default
- 导入 seata-server db 模式所需要的数据库表
seata-server-2.0.0\seata\script\server\db\mysql.sql
- 在order和stock服务分别配置:
依赖spring-cloud-starter-alibaba-seata
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
红色部分改成对应的服务名
seata:
# seata 服务分组,要与服务端配置service.vgroup_mapping的后缀对应
tx-service-group: default_tx_group
registry:
# 指定nacos作为注册中心
type: nacos
nacos:
application: seata-server
server-addr: 127.0.0.1:8848
namespace: seata
group: SEATA_GROUP
config:
# 指定nacos作为配置中心
type: nacos
nacos:
server-addr: 127.0.0.1:8848
namespace: seata
group: SEATA_GROUP
data-id: seataServer.properties
运行测试即可
Sentinel
主要干: 服务限流! 熔断降级!
Sentinel 控制台
Sentinel 提供了开箱即用的控制台:
开启该功能需要 3 个步骤:
获取控制台
您可以从 Release 页面 下载最新版本的控制台 jar 包。
启动控制台
Sentinel 控制台是一个标准的 Spring Boot 应用,以 Spring Boot 的方式运行 jar 包即可。
Terminal window
$ java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -jar sentinel-dashboard.jar
如若 8080 端口冲突,可使用 -Dserver.port=新端口 进行设置。
也可以在应用的配置文件中,增加如下控制台配置信息:
spring:
cloud:
sentinel:
transport:
port: 8719
dashboard: localhost:8080
整合微服务
- sentinel 的 starter 依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
yml配置:
spring:
cloud:
sentinel:
transport:
# 添加sentinel的控制台地址
dashboard: tlmall-sentinel-dashboard:8888
\2. 如果是mvc的接口无需 @SentinelResource. 如果是业务方法, 需要 @SentinelResource
@SentinelResource("hello")
public String hello() {
return "Hello Sentinel";
}
@SentinelResource 注解用来标识资源是否被限流、降级。上述例子上该注解的属性 hello 表示资源名。 @SentinelResource 还提供了其它额外的属性如 blockHandler,blockHandlerClass,fallback 用于表示限流或降级的操作,更多内容可以参考 Sentinel 注解支持。
OpenFeign
spring-cloud-starter-alibaba-sentinel 适配了 OpenFeign 组件。如果想使用,除了引入必要的 Starter 依赖外还需要在配置文件打开 sentinel 对 feign 的支持:feign.sentinel.enabled=true。
这是一个 FeignClient 的简单使用示例:
@FeignClient(name = "service-provider", fallback = EchoServiceFallback.class, configuration = FeignConfiguration.class)
public interface EchoService {
@GetMapping(value = "/echo/{str}")
String echo(@PathVariable("str") String str);
}
class FeignConfiguration {
@Bean
public EchoServiceFallback echoServiceFallback() {
return new EchoServiceFallback();
}
}
class EchoServiceFallback implements EchoService {
@Override
public String echo(@PathVariable("str") String str) {
return "echo fallback";
}
}
Spring Cloud Gateway 支持
参考 Sentinel 网关限流。
若想跟 Sentinel Starter 配合使用,需要加上 spring-cloud-alibaba-sentinel-gateway 依赖,同时需要添加 spring-cloud-starter-gateway 依赖来让 spring-cloud-alibaba-sentinel-gateway 模块里的 Spring Cloud Gateway 自动化配置类生效:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
RocketMQ
主要干: 异步、解耦、限流
安装并启动
- 下载 RocketMQ 最新的二进制文件,并解压。 5.1.4
解压后的目录结构如下:
apache-rocketmq
├── LICENSE
├── NOTICE
├── README.md
├── benchmark
├── bin
├── conf
└── lib
- 启动 NameServer
Linux / Unix / Mac 操作系统,执行命令 :
```shell
$ nohup sh bin/mqnamesrv & tail -f ~/logs/rocketmqlogs/namesrv.log
```
Windows 操作系统,执行命令:
```
$ .\bin\mqnamesrv.cmd
```
\3. 启动 Broker
修改内存占用阈值:runbroker.cmd 里添加
set "JAVA_OPT=%JAVA_OPT% -Drocketmq.broker.diskSpaceWarningLevelRatio=0.99"
修改默认内存大小,最初修改512m,可以改成1024:
set "JAVA_OPT=%JAVA_OPT% -server -Xms1024m -Xmx1024m"
Linux / Unix / Mac 操作系统,执行命令 :
```bash
$ nohup sh bin/mqbroker -n localhost:9876 & tail -f ~/logs/rocketmqlogs/broker.log
```
Windows 操作系统,执行命令:
```
$ .\bin\mqbroker.cmd -n localhost:9876
```
原理
测试发送与接受消息
- 创建测试主题(TopicTest):
Linux / Unix / Mac 操作系统,执行命令 :
```shell
$ sh bin/mqadmin updatetopic -n localhost:9876 -t TestTopic -c DefaultCluster
```
Windows 操作系统,执行命令:
```
$ .\bin\mqadmin.cmd updatetopic -n localhost:9876 -t TopicTest -c DefaultCluster
```
\2. 发送消息:
Linux / Unix / Mac 操作系统,执行命令 :
```shell
$ sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
```
Windows 操作系统,执行命令:
```cmd
$ .\bin\tools.cmd org.apache.rocketmq.example.quickstart.Producer
```
发送成功后显示:SendResult [sendStatus=SEND_OK, msgId= ...
\3. 接收消息:
Linux / Unix / Mac 操作系统,执行命令 :
Terminal window
$ sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
Windows 操作系统,执行命令:
$ .\bin\tools.cmd org.apache.rocketmq.example.quickstart.Consumer
发送成功后显示:SendResult [sendStatus=SEND_OK, msgId= …
接收成功后显示:ConsumeMessageThread_%d Receive New Messages: [MessageExt…
广播消费示例
广播会发送消息给所有消费者。如果你想同一消费组下所有消费者接收到同一个 topic 下的消息,广播消费非常适合此场景。
引入依赖
需要在 pom.xml
文件中引入 group ID 为 com.alibaba.cloud
和 artifact ID 为 spring-cloud-starter-stream-rocketmq
的 starter:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rocketmq</artifactId>
</dependency>
更新主题(topic)
更新 RocketMQ 中的主题(topic)为广播模式。
Linux / Unix / Mac 操作系统,执行命令 :
Terminal window
$ sh bin/mqadmin updateTopic -n localhost:9876 -c DefaultCluster -t broadcast
Windows 操作系统,执行命令:
$ .\bin\mqadmin.cmd updateTopic -n localhost:9876 -c DefaultCluster -t broadcast
创建生产者
- 相关配置
在应用的 /src/main/resources/application.yaml
配置文件中完成 RocketMQ 广播消息生产者的相关配置。如下所示,对服务端口号、RocketMQ 的 NameServer 地址、消息发送的目标进行配置:
spring:
application:
name: integrated-provider
cloud:
nacos:
config:
file-extension: yaml
server-addr: 127.0.0.1:8848
discovery:
server-addr: 127.0.0.1:8848
stream:
bindings:
praise-output:
destination: PRAISE-TOPIC-01
content-type: application/json
rocketmq:
binder:
name-server: 127.0.0.1:9876
bindings:
praise-output:
producer:
group: test
config:
import: optional:nacos:integrated-provider.yaml
server:
port: 8015
- 发送消息
通过@Autowired
注解,将 StreamBridge 注入到应用程序中,以发送消息。在 producer 方法中,使用循环发送 100 条消息。每条消息都包含一个 key 和 headers,并创建一个 GenericMessage 对象作为消息体,然后使用 streamBridge.send 方法发送消息到名为 “producer-out-0” 的目标。
@RestController
@RequestMapping("/praise")
public class PraiseController {
private static final String BINDING_NAME = "praise-output";
@Autowired
private StreamBridge streamBridge;
@GetMapping({ "/rocketmq", "/sentinel" })
public boolean praise(@RequestParam Integer itemId) {
PraiseMessage message = new PraiseMessage();
message.setItemId(itemId);
Message<PraiseMessage> praiseMessage = MessageBuilder.withPayload(message)
.build();
return streamBridge.send(BINDING_NAME, praiseMessage);
}
}
创建消费者
启动两个消费者实例。
消费者 1
- 相关配置
在应用的 /src/main/resources/application.yaml
配置文件中完成 RocketMQ 广播消息消费者 1 的相关配置。如下所示,对服务端口号、消费者函数、RocketMQ 的 NameServer 地址、消息消费模式以及消费者分组进行配置:
spring:
application:
name: integrated-consumer
cloud:
nacos:
config:
file-extension: yaml
server-addr: 127.0.0.1:8848
discovery:
server-addr: 127.0.0.1:8848
stream:
function:
definition: consumer;
bindings:
consumer-in-0:
destination: PRAISE-TOPIC-01
content-type: application/json
group: praise-consumer-group-PRAISE-TOPIC-01
rocketmq:
binder:
name-server: 127.0.0.1:9876
bindings:
consumer-in-0:
consumer:
pullInterval: 4000
pullBatchSize: 4
config:
import: optional:nacos:integrated-provider.yaml
server:
port: 8014
- 接收消息
通过 @Bean
注解标记的 consumer 方法返回一个 Consumer 对象,用于处理接收到的消息。在 consumer 方法中,通过 Lambda 表达式定义了一个消费者函数,当接收到新消息时,做对应的业务逻辑。
@Configuration
public class ListenerAutoConfiguration {
@Bean
public Consumer<Message<PraiseMessage>> consumer(PraiseService praiseService) {
return msg -> {
praiseService.praiseItem(msg.getPayload().getItemId());
};
}
}
除了上述的广播消费应用,还可以进行顺序消费,延时消费,过滤消息,事务消息等应用,关于更多 RocketMQ 的简单示例