美文网首页
SpringCloud 进阶:消息驱动之Spring Cloud

SpringCloud 进阶:消息驱动之Spring Cloud

作者: _兰陵笑笑生 | 来源:发表于2020-02-15 21:00 被阅读0次

    我的博客:程序员笑笑生,欢迎浏览博客!

       上一章 SpringCloud进阶:Spring Cloud Stream 核心组件当中,我们了解了Spring Cloud Stream的核心组件和Spring Integration的简介,本章我们将聊一聊消费者分组相关的知识。

    # 前言
    

     在实际的企业应用场景下,一条消息只能被一个消费者消费,但是在我们部署的应用中,通常会一个消费者应用部署了多台实例。Spring Cloud Stream利用消费者分组就解决这个问题,确保当生产者发送一条消息后,多个实例当中只有一个能够消费到这样的消息。

    一 、多实例未分组消费者测试

     在我们之前的章节中, SpringCloud进阶-消息驱动pring Cloud Stream中,我们创建了消费者服务:server-receiver和生产者:server-sender,接下来我们结合之前的注册中心Eureka搭建多实例的消费者,首先在server-receiver引入Eureka客户端的依赖:

      <dependency>
        <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    

     在resource目录下新建applicaiton-s1.yml 、applicaiton-s2.yml 通过applicaiton.yml中配置spring.profiles.active属性激活不同的配置文件:

    applicaiton-s1.yml

    spring:
      cloud:
        stream:
          bindings:
             input:
                destination: mytopic
                binder: defaultRabbit
          binders:
             defaultRabbit:
                 type: rabbit
                 environment:
                    spring:
                     rabbitmq:
                         host: localhost
                         port: 5672
    server:
      port: 8081
    
    
    eureka:
        instance:
          hostname: eureka7001.com  #eureka服务端的实例名称
          instance-id: receiver1
        client:
          service-url:
             # 与注册中心交互的url
            defaultZone: http://eureka7001.com:7001/eureka/
            enabled: true
    

    applicaiton-s2.yml

    spring:
      cloud:
        stream:
          bindings:
             input:
                destination: mytopic
                binder: defaultRabbit
          binders:
             defaultRabbit:
                 type: rabbit
                 environment:
                    spring:
                     rabbitmq:
                         host: localhost
                         port: 5672
    server:
      port: 8082
    
    eureka:
        instance:
          hostname: eureka7001.com  #eureka服务端的实例名称
          instance-id: receiver2
        client:
          service-url:
             # 与注册中心交互的url
            defaultZone: http://eureka7001.com:7001/eureka/
            enabled: true
    
    

     生产者:server-sender的代码不变化,也不需要注册到Eureak中,

    @RestController
    public class SenderController {
    
        @Autowired
        SenderSource source;
    
        @RequestMapping("/send")
        public String sender(String msg) {
            source.output().send(MessageBuilder.withPayload(msg).build());
            return "ok";
        }
    
    

     先后启动Eureak和服务消费者server-receiver 两 个实例,最后在启动生产者:server-sender,我们看看Eureka中:

    file

    显示了2个消费者,我们通过HTTP调用生产者的发送接口: http://localhost:8081/send?msg=test

    我们看到receiver1:日志

    file

    我们看到receiver2:日志

    file

    我们看到每个实例都会受到消息。这不是我们想要的,我们需要不管消费者服务有多少实例,确保只有一个实例消费信息。

    二、添加分组配置

    在Spring Cloud Stream中,如果不给消费者指定一个组Group,那么Spring Cloud Stream将会给当前的实例分配一个匿名的、独立的只有一个成员的消费组,这就导致了一个服务n个实例,就会有n个消费者分组

     怎么样去配置是的所有的实例都是一个组呢?我们可以通过配置 spring.cloud.stream.bindings.input.group=group1就可以实现,我们在applicaiton-s1.yml 和 applicaiton-s2.yml 添加:

    spring:
      cloud:
        stream:
          bindings:
             input:
               group: group1
    

     重启项目后,再次通过生产者发送消息后,就能确保只有一个消费者收到消息了。

    我们可以看到未分组之前是这样的:

    我们看到每个实例都会受到消息。这不是我们想要的,我们需要不管消费者服务有多少实例,确保只有一个实例消费信息。

    二、添加分组配置

    在Spring Cloud Stream中,如果不给消费者指定一个组Group,那么Spring Cloud Stream将会给当前的实例分配一个匿名的、独立的只有一个成员的消费组,这就导致了一个服务n个实例,就会有n个消费者分组

     怎么样去配置是的所有的实例都是一个组呢?我们可以通过配置 spring.cloud.stream.bindings.input.group=group1就可以实现,我们在applicaiton-s1.yml 和 applicaiton-s2.yml 添加:

    spring:
      cloud:
        stream:
          bindings:
             input:
               group: group1
    

     重启项目后,再次通过生产者发送消息后,就能确保只有一个消费者收到消息了。

    我们可以看到未分组之前是这样的:

    file

    分组之后:

    file

    总结

     本章主要是通过示例的方式,使用Spring Cloud Stream如何实现消费者分组,这也是在实际的开发中需要考虑的问题。

    ----END----

      .以就是本期的分享,你还可以关注公众号: 程序员笑笑生,关注更多精彩内容!

    file file

    SpringCloud基础教程(一)-微服务与SpringCloud

    SpringCloud基础教程(二)-服务发现 Eureka

    SpringCloud基础教程(三)-Eureka进阶

    SpringCloud 基础教程(四)-配置中心入门

    SpringCloud基础教程(五)-配置中心热生效和高可用

    SpringCloud 基础教程(六)-负载均衡Ribbon

    SpringCloud 基础教程(七)-Feign声明式服务调用

    SpringCloud 基础教程(八)-Hystrix熔断器(上)

    SpringCloud 基础教程(九)-Hystrix服务监控(下)

    SpringCloud 基础教程(十)-Zull服务网关

    SpringCloud 基础教程(十一)- Sleuth 调用链追踪简介

    SpringCloud 基础教程(十二)-Zipkin 分布式链路追踪系统搭建

    SpringCloud 进阶: 消息驱动(入门) Spring Cloud Stream【Greenwich.SR3】

    SpringCloud 进阶: Spring Cloud Stream 核心组件

    SpringCloud 进阶: 消息驱动之Spring Cloud Stream 消费者分组

    更多精彩内容,请期待...

    本文由博客一文多发平台 OpenWrite 发布!

    相关文章

      网友评论

          本文标题:SpringCloud 进阶:消息驱动之Spring Cloud

          本文链接:https://www.haomeiwen.com/subject/zktufhtx.html