微服务Cloud架构快速集成Nacos,Gateway,OpenFeign,Seata,Sentinel,MQ笔记

微服务架构介绍

微服务简介

image-20250709093100071

  1. 微服务 是一种架构风格,代表着一种通过将应用程序拆分为小型、独立的功能模块(服务)的开发方式。
  2. 每个模块(服务)实现独立的业务功能不限语言,不限技术;服务之间通过轻量级的通信机制(例如 HTTP/REST 或消息队列)进行交互。
  3. 微服务架构的核心思想是:解耦应用程序,提升灵活性和维护性

微服务的优点

  1. 模块独立解耦
  2. 独立部署、快速迭代
  3. 灵活技术栈
  4. 高扩展性
  5. 容错性好

缺点:

分布式系统复杂性(服务器成本,开发人员成本, 运维成本 增加)

.SpringCloud Alibaba

imgimage-20250709093128973

Spring Cloud 以微服务为核心的分布式系统构建标准

  • 这么多小服务,如何管理他们?(服务治理 注册中心[服务注册 发现 剔除]) nacos
  • 这么多小服务,他们之间如何通讯? feign
  • 这么多小服务,客户端怎么访问他们?(网关) gateway
  • 这么多小服务,一旦出现问题了,应该如何自处理?(容错) sentinel
  • 这么多小服务,一旦出现问题了,应该如何排错? (链路追踪) skywalking
  • 这么多小服务,怎么保证同一组事务一的致性? seata

项目介绍

image-20250709093036981

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 针对大流量的削峰填谷能力。

前置知识要求:

  1. 熟练使用 Maven 管理依赖和项目构建。
  2. 熟悉 Spring Boot 基础知识。
  3. 熟练使用 IDEA 开发环境。

环境要求:

  1. Spring Boot 3.1.5
    • 基于最新的 Spring Framework 6.x。
    • 支持现代化开发模式,帮助开发更加高效。
  1. 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 组件来作为大规模分布式系统的服务注册中心

image-20250709093022548

本地安装方式

具体启动方式参考 Nacos 官网。

Nacos Server 启动成功之后,浏览器地址栏输入 http://ip:8848/nacos 查看 Nacos 控制台(默认账号名和密码为 nacos/nacos):

image-20250709093011742

直接下载: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

img

启动 Nacos Server

  1. 启动 Nacos Server,进入下载到本地并解压完成后的文件夹(使用源码构建的方式则进入编译打包好的文件夹),再进去其相对文件夹 nacos/bin,并对照操作系统实际情况执行如下命令。详情参考此文档

    1. Linux/Unix/Mac 操作系统,执行命令
sh startup.sh -m standalone
    1. Windows 操作系统,执行命令
cmd startup.cmd
  1. 访问 Nacos Server Console

浏览器输入地址 http://127.0.0.1:8848/nacos首次登陆需要绑定 nacos 用户,因为新版本增加了鉴权,需要应用注册和配置绑定时配置用户名和密码。

Nacos 应用示例

Spring Cloud Alibaba Nacos Config

应用接入

在启动应用示例进行项目功能演示之前,先了解一下 Spring Cloud 应用如何接入 Nacos Config 作为服务配置中心。

注意 本章节只是为了便于理解接入方式,本示例代码中已经完成接入工作,无需再进行修改。

  1. 首先,修改 pom.xml 文件,引入 spring-cloud-starter-alibaba-nacos-config ;
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
  1. 在应用的 /src/main/resources/application.yaml 配置文件中配置 Nacos 地址并引入服务配置;
spring:
  cloud:
    nacos:
      serverAddr: 127.0.0.1:8848 
  config:
    import:
      - optional:nacos:${spring.application.name}.yaml

optional:代表文件不存在不会报错

随意添加配置测试:

image-20250709092957066

Spring Cloud Alibaba Nacos Discovery

官网:Nacos 融合 Spring Cloud,成为注册配置中心

如何接入

在启动 Nacos Discovery 示例进行演示之前,了解一下 Spring Cloud 应用如何接入 Nacos Discovery。

