(十七) Java版本多使用者B2B2C商城原始碼 -訊息驅動 Spring Cloud Stream

happywawa發表於2019-04-03

在使用spring cloud雲架構的時候,我們不得不使用Spring cloud Stream,因為訊息中介軟體的使用在專案中無處不在,我們公司後面做了娛樂方面的APP,在使用spring cloud做架構的時候,其中訊息的非同步通知,業務的非同步處理都需要使用訊息中介軟體機制。spring cloud的官方給出的整合建議(使用rabbit mq和kafka),我看了一下原始碼和配置,只要把rabbit mq整合,kafka只是換了一個pom配置jar包而已,閒話少說,我們就直接進入配置實施:

1. 簡介:

Spring cloud Stream 資料流操作開發包,封裝了與Redis,Rabbit、Kafka等傳送接收訊息。

2. 使用工具:

rabbit,具體的下載和安裝細節我這裡不做太多講解,網上的例項太多了

3. 建立commonservice-mq-producer訊息的傳送者專案,在pom裡面配置stream-rabbit的依賴

<span style="font-size: 16px;"><!-- 引入MQ訊息驅動的微服務包,引入stream只需要進行配置化即可,是對rabbit、kafka很好的封裝 -->  <dependency>      <groupId>org.springframework.cloud</groupId>      <artifactId>spring-cloud-starter-stream-rabbit</artifactId>  </dependency></span>  複製程式碼

 4. 在yml檔案裡面配置rabbit mq

<span style="font-size: 16px;">server:    port: 5666  spring:    application:      name: commonservice-mq-producer    profiles:       active: dev    cloud:      config:        discovery:           enabled: true          service-id: commonservice-config-server    <span style="color: #ff0000;"># rabbitmq和kafka都有相關配置的預設值,如果修改,可以再次進行配置      stream:        bindings:          mqScoreOutput:             destination: honghu_exchange            contentType: application/json                rabbitmq:       host: localhost       port: 5672       username: honghu       password: honghu</span>  eureka:     client:      service-url:        defaultZone: http://honghu:123456@localhost:8761/eureka    instance:      prefer-ip-address: true</span>  複製程式碼

 5. 定義介面ProducerService

<span style="font-size: 16px;">package com.honghu.cloud.producer;    import org.springframework.cloud.stream.annotation.Output;  import org.springframework.messaging.SubscribableChannel;    public interface ProducerService {            String SCORE_OUPUT = "mqScoreOutput";            @Output(ProducerService.SCORE_OUPUT)      SubscribableChannel sendMessage();  }</span>  複製程式碼

 6. 定義繫結

<span style="font-size: 16px;">package com.honghu.cloud.producer;    import org.springframework.cloud.stream.annotation.EnableBinding;    @EnableBinding(ProducerService.class)  public class SendServerConfig {    }</span>  複製程式碼

 7. 定義傳送訊息業務ProducerController

<span style="font-size: 16px;">package com.honghu.cloud.controller;      import org.springframework.beans.factory.annotation.Autowired;  import org.springframework.integration.support.MessageBuilder;  import org.springframework.messaging.Message;  import org.springframework.web.bind.annotation.PathVariable;  import org.springframework.web.bind.annotation.RequestBody;  import org.springframework.web.bind.annotation.RequestMapping;  import org.springframework.web.bind.annotation.RequestMethod;  import org.springframework.web.bind.annotation.RestController;    import com.honghu.cloud.common.code.ResponseCode;  import com.honghu.cloud.common.code.ResponseVO;  import com.honghu.cloud.entity.User;  import com.honghu.cloud.producer.ProducerService;    import net.sf.json.JSONObject;    @RestController  @RequestMapping(value = "producer")  public class ProducerController {            @Autowired      private ProducerService producerService;                  /**      * 通過get方式傳送</span>物件<span style="font-size: 16px;">      * @param name 路徑引數      * @return 成功|失敗      */      @RequestMapping(value = "/sendObj", method = RequestMethod.GET)      public ResponseVO sendObj() {          User user = new User(1, "hello User");          <span style="color: #ff0000;">Message<User> msg = MessageBuilder.withPayload(user).build();</span>          boolean result = producerService.sendMessage().send(msg);          if(result){              return ResponseCode.buildEnumResponseVO(ResponseCode.RESPONSE_CODE_SUCCESS, false);          }          return ResponseCode.buildEnumResponseVO(ResponseCode.RESPONSE_CODE_FAILURE, false);      }                  /**      * 通過get方式傳送字串訊息      * @param name 路徑引數      * @return 成功|失敗      */      @RequestMapping(value = "/send/{name}", method = RequestMethod.GET)      public ResponseVO send(@PathVariable(value = "name", required = true) String name) {          Message msg = MessageBuilder.withPayload(name.getBytes()).build();          boolean result = producerService.sendMessage().send(msg);          if(result){              return ResponseCode.buildEnumResponseVO(ResponseCode.RESPONSE_CODE_SUCCESS, false);          }          return ResponseCode.buildEnumResponseVO(ResponseCode.RESPONSE_CODE_FAILURE, false);      }            /**      * 通過post方式傳送</span>json物件<span style="font-size: 16px;">      * @param name 路徑引數      * @return 成功|失敗      */      @RequestMapping(value = "/sendJsonObj", method = RequestMethod.POST)      public ResponseVO sendJsonObj(@RequestBody JSONObject jsonObj) {          Message<JSONObject> msg = MessageBuilder.withPayload(jsonObj).build();          boolean result = producerService.sendMessage().send(msg);          if(result){              return ResponseCode.buildEnumResponseVO(ResponseCode.RESPONSE_CODE_SUCCESS, false);          }          return ResponseCode.buildEnumResponseVO(ResponseCode.RESPONSE_CODE_FAILURE, false);      }  }  </span>  複製程式碼

