新教E区

 楼主| 发表于 2019-1-7 13:50:51 | 显示全部楼层 |阅读模式
1、spring cloud bus
  spring cloud是按照spring的配置对一系列微服务框架的集成,spring cloud bus是其中一个微服务框架,用于实现微服务之间的通信。
  需要JAVA Spring Cloud大型企业分布式微服务云构建的B2B2C电子商务平台源码 一零三八七七四六二六
  spring cloud bus整合 java的事件处理机制和消息中间件消息的发送和接受,主要由发送端、接收端和事件组成。针对不同的业务需求,可以设置不同的事件,发送端发送事件,接收端接受相应的事件,并进行相应的处理。

2、spring cloud bus实战

网上关于spring cloud bus的demo相当多,此处就不赘述了。

3、原理

spring cloud bus整合了java的事件处理机制和消息中间件,所以下面就从这两个方面来说明spring cloud bus的原理。

0-bus.png



如图所示,作如下解释:

(1)完整流程:发送端(endpoint)构造事件event,将其publish到context上下文中(spring cloud bus有一个父上下文,bootstrap),然后将事件发送到channel中(json串message),接收端从channel中获取到message,将message转为事件event(转换过程这一块没有深究),然后将event事件publish到context上下文中,最后接收端(Listener)收到event,调用服务进行处理。整个流程中,只有发送/接收端从context上下文中取事件和发送事件是需要我们在代码中明确写出来的,其它部分都由框架封装完成。

(2)先大致描述了一下流程,关于封装的部分流程,我们基本上可以在BusAutoConfiguration.class中找到,下面的代码都是这个类中的代码
  1. @EventListener(classes = RemoteApplicationEvent.class)

  2.     public void acceptLocal(RemoteApplicationEvent event) {

  3.         if (this.serviceMatcher.isFromSelf(event)

  4.                 && !(event instanceof AckRemoteApplicationEvent)) {

  5.             this.cloudBusOutboundChannel.send(MessageBuilder.withPayload(event).build());

  6.         }

  7.     }
复制代码


这是封装了java事件处理机制,当收到RemoteApplicationEvent时,如果这个event是从这个服务发出的,而且不是ack事件,那么就会把这个事件发送到channel中。

  1.   @StreamListener(SpringCloudBusClient.INPUT)

  2.     public void acceptRemote(RemoteApplicationEvent event) {

  3.         if (event instanceof AckRemoteApplicationEvent) {

  4.             if (this.bus.getTrace().isEnabled() && !this.serviceMatcher.isFromSelf(event)

  5.                     && this.applicationEventPublisher != null) {

  6.                 this.applicationEventPublisher.publishEvent(event);

  7.             }

  8.             // If it's an ACK we are finished processing at this point

  9.             return;

  10.         }

  11.         if (this.serviceMatcher.isForSelf(event)

  12.                 && this.applicationEventPublisher != null) {

  13.             if (!this.serviceMatcher.isFromSelf(event)) {

  14.                 this.applicationEventPublisher.publishEvent(event);

  15.             }

  16.             if (this.bus.getAck().isEnabled()) {

  17.                 AckRemoteApplicationEvent ack = new AckRemoteApplicationEvent(this,

  18.                         this.serviceMatcher.getServiceId(),

  19.                         this.bus.getAck().getDestinationService(),

  20.                         event.getDestinationService(), event.getId(), event.getClass());

  21.                 this.cloudBusOutboundChannel

  22.                         .send(MessageBuilder.withPayload(ack).build());

  23.                 this.applicationEventPublisher.publishEvent(ack);

  24.             }

  25.         }

  26.         if (this.bus.getTrace().isEnabled() && this.applicationEventPublisher != null) {

  27.             // We are set to register sent events so publish it for local consumption,

  28.             // irrespective of the origin

  29.             this.applicationEventPublisher.publishEvent(new SentApplicationEvent(this,

  30.                     event.getOriginService(), event.getDestinationService(),

  31.                     event.getId(), event.getClass()));

  32.         }

  33.     }
复制代码


@StreamListener这个标签有兴趣的可以去了解一下。这个方法就是从channel中取出事件进行处理的过程(message转事件部分需要自行了解,我没有深入研究),根据事件的类型、发送方和接收方来处理这个事件:如果是ack事件,发送到context上下文中;如果自己是接收端且不是发送端,就会将事件发送到context上下文。

(3)消息中间件可以采用rabbitmq、kafka之类的。java B2B2C Springcloud仿淘宝电子商城系统

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|手机版|Archiver|新教e区 ( 鲁ICP备16007390号-1 )

GMT+8, 2019-3-22 17:20 , Processed in 0.093750 second(s), 18 queries , Gzip On.

新教E区

© 2006-2014 新教E区

快速回复 返回顶部 返回列表