springcloud-stream

springcloud-stream

  • 官方定义Spring Cloud Stream是一个 构建消息驱动微服务的框架。应用程序通过inputs或者outputs与Spring Cloud Stream中binder对象交互。

  • 通过我们配置来binding(绑定) ,而Spring Cloud Stream的binder对象负责与消息中间件交互。所以,我们只需要搞清楚如何与Spring Cloud Stream交互就可以方便使用消息驱动的方式。

  • 通过使用Spring Integration来连接消息代理中间件以实现消息事件驱动。Spring Cloud Stream为-些供应商的消息中间件产品提供了个性的自动化配置实现,引用了发布-订阅、消费组、分区的三个核心概念。目前仅支持RabbitMQ、Kafka.

  • 官方架构图

在这里插入图片描述

​ 通过中间的binder进行传输

  • 分组以及持久化问题,为了保证有些服务不能同时消费一个inputs,需要对消费服务进行分组,默认情况下,多个消费服务是多个组,如有需要,可以在yml上配置group,分为一组

  • 案例

    • inputs端(provider端)

      • pom

        <dependencies>
        
        <!-- 引入stream-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
            </dependency>
        
            <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka-server -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
        
            <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
        
        
            <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-devtools -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <scope>runtime</scope>
                <optional>true</optional>
            </dependency>
        
            <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
        
            <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        
        
        
        </dependencies>
        
      • yml

        server:
          port: 8801
        
        spring:
          application:
            name: cloud-stream-provider
          cloud:
            stream:
              binders: # 在此处配置要绑定的rabbitmq的服务信息;
                defaultRabbit: # 表示定义的名称,用于于binding整合
                  type: rabbit # 消息组件类型
                  environment: # 设置rabbitmq的相关的环境配置
                    spring:
                    #注意rabbitmq的位置
                      rabbitmq:
                        host: localhost
                        port: 5672
                        username: guest
                        password: guest
              bindings: # 服务的整合处理
                output: # 这个名字是一个通道的名称
                  destination: studyExchange # 表示要使用的Exchange名称定义
                  content-type: application/json # 设置消息类型,本次为json,文本则设置“text/plain”
                  binder: defaultRabbit  # 设置要绑定的消息服务的具体设置
        
        eureka:
          client: # 客户端进行Eureka注册的配置
            service-url:
              defaultZone: http://localhost:7001/eureka
          instance:
            lease-renewal-interval-in-seconds: 2 # 设置心跳的时间间隔(默认是30秒)
            lease-expiration-duration-in-seconds: 5 # 如果现在超过了5秒的间隔(默认是90秒)
            instance-id: send-8801.com  # 在信息列表时显示主机名称
            prefer-ip-address: true     # 访问的路径变为IP地址
        
      • 编写service

        • 接口
        public interface IMessageProvider {
            public String send();
        }
        
        • 实现类impl

          //不用写service
          @EnableBinding(Source.class)//定义消息的推送源
          public class MessageProviderImpl implements IMessageProvider {
          
              @Resource
              private MessageChannel output; //消息发送管道
          
              //往管道发送消息
              @Override
              public String send() {
                  String id = UUID.randomUUID().toString();
                  //构建者模式
                  output.send(MessageBuilder.withPayload(id).build());
                  System.out.println(id);
                  return null;
              }
          }
          
      • 控制层

        @RestController
        public class SendMessageController {
        
            @Resource
            private IMessageProvider messageProvider;
        
        
            @GetMapping("/sendMessage")
            public String sendMessage(){
                return messageProvider.send();
            }
        }
        
    • output端(customer端)

      • pom(同上面一样)

      • yml

        server:
          port: 8802
        
        spring:
          application:
            name: cloud-stream-consumer
          cloud:
            stream:
              binders: # 在此处配置要绑定的rabbitmq的服务信息;
                defaultRabbit: # 表示定义的名称,用于于binding整合
                  type: rabbit # 消息组件类型
                  environment: # 设置rabbitmq的相关的环境配置
                    spring:
                      rabbitmq:
                        host: localhost
                        port: 5672
                        username: guest
                        password: guest
              bindings: # 服务的整合处理
                input: # 这个名字是一个通道的名称
                  destination: studyExchange # 表示要使用的Exchange名称定义
                  content-type: application/json # 设置消息类型,本次为json,文本则设置“text/plain”
                  binder: defaultRabbit  # 设置要绑定的消息服务的具体设置
                  group:  atguiguA
        eureka:
          client: # 客户端进行Eureka注册的配置
            service-url:
              defaultZone: http://localhost:7001/eureka
          instance:
            lease-renewal-interval-in-seconds: 2 # 设置心跳的时间间隔(默认是30秒)
            lease-expiration-duration-in-seconds: 5 # 如果现在超过了5秒的间隔(默认是90秒)
            instance-id: receive-8802.com  # 在信息列表时显示主机名称
            prefer-ip-address: true     # 访问的路径变为IP地址
        
      • controller

        @RestController
        @EnableBinding(Sink.class)
        public class ReceiveMessageListenerController {
        
            @Value("${server.port}")
            private String serverPort;
        
            //这个注解可以用来接收消息
            @StreamListener(Sink.INPUT)
            public void input(Message<String> message){
                System.out.println("消费者1号,接受:"+message.getPayload()+"\t port:"+serverPort);
            }
        }
        
      • 目前对stream这段还不是很熟悉,还需要加强

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值