用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字

cloud云    -  云代码空间

——

JAVA springboot ssm b2b2c多用户商城系统源码(九):配置中心和消息总线(配置

2019-01-08|446阅||

摘要:JAVA springboot ssm b2b2c多用户商城系统源码(九):配置中心和消息总线(配置中心终结版)

Spring Cloud Bus

Spring cloud bus通过轻量消息代理连接各个分布的节点。这会用在广播状态的变化(例如配置变化)或者其他的消息指令。Spring bus的一个核心思想是通过分布式的启动器对spring boot应用进行扩展,也可以用来建立一个多个应用之间的通信频道。目前唯一实现的方式是用AMQP消息代理作为通道,同样特性的设置(有些取决于通道的设置)在更多通道的文档中。

Spring cloud bus被国内很多都翻译为消息总线,也挺形象的。大家可以将它理解为管理和传播所有分布式项目中的消息既可,其实本质是利用了MQ的广播机制在分布式的系统中传播消息,目前常用的有Kafka和RabbitMQ。利用bus的机制可以做很多的事情,其中配置中心客户端刷新就是典型的应用场景之一,我们用一张图来描述bus在配置中心使用的机制。

根据此图我们可以看出利用Spring Cloud Bus做配置更新的步骤:

  • 1、提交代码触发post给客户端A发送bus/refresh
  • 2、客户端A接收到请求从Server端更新配置并且发送给Spring Cloud Bus
  • 3、Spring Cloud bus接到消息并通知给其它客户端
  • 4、其它客户端接收到通知,请求Server端获取最新配置
  • 5、全部客户端均获取到最新的配置

改进版本

在上面的流程中,我们已经到达了利用消息总线触发一个客户端bus/refresh,而刷新所有客户端的配置的目的。但这种方式并不优雅。原因如下:

  • 打破了微服务的职责单一性。微服务本身是业务模块,它本不应该承担配置刷新的职责。
  • 破坏了微服务各节点的对等性。
  • 有一定的局限性。例如,微服务在迁移时,它的网络地址常常会发生变化,此时如果想要做到自动刷新,那就不得不修改WebHook的配置。

因此我们将上面的架构模式稍微改变一下

这时Spring Cloud Bus做配置更新步骤如下:

  • 1、提交代码触发post请求给bus/refresh
  • 2、server端接收到请求并发送给Spring Cloud Bus
  • 3、Spring Cloud bus接到消息并通知给其它客户端
  • 4、其它客户端接收到通知,请求Server端获取最新配置
  • 5、全部客户端均获取到最新的配置

这样的话我们在server端的代码做一些改动,来支持bus/refresh

1、添加依赖

复制代码
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-config-server</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bus-amqp</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>
</dependencies>
复制代码

需要多引入spring-cloud-starter-bus-amqp包,增加对消息总线的支持

2、配置文件

复制代码
server:
  port: 8001 spring:
  application:
    name: spring-cloud-config-server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/ityouknow/spring-cloud-starter/     # 配置git仓库的地址 search-paths: config-repo                             # git仓库地址下的相对地址,可以配置多个,用,分割。
          username: username                                        # git仓库的账号
          password: password                                    # git仓库的密码
  rabbitmq:
    host: 192.168.0.6 port: 5672 username: admin
    password: 123456 eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8000/eureka/   ## 注册中心eurka地址  management:
  security:
     enabled: false
复制代码

配置文件增加RebbitMq的相关配置,关闭安全验证。这样server端代码就改造完成了。

3、测试

依次启动spring-cloud-eureka、spring-cloud-config-server、spring-cloud-config-client项目,改动spring-cloud-config-client项目端口为8003、8004依次启动。测试环境准备完成。

按照上面的测试方式,访问server端和三个客户端测试均可以正确返回信息。同样修改neo-config-dev.properties中neo.hello的值为hello im dev update并提交到代码库中。在win下使用下面命令来模拟webhook触发server端bus/refresh.

curl -X POST http://localhost:8001/bus/refresh

其它

局部刷新

某些场景下(例如灰度发布),我们可能只想刷新部分微服务的配置,此时可通过/bus/refresh端点的destination参数来定位要刷新的应用程序。

例如:/bus/refresh?destination=customers:8000,这样消息总线上的微服务实例就会根据destination参数的值来判断是否需要要刷新。其中,customers:8000指的是各个微服务的ApplicationContext ID。

destination参数也可以用来定位特定的微服务。例如:/bus/refresh?destination=customers:**,这样就可以触发customers微服务所有实例的配置刷新。

跟踪总线事件

一些场景下,我们可能希望知道Spring Cloud Bus事件传播的细节。此时,我们可以跟踪总线事件(RemoteApplicationEvent的子类都是总线事件)。

跟踪总线事件非常简单,只需设置spring.cloud.bus.trace.enabled=true,这样在/bus/refresh端点被请求后,访问/trace端点就可获得类似如下的结果:

复制代码
{ "timestamp": 1495851419032, "info": { "signal": "spring.cloud.bus.ack", "type": "RefreshRemoteApplicationEvent", "id": "c4d374b7-58ea-4928-a312-31984def293b", "origin": "stores:8002", "destination": "*:**" }
  },
  { "timestamp": 1495851419033, "info": { "signal": "spring.cloud.bus.sent", "type": "RefreshRemoteApplicationEvent", "id": "c4d374b7-58ea-4928-a312-31984def293b", "origin": "spring-cloud-config-client:8001", "destination": "*:**" }
  },
  { "timestamp": 1495851422175, "info": { "signal": "spring.cloud.bus.ack", "type": "RefreshRemoteApplicationEvent", "id": "c4d374b7-58ea-4928-a312-31984def293b", "origin": "customers:8001", "destination": "*:**" }
}
复制代码

这个日志显示了customers:8001发出了RefreshRemoteApplicationEvent事件,广播给所有的服务,被customers:9000和stores:8081接受到了。想要对接受到的消息自定义自己的处理方式的话,可以添加@EventListener注解的AckRemoteApplicationEvent和SentApplicationEvent类型到你自己的应用中。或者到TraceRepository类中,直接处理数据。

这样,我们就可清晰地知道事件的传播细节。

/bus/refresh BUG

/bus/refresh 有一个很严重的BUG,一直没有解决:对客户端执行/bus/refresh之后,挂到总线的上的客户端都会从Eureka注册中心撤销登记;如果对server端执行/bus/refresh,server端也会从Eureka注册中心撤销登记。再用白话解释一下,就是本来人家在Eureka注册中心注册的好好的,只要你对着它执行一次/bus/refresh,立刻就会从Euraka中挂掉。

其实这个问题挺严重的,本来你利用/bus/refresh给所有的节点来更新配置信息呢,结果把服务从Euraka中给搞掉了,那么如果别人需要调用客户端的服务的时候就直接歇菜了。不知道国内有童鞋公司在生产中用到这个功能没有,用了不就很惨烈。在网上搜索了一下,国内网友和国外网友都遇到过很多次,但是一直没有解决,很幸运就是我在写这篇文章的前三天,Netflix修复了这个问题,使用Spring Cloud最新版本的包就可以解决这个问题。由此也可以发现Spring Cloud还在快速的发展中,最新的版本可能也会有一些不稳定性,可见路漫漫而修远兮。

在pom中使用Spring Cloud的版本,解决这个bug.

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <spring-cloud.version>Dalston.SR1</spring-cloud.version>
</properties>

主要是这句:<spring-cloud.version>Dalston.SR1</spring-cloud.version>

整体架构如下:

 

完整项目的源码来源
JAVA springboot ssm b2b2c多用户商城系统源码
Spring Cloud大型企业分布式微服务云构建的B2B2C电子商务平台源码请加企鹅求求: yuncode.net

顶 0踩 0收藏
文章评论
    发表评论

    个人资料

    • 昵称: cloud云
    • 等级: 高级设计师
    • 积分: 5150
    • 代码: 0 个
    • 文章: 216 篇
    • 随想: 0 条
    • 访问: 11 次
    • 关注

    人气代码

      标签

      java(57)api(3)教程(27)Spring(60)cache(2)+(8)springmvc(3)mybatis(4)(十)(2)(十一)(2)Cloud(29)Cloud-hong(1)Cloud分布式微服(1)Cloud-Hong(1)Cloud分布式微服(1)Cloud-鸿鹄Cl(1)Cloud--Hon(1)Cloud分布式微服(1)Cloud--Hon(1)Cloud分布式微服(1)Cloud--hon(1)Cloud分布式微服(1)Cloud--Hon(1)分布式微服务云系统-(1)企业分布式微服务云架(1)Cloud-Hong(1)Cloud分布式微服(1)Boot(4)企业分布式微服务云架(1)Cloud--hon(1)Cloud分布式微服(1)Cloud--Hon(1)分布式微服务云系统-(1)Cloud--Hon(1)Cloud分布式微服(1)企业分布式微服务云架(1)Cloud--hon(1)Cloud分布式微服(1)Cloud--Hon(1)分布式微服务云系统-(1)cloud--鸿鹄C(1)源码(12)-(22)cloud集成项目(1)Cloud云服务(1)整合spring(12)cloud云服务架构(5)介绍一下Spring(1)Cloud微服务架构(1)总结Spring(1)Cloud云架构(14)登出流程(3)(2)Cloud+Spri(1)Boot+Mybat(1)+微服务(1)企业分布式微服务云架(1)Spring+(1)SSO单点登录应用认(1)跟大家介绍一下关于S(1)Consul(1)Cloud构建微服务(1)Cloud构建微服务(1)Cloud构建微服务(1)SSO单点登录之OA(1)根据token获取用(1)Netflix(3)springclou(1)RestTempla(1)HongHu云架构c(1)Commons(1)普通抽象(1)Config-Git(1)Cloud--Hon(1)分布式微服务云系统-(1)Cloud微服务分布(1)企业分布式微服务云架(1)Cloud自定义引导(1)SSO单点登录之OA(1)SSO单点登录之OA(1)SSO单点登录之OA(1)cloud云架构-S(1)企业分布式微服务云架(1)企业分布式微服务云架(1)Cloud--Hon(1)Cloud分布式微服(1)项目过程构建(1)分享Spring(1)Config服务器(1)Cloud微服务架构(1)Cloud微服务分布(1)Cloud-hong(1)Cloud分布式微服(1)springclou(1)Cloud微服务分布(1)SpringBoot(59)Cloud各个组件配(1)RestTempla(1)Cloud分布式微服(1)Cloud自定义引导(1)Cloud构建微服务(1)Cloud构建微服务(1)(十七)(1)-消息驱动(1)(十六)(1)-使用spring(1)企业级(29)(二)(3)cloud项目(1)(十二)(2)(九)整合sprin(1)commonserv(1)SSO单点登录之OA(1)SSO单点登录之OA(1)SSO单点登录之OA(1)(九)整合sprin(1)commonserv(1)SSO单点登录之OA(1)SSO单点登录之OA(1)SSO单点登录之OA(1)(十三)(1)SSO单点登录之OA(1)B2B2C(53)(九)Java(1)o2o多用户商城(24)(十)Java(1)(十一)Java(2)(十二)(1)springclou(1)springclou(1)springclou(1)SSO单点登录之OA(1)springclou(1)SSO单点登录之OA(1)springclou(1)(十三)java(2)b2b2c多用户商城(7)(十四)Java(1)(十五)Java(2)(十六)Java(2)b2b2c多用户商城(1)SSO单点登录之OA(1)springclou(1)springclou(1)springclou(1)springclou(1)springclou(1)springclou(1)(十七)Java(1)springclou(1)springclou(1)项目构建过程(七)(2)mybatis电子商(1)Springclou(1)Cloud构建分布式(1)SpringClou(1)Config)(1)ssm(15)springclou(1)b2b2c多用户商城(1)B2B2C多租户电子(1)springclou(1)springclou(1)springclou(1)springclou(1)企业级java(5)shop(6)多用户商城系统源码(2)(十二)java(1)关于SpringCl(1)Bus)(1)b2bc商城系统开源(1)Sleuth)(1)多用户商城系统源码-(1)微服务java_b2(1)springclou(1)springclou(1)springclou(1)springclou(1)b2bc商城系统开源(1)配置自动刷新(1)(四):(1)b2b2c多用户商城(1)Dashboard和(1)b2b2c多用户商城(1)b2b2c多用户商城(1)多用户商城系统(1)(十)用spring(2)springboot(1)(十三)spring(1)微服务java_b2(1)(十二)spring(1)mybatis多租户(1)多级分销spring(1)mybatis多租户(1)多级分销spring(1)mybatis多租户(1)b2b2c多用户商城(1)(二)Spring(3)Boot配置文件详解(1)springclou(1)(一)构建第一个Sp(1)多用户商城系统(三)(1)微服务java_b2(1)整合JPA(1)springclou(1)多级分销Spring(1)多级分销spring(1)mybatis多租户(1)多级分销spring(1)mybatis多租户(1)mybatis多租户(1)多级分销Spring(1)cloud微服务分布(1)Cloud集成项目简(1)cloud微服务分布(1)整合企业架构的技术点(1)(一)spring(1)(十三)java(1)(五)JAVA(1)多用户商城系统源码:(1)b2b2c多用户商城(1)springclou(1)(十二)Spring(1)多用户商城系统:使用(1)Sleuth和Zip(1)(十)java(2)多用户商城系统源码:(1)(十一)企业级jav(1)b2bc商城系统开源(1)(八)java(1)(九)Java(1)多级分销spring(1)mybatis多租户(1)springclou(1)springclou(1)b2b2c多用户商城(1)(十二)微服务多用户(1)springclou(1)Springclou(1)分布式环境下自动发现(1)springclou(1)springclou(1)b2b2c多用户商城(1)b2bc商城系统开源(1)多级分销Spring(1)Dashboard和(1)多级分销Spring(1)多级分销spring(1)mybatis多租户(1)springclou(1)(十一)Java(1)springclou(1)b2bc商城系统开源(1)springclou(1)b2b2c多用户商城(1)多用户商城系统源码((1)springboot(1)Java多用户商城系(1)多用户商城系统(一)(1)springclou(1)Springboot(1)springclou(1)b2b2c多用户商城(1)b2b2c多用户商城(1)springboot(1)(十四)(1)多级Springbo(1)Springboot(1)b2b2c多用户商城(1)springclou(1)springclou(1)springclou(1)springclou(1)common-ser(1)b2b2c多用户商城(1)b2b2c多用户商城(1)企业云架构commo(1)b2bc商城系统开源(1)common-ser(1)微服务java_b2(1)多租户电子商城系统(1)b2b2c多用户商城(1)多级分销Spring(1)整合企业架构的技术点(1)springboot(1)企业云架构commo(1)微服务架构(2)(七)springb(1)(八)springb(1)(九)springb(1)Restdocs创建(1)(十一)spring(1)(十二)spring(1)(十四)在sprin(1)(十五)Spring(1)(十六)用restT(1)(十六)用restT(1)cloud微服务分布(1)SpringClou(1)服务的注册与发现(E(1)SpringClou(1)服务消费者(rest(1)SpringClou(1)服务消费者(rest(1)SpringClou(1)关于SpringCl(1)springclou(1)Cloud微服务架构(1)(六)Spring(1)Cloud云架构一服(1)(三)Spring(1)Cloud云架构一定(1)互联网分布式微服务云(1)(十六)用restT(1)教程(十五)Spri(1)(十四)在sprin(1)Config-Git(1)springclou(1)commonserv(1)commonserv(1)SSO单点登录之OA(1)Cloud云架构-S(1)根据token获取用(1)SpringClou(1)SpringClou(1)企业分布式微服务云S(1)(四)断路器(Hys(1)企业分布式微服务云S(1)(五)路由网关(zu(1)企业分布式微服务云S(1)(六)分布式配置中心(1)企业分布式微服务云S(1)(七)高可用的分布式(1)SpringClou(1)服务消费者(rest(1)(十七)上传文件(1)Tasks)(1)(七)springb(1)(八)springb(1)(九)springb(1)Restdocs创建(1)(十一)spring(1)(十二)spring(1)(十三)spring(1)(十四)在sprin(1)(十五)Spring(1)(十六)用restT(1)(十八)定时任务(S(1)

      最新提问

        站长推荐