SpringCloud——Stream——陽哥學習視頻觀後筆記

爲什麼引入Stream?
在這裏插入圖片描述
在這裏插入圖片描述

1:Stream介紹

在這裏插入圖片描述
在這裏插入圖片描述

2 Stream設計思想

標準的MQ架構
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
爲什麼用SpringCloud——Stream?
在這裏插入圖片描述
在這裏插入圖片描述
Stream爲什麼可以統一底層差異?
在這裏插入圖片描述
在這裏插入圖片描述
設計思想:
在這裏插入圖片描述

2:Stream編碼常用註解

SpringCloud Stream標準流程套路
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

3:Stream消息驅動之生產者和消費者搭建

生產者

  <!-- stream rabbit -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
        </dependency>

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

application.yml

server:
  port: 8801

spring:
  application:
    name: cloud-stream-provider
  cloud:
    stream:
      # 在此配置要綁定的Rabbit的服務信息
      binders:
        # 表示定義的名稱,用於binding整合
        defaultRabbit:
          # 消息組件類型
          type: rabbit
          environment:
            spring:
              rabbitmq:
                host: localhost
                port: 5672
                username: guest
                password: guest

      # 服務的整合員工
      bindings:
        # 這個名字是一個通道的名稱
        output:
          # 標識要使用的Exchange名稱定義
          destination: studyExchange
          # 設置消息類型,本次爲json,文本則設置"text/plain"
          content-type: application/json
          # 設置要綁定的消息服務的具體設置
          binder: defaultRabbit
          group: atstudyingA

eureka:
  instance:
    # 訪問的路徑變ip地址
    prefer-ip-address: true
    # 在信息列表時顯示主機名稱
    instance-id: send-8801.com
    # 設置心跳的時間間隔(默認是30秒)
    lease-renewal-interval-in-seconds: 2
    # 如果現在超過了5秒的間隔(默認是90秒)
    lease-expiration-duration-in-seconds: 5
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/

SendMessageController .java

@RestController
public class SendMessageController {

    @Resource
    private IMessageProviderService messageProviderService;

    @GetMapping("/sendMessage")
    public String sendMessage(){
        return messageProviderService.send();
    }
}
@EnableBinding(Source.class) // 定義消息的推送管道
@Slf4j
public class MessageProviderImpl implements IMessageProviderService {

    @Resource
    private MessageChannel output;

    @Override
    public String send() {
        String serial = IdUtil.simpleUUID();
        Message<String> message = MessageBuilder.withPayload(serial).build();
        boolean result = output.send(message);
//        log.info(">>>>> send message {} >>>>  {}, ", result, serial);
//        log.info(">>>>> send message {} >>>>  {}, ", result, message);
        return serial;
    }
}

StreamRabbitmqMain8801.java

@SpringBootApplication
@EnableEurekaClient
public class StreamRabbitmqMain8801 {
    public static void main(String[] args) {
        SpringApplication.run(StreamRabbitmqMain8801.class, args);
    }
}

消費者

 <!-- stream rabbit -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
        </dependency>

        <!-- eureka client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
server:
  port: 8803

spring:
  application:
    name: cloud-stream-consumer
  cloud:
    stream:
      binders:
        defaultRabbit:
          type: rabbit
          environment:
            rabbitmq:
              host: localhost
              port: 5672
              username: guest
              password: guest
      bindings:
        input:
          destination: studyExchange
          content-type: application/json
          binder: defaultRabbit
          group: atstudyingA

eureka:
  instance:
    instance-id: reveive-8803.com
    prefer-ip-address: true
    lease-expiration-duration-in-seconds: 5
    lease-renewal-interval-in-seconds: 2
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/

ReceiveMessageListenerController.java

@EnableBinding(Sink.class)
@Slf4j
public class ReceiveMessageListenerController {

    @Value("${server.port}")
    private String serverPort;

    @StreamListener(Sink.INPUT)
    private void input(Message<String> message) {
        log.info("<<<<< 消費者1號 {} <<<<<<  {}", serverPort, message.getPayload());
    }
}

StreamMQMain8803.java

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

4:解決重複消費問題

在這裏插入圖片描述
在這裏插入圖片描述
解決:只要消費者的配置文件中加入,如下配置,分成同一組

 group: atstudyingA

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章