Spring Cloud Bus

来源:互联网 发布:通信工程预算软件 编辑:程序博客网 时间:2024/03/29 02:42

在前面学习Spring Cloud Config的时候最后留了一个尾巴,当我们微服务结点的量级达到一定规模时,一个个维护和refresh服务结点动态更新最新配置信息将会成为一个很费精力的问题,所以Spring framework又推出个新套件Spring Cloud Bus消息总线。

 

Spring Cloud Bus需要依赖一种MQ,我们这里选择比较流行的RabbitMQ和Kafka。关于两者的原理我们前面博文有分析,在这里只是载体,我直接用docker方式简单安装一个。如果docker的原理和操作还不是很熟练,请从Docker的原理和安装开始练习。

 

我们的微服务搭建如下:



以RabbitMQ方式集成:

RabbitMQ的环境准备(RabbitMQ)

Eureka-Server代码地址:https://github.com/yejingtao/forblog/tree/master/demo-eureka-register

Config-Server代码地址:https://github.com/yejingtao/forblog/tree/master/demo3-config-server

Config-Client代码地址:https://github.com/yejingtao/forblog/tree/master/demo3-config-client

 

Config-ServerPom依赖:

<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artifactId></dependency><dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-eureka</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-bus-amqp</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-actuator</artifactId>        </dependency></dependencies>
Config-ClientPom依赖:

<dependencies>    <dependency>      <groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId>    </dependency>    <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-eureka</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-bus-amqp</artifactId>        </dependency>  </dependencies>

疑问:Server和Client的Actuator是否都是必须依赖的?

回答:向谁发起/bus/refresh就给谁依赖actuator,所以向config-server发起refresh的话,client的actuator不是必须的。

 

Config_server的参数配置:

server:  port: 8001  spring:  cloud:    config:      server:        git:          uri: https://github.com/yejingtao/forblog          search-paths: /config          username: username          password: password  application:    name: config-server  rabbitmq:    host: 192.168.226.130    port: 5672    username: guest    password: guesteureka:  client:    serviceUrl:      defaultZone: http://peer1:1111/eureka/,http://peer2:1112/eureka/management:  security:    enabled: false
Config-Client的参数配置:
spring.application.name=configtestspring.cloud.config.profile=devspring.cloud.config.label=masterserver.port=7002#management.security.enabled=falseeureka.client.serviceUrl.defaultZone=http://peer1:1111/eureka/,http://peer2:1112/eureka/spring.cloud.config.discovery.enabled=truespring.cloud.config.discovery.serviceId=config-serverspring.rabbitmq.host=192.168.226.130spring.rabbitmq.port=5672spring.rabbitmq.username=guestspring.rabbitmq.password=guest

注:多了RabbitMq的配置,5672是rabbitMq的默认服务地址


Java代码没有变化,不再详解,验证步骤:

1)  启动Config-Server和Config-Client,GET请求client的/from,看到git上的old value;

2)  修改git上的内容

3)  POST 请求server的/bus/refresh,再GET请求client的/from看到git上的new value。

注:POST请求可以用curl





以Kafka方式集成:

Kafka的环境准备(Kafka原理详解)

Eureka-Server代码地址:https://github.com/yejingtao/forblog/tree/master/demo-eureka-register

Config-Server代码地址:https://github.com/yejingtao/forblog/tree/master/demo4-config-server

Config-Client代码地址:https://github.com/yejingtao/forblog/tree/master/demo4-config-client

 

Pom.xml的依赖稍作修改,用spring-cloud-starter-bus-kafka替换spring-cloud-starter-bus-amqp

参数配置稍作修改,用kafka的配置替换RabbitMQ的配置:

Config_server的参数配置:

server:  port: 8001  spring:  cloud:    config:      server:        git:          uri: https://github.com/yejingtao/forblog          search-paths: /config          username: username          password: password    stream:      kafka:        binder:          brokers: 192.168.226.130          defaultBrokerPort: 9092          zkNodes: 192.168.226.130          defaultZkPort: 2181  application:    name: config-servereureka:  client:    serviceUrl:      defaultZone: http://peer1:1111/eureka/,http://peer2:1112/eureka/management:  security:    enabled: false
Config-Client的参数配置:

spring.application.name=configtestspring.cloud.config.profile=devspring.cloud.config.label=masterserver.port=7002#management.security.enabled=falseeureka.client.serviceUrl.defaultZone=http://peer1:1111/eureka/,http://peer2:1112/eureka/spring.cloud.config.discovery.enabled=truespring.cloud.config.discovery.serviceId=config-serverspring.cloud.stream.kafka.binder.brokers=192.168.226.130spring.cloud.stream.kafka.binder.defaultBrokerPort=9092spring.cloud.stream.kafka.binder.zkNodes=192.168.226.130spring.cloud.stream.kafka.binder.defaultZkPort=2181

Java代码、验证步骤不存在变化,不再解释。

注:用kafka来做mq实现bus的时候,无论是config的server端还是client端在启动的时候都会打印出以下默认参数:

auto.commit.interval.ms = 100auto.offset.reset = latestbootstrap.servers = [192.168.226.130:9092]check.crcs = trueclient.id = connections.max.idle.ms = 540000enable.auto.commit = falseexclude.internal.topics = truefetch.max.bytes = 52428800fetch.max.wait.ms = 500fetch.min.bytes = 1group.id = anonymous.73cf1d38-c6c1-4615-9361-0a314f34cbdeheartbeat.interval.ms = 3000interceptor.classes = nullkey.deserializer = class org.apache.kafka.common.serialization.ByteArrayDeserializermax.partition.fetch.bytes = 1048576max.poll.interval.ms = 300000max.poll.records = 500metadata.max.age.ms = 300000metric.reporters = []metrics.num.samples = 2metrics.sample.window.ms = 30000partition.assignment.strategy = [class org.apache.kafka.clients.consumer.RangeAssignor]receive.buffer.bytes = 65536reconnect.backoff.ms = 50request.timeout.ms = 305000retry.backoff.ms = 100sasl.kerberos.kinit.cmd = /usr/bin/kinitsasl.kerberos.min.time.before.relogin = 60000sasl.kerberos.service.name = nullsasl.kerberos.ticket.renew.jitter = 0.05sasl.kerberos.ticket.renew.window.factor = 0.8sasl.mechanism = GSSAPIsecurity.protocol = PLAINTEXTsend.buffer.bytes = 131072session.timeout.ms = 10000ssl.cipher.suites = nullssl.enabled.protocols = [TLSv1.2, TLSv1.1, TLSv1]ssl.endpoint.identification.algorithm = nullssl.key.password = nullssl.keymanager.algorithm = SunX509ssl.keystore.location = nullssl.keystore.password = nullssl.keystore.type = JKSssl.protocol = TLSssl.provider = nullssl.secure.random.implementation = nullssl.trustmanager.algorithm = PKIXssl.truststore.location = nullssl.truststore.password = nullssl.truststore.type = JKSvalue.deserializer = class org.apache.kafka.common.serialization.ByteArrayDeserializer



原创粉丝点击