注意 本章节只是为了便于您理解接入方式,本示例代码中已经完成接入工作,您无需再进行修改。

  1. 首先,修改 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 地址;

  1. spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
  2. 使用 @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;
        }
    }
}

应用启动

  1. 增加配置,项目的 /src/main/resources/application.properties 中添加基本配置信息;
spring:
  application:
    name: xxx-server
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
  1. 启动应用,支持 IDE 直接启动和编译打包后启动。

    1. IDE直接启动:找到 nacos-discovery-provider-example 项目的主类 ProviderApplication,执行 main 方法启动应用。

image-20250709092942783

服务发现集成 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

  1. 添加 @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。

  1. 完成以上配置后,将两者自动注入到 TestController 中。
@RestController
public class TestController {

    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private StockFeignService stockFeignService;
 
}

3.启动应用

验证

  1. 在浏览器地址栏中输入 http://127.0.0.1:18083/echo-rest/1234,点击跳转,可以看到浏览器显示了 nacos-discovery-provider-example 返回的消息 "hello Nacos Discovery 1234",证明服务发现生效。

  1. 在浏览器地址栏中输入 http://127.0.0.1:18083/echo-feign/12345,点击跳转,可以看到浏览器显示 nacos-discovery-provider-example 返回的消息 "hello Nacos Discovery 12345",证明服务发现生效。

img

更多配置项
配置项 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。

注意 本章节只是为了便于您理解接入方式,本示例代码中已经完成接入工作,您无需再进行修改。

  1. 首先,修改 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 地址

  1. 在应用的 /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/**
  1. 使用 @EnableDiscoveryClient 注解开启服务注册与发现功能
@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }

}

应用启动

Seata

​ 主要干: 分布式事务

  1. 点击这个页面 Seata 官网 Github,下载最新版本的 Seata Server 端

image-20250709092747873

Server端存储模式(store.mode)现有file、db、redis、raft,

raft部署方式请访问专门部署文档

注:

  • file模式为单机模式,全局事务会话信息内存中读写并异步(默认)持久化本地文件root.data,性能较高;
  • db模式为高可用模式,全局事务会话信息通过db共享,相应性能差些;
  • redis模式Seata-Server 1.3及以上版本支持,性能较高,存在事务信息丢失风险,请提前配置合适当前场景的redis持久化配置.

file模式:

1. file模式无需改动,直接启动即可

  1. 运行 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模式:

  1. 为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
  1. 新增nacos配置文件:

创建:group: SEATA_GROUP data-id: seataServer.properties

image-20250709092732849

    1. 将: script/config-center/config.txt 复制到 seataServer.properties
    2. 再追加如下内容
service.vgroupMapping.order-server-tx-group=default
service.vgroupMapping.stock-server-tx-group=default
  1. 导入 seata-server db 模式所需要的数据库表

seata-server-2.0.0\seata\script\server\db\mysql.sql

  1. 在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

image-20250709092715663

主要干: 服务限流! 熔断降级!

官方文档:introduction | Sentinel

Sentinel 控制台

Sentinel 提供了开箱即用的控制台:img

开启该功能需要 3 个步骤:

获取控制台

您可以从 Release 页面 下载最新版本的控制台 jar 包。

image-20250709092640477

启动控制台

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

整合微服务

  1. 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

​ 主要干: 异步、解耦、限流

image-20250709092536000

安装并启动

  1. 下载 RocketMQ 最新的二进制文件,并解压。 5.1.4

解压后的目录结构如下:

apache-rocketmq

├── LICENSE

├── NOTICE

├── README.md

├── benchmark

├── bin

├── conf

└── lib
  1. 启动 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

```

原理

image-20250709092517151

测试发送与接受消息

  1. 创建测试主题(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

创建生产者

  1. 相关配置

在应用的 /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
  1. 发送消息

通过@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

  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
  1. 接收消息

通过 @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 的简单示例

posted @ 2025-07-09 09:35  张大帅Java  阅读(143)  评论(0)    收藏  举报