這篇文章的讀者,假設您已經對RabbitMQ、SpringBoot和微服務有一定的理解。此文章來自於對內部技術規範指引的編輯。
典型應用場景
此圖展示了RabbitMQ的典型應用場景,生產者把消息發送到Exchange,消費者從Queue讀取消息,消息可通過topic、header、direct、fanout四種方式由Exchange路由到Queue。
在微服務中的開發過程中,如果任由開發者定義Exchange、Queue以及路由方式,即便優秀的程序員正確定義了這些要素,服務依賴會生成一個巨複雜的網狀結構,管理起來必定是災難。所以要對使用進行規範,這是技術管理應有之意。
通過文檔定義規範,這種約束是弱勢的,需要不斷核查規範的實施情況。通過代碼、架構定義規範,在不需要開發者介入的情況下執行規範,屏蔽程序的複雜性,是架構師需要考慮的問題。優秀的架構使開發過程簡單化、規範化,使程序員專注業務開發,提升業務開發的效率。
按照這種指導思想,對RabbitMQ的使用進行了規範和約束。
微服務應用規範化
約束如下:
- 如若服務啟用了Producer,則創建與服務名相同的Exchange,發送消息到此Exchange。
- 如若服務啟用了Consumer,則創建與服務名相同的Queue,從此Queue中訂閱消息。
- 讀取程序中定義的Receiver,解析定義的service(其實就是Exchange名字)和tag,創建Queue到Exchange的綁定關係。
- 以上過程,在服務啟動時執行,無需程序員干預。
優點:程序員無需關注消息發給誰,只需要調用服務發送消息即可;程序員無需關注消息如何路由,只需要為自己關心的tag,定義receiver處理類。另外,因為採用統一的api發送和接收,為未來的擴展提供了便利。
缺點:每個服務只有一個Exchange,只有一個Queue,並且只使用了Topic路由;所以,性能並不是最優的,只能在中度或輕度處理場景中使用。如若有個性化的處理場景,還是需要自定義這些組件的。
綜述:在AntSentry的微服務體系中,大流量量使用了Kinesis隊列(類kafka),大併發使用了點對點的SQS隊列,RabbitMQ只是用來解決服務之間的調用問題,流量並不會太大,其靈活性彌補了Kinesis和SQS的不足,在這個特有的場景中,滿足了業務需求。在大多數的微服務場景中,這種應用模式是可以滿足大多數的需求的,希望對你有所幫助。
使用方法
1)修改pom,升級api版本(此項目並未開源,公司內部使用)
<code> xx cloud-api-tools 1.3.3-SNAPSHOT /<code>
2)採用自定義AutoConfig,配置後即按照規範啟用了rabbitmq
<code>com: xx: rabbitmq: host: 10.30.60.41 password: XX userName: xx port: 5672 vhost: dev/<code>
3)創建消息實體
<code>@Data public class XXDemoInfo extends MQMessage { @Override public String getTag() { return "work"; // 消息的標識 } private String name; private Long timestamp; }/<code>
4)創建接受者,配置消息的來源以及tag;可配置多個註解,實現一個receiver處理多種tag
<code>@RabbitMQReceiver(service = "cloud-xx-service", tag = "work") public class XXTagReceiver implements RabbitMQBaseReceiver { @Override public void receive(XXDemoInfo xxDemoInfo) { } } /<code>
5)發送消息示例
<code>@Autowired RabbitMQSender sender; public void send() { XXDemoInfo info = new XXDemoInfo(); info.setName("Test Message"); info.setTimestamp(System.currentTimeMillis()); sender.send(info); }/<code>
6) 配置ReceiverScan
<code>@RabbitMQReceiverScan(basePackages = {"com.xx.receiver"}) // 填寫receiver類所在的包 public class SomeApplication implements CommandLineRunner{ }/<code>
實現關鍵技術
這裡感覺沒什麼好講的,總不能貼出來大片的代碼吧!就把啟動過程簡單畫一下吧。
如果還有更多想了解的,歡迎留言討論。