8. 建立commonservice-mq-consumer1訊息的消費者專案,在pom裡面配置stream-rabbit的依賴

<!-- 引入MQ訊息驅動的微服務包,引入stream只需要進行配置化即可,是對rabbit、kafka很好的封裝 -->  <dependency>      <groupId>org.springframework.cloud</groupId>      <artifactId>spring-cloud-starter-stream-rabbit</artifactId>  </dependency>  複製程式碼

 9. 在yml檔案中配置:

server:    port: 5111  spring:    application:      name: commonservice-mq-consumer1    profiles:       active: dev    cloud:      config:        discovery:           enabled: true          service-id: commonservice-config-server                <span style="color: #ff0000;">stream:        bindings:          mqScoreInput:            group: honghu_queue            destination: honghu_exchange            contentType: application/json                rabbitmq:       host: localhost       port: 5672       username: honghu       password: honghu</span>  eureka:     client:      service-url:        defaultZone: http://honghu:123456@localhost:8761/eureka    instance:      prefer-ip-address: true  複製程式碼

10. 定義介面ConsumerService

package com.honghu.cloud.consumer;    import org.springframework.cloud.stream.annotation.Input;  import org.springframework.messaging.SubscribableChannel;    public interface ConsumerService {            <span style="color: #ff0000;">String SCORE_INPUT = "mqScoreInput";        @Input(ConsumerService.SCORE_INPUT)      SubscribableChannel sendMessage();</span>    }  複製程式碼

11. 定義啟動類和訊息消費

package com.honghu.cloud;    import org.springframework.boot.SpringApplication;  import org.springframework.boot.autoconfigure.SpringBootApplication;  import org.springframework.cloud.netflix.eureka.EnableEurekaClient;  import org.springframework.cloud.stream.annotation.EnableBinding;  import org.springframework.cloud.stream.annotation.StreamListener;    import com.honghu.cloud.consumer.ConsumerService;  import com.honghu.cloud.entity.User;    @EnableEurekaClient  @SpringBootApplication  @EnableBinding(ConsumerService.class) //可以繫結多個介面  public class ConsumerApplication {            public static void main(String[] args) {          SpringApplication.run(ConsumerApplication.class, args);      }            <span style="color: #ff0000;">@StreamListener(ConsumerService.SCORE_INPUT)      public void onMessage(Object obj) {          System.out.println("消費者1,接收到的訊息:" + obj);      }</span>    }  複製程式碼

12. 分別啟動commonservice-mq-producer、commonservice-mq-consumer1

13. 通過postman來驗證訊息的傳送和接收













可以看到接收到了訊息,下一章我們介紹mq的叢集方案。

到此,整個訊息中心方案整合完畢

歡迎大家和我一起學習spring cloud構建微服務雲架構,我這邊會將近期研發的spring cloud微服務雲架構的搭建過程和精髓記錄下來,幫助更多有興趣研發spring cloud框架的朋友,大家來一起探討spring cloud架構的搭建過程及如何運用於企業專案。

需要JAVASpring Cloud大型企業分散式微服務雲構建的B2B2C電子商務平臺原始碼請加企鵝求求:一零三八七七四六二六

相關文章