SpringCloud Stream消息驅動之生產者

本文演示是的SpringCloud Stream的消息生產者,和RabbitMQ進行配合

1、構建生產者項目cloud-stream-rabbitmq-provider8801,添加pom文件依賴

<dependencies>
        <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>

2、構建application.yml文件,添加rabbitmq和output配置

server:
  port: 8801

spring:
  application:
    name: cloud-stream-rabbitmq-provider
  cloud:
    stream:
      binders: # 在此處配置要綁定的rabbitmq的服務信息;
        defaultRabbit: # 表示定義的名稱,用於於binding整合
          type: rabbit # 消息組件類型
          environment: # 設置rabbitmq的相關的環境配置
            spring:
              rabbitmq:
                host: localhost
                port: 5672
                username: admin
                password: admin
                virtual-host: my_vhost
      bindings: # 服務的整合處理
        output: # 這個名字是一個通道的名稱
          destination: studyExchange # 表示要使用的Exchange名稱定義
          content-type: application/json # 設置消息類型,本次爲json,文本則設置“text/plain”
          binder: defaultRabbit  # 設置要綁定的消息服務的具體設置



eureka:
  client:
    #表示是否將自己註冊進EurekaServer默認爲true。
    register-with-eureka: true
    #是否從EurekaServer抓取已有的註冊信息,默認爲true。單節點無所謂,集羣必須設置爲true才能配合ribbon使用負載均衡
    fetchRegistry: true
    service-url:
      #單機
      defaultZone: http://localhost:7001/eureka
      # 集羣
      #defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka

3、構建主啓動類

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

4、構建業務類,寫一個測試接口

/**
 * created by king on 2020/4/28 1:22 下午
 */
public interface IMessageProviderService {
    public String send();
}

5、實現此接口,並添加相關注解和構建消息,可參見官網配置springcloud stream producer官網配置書寫

package com.king.springcloud.service.impl;

import com.king.springcloud.service.IMessageProviderService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.messaging.Source;
import org.springframework.integration.support.MessageBuilder;
import org.springframework.messaging.MessageChannel;

import javax.annotation.Resource;
import java.util.UUID;

/**
 * created by king on 2020/4/28 1:23 下午
 */
@EnableBinding(Source.class)//定義消息的推送管道
@Slf4j
public class MessageProviderServiceImpl implements IMessageProviderService {
    @Resource
    private MessageChannel output; //消息發送管道

    @Override
    public String send() {
        String serial = UUID.randomUUID().toString();
        output.send(MessageBuilder.withPayload(serial).build());
        log.info("*******serial:"+serial);
    return null;
    }
}

6、提供接口,共外部訪問生產消息


/**
 * created by king on 2020/4/28 1:39 下午
 */
@RestController
public class StreamSendMessageController {

    @Resource
    private IMessageProviderService messageProviderService;

    @GetMapping(value = "/sendMsg")
    public String sendMsg(){
        return messageProviderService.send();
    }
}

7、啓動RabbitMQ服務,啓動eureka7001,啓動provider8801項目,進行測試 http://localhost:8801/sendMsg

結果:

後臺打印出日誌信息 顯示隨機字符串

RabbitMQ的web端,也能看到消息響應波峯

表示提供者能發送消息到RabbitMQ了~

!!~~~~~~!!!!!!!!!!!!!!!!!!

此處其實還有個問題,就是我8801項目雖然啓動了,消息也生產到RabbitMQ了,但是我的8801項目後臺是報錯的,報:ACCESS_REFUSED - Login was refused using authentication mechanism PLAIN 錯誤

網上搜索是說 賬戶和密碼不對,但是我用同樣的賬戶和密碼 admin/admin都能登錄web頁面,而且前邊用SpringCloud Bus的時候,也是使用的同樣的RabbitMQ,都沒有問題,到這兒裏就報這個錯誤了,也不知道是哪兒的問題~~先記錄下吧~~!

 

如果有朋友能知道原因,請留言~~

 

 

 

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