springcloud config与springcloud bus实现动态刷新配置

1.分布式配置中心可以做什么?

①集中管理配置文件②不同环境不同配置动态化的配置更新,分环境部署例如dev/test/release③运行期间动态调整配置,不在需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息④当配置变动时,服务不在需要重启即可感知到配置的变化,并应用新的配置⑤将配置信息以Rest接口形式暴露。

2.什么是总线?

在微服务架构的系统中,通常会实用轻量级的消息代理来构建一个公用的消息主题,并让系统中所有微服务实例都连接上来,由于该主题中产生的消息会被所有实例监听和消费所以称他为消息总线,在总线上的各个实例都可以方便的广播一些需要让其他连接该主题上的实例都知道的消息。

3.config client结合spring cloud bus实时刷新配置原理?

configclient实例都监听MQ中同一个topic默认为spring cloud bus,当一个服务刷新数据的时候,它会把这个信息放入topic中,这样监听同一个topic的服务就能得到通知然后去更新自身的配置。

通过刷新Config-Server端点获取配置中心最新配置:

springcloud config与springcloud bus实现动态刷新配置_第1张图片

4.springcloud bus是什么?

springcloud bus支持两种消息代理:Rabbit MQ和kafka,是用来将分布式系统的节点与轻量级消息系统连接起来的框架,它整合了java的事件处理机制和消息中间件的功能,可以管理和传播分布式系统间的消息,就像一个分布式执行器,可用于广播状态更改事件推送等也可当做微服务间的通信通道。

5.config server

①pom需要加入的主要依赖:


org.springframework.cloud
spring-cloud-starter-eureka



org.springframework.cloud
spring-cloud-starter-hystrix


org.springframework.cloud
spring-cloud-config-server

    
org.springframework.boot
spring-boot-starter-actuator



org.springframework.cloud
spring-cloud-starter-bus-amqp



②application.properties配置文件:

#指定微服务的名称后续在调用的时候只需要使用该名称就可以进行服务的访问
spring.application.name=config-server
server.port=8779

# 配置服务注册中心

#注册中心地址
eureka.client.serviceUrl.defaultZone=http://testhost:8000/eureka/,http://testhost2:8001/eureka/
#指定本地仓库路径,默认是随机生成
spring.cloud.config.server.git.basedir=/home/springcloud/configrepos
# git仓库配置 主分支路径
spring.cloud.config.server.git.uri=https://gitee.com/niugangxy/springcloud
spring.cloud.config.server.git.force-pull=true
#很多场景下,可能把配置文件放在git仓库子目录下,可通过searchPaths配置,searchPaths也支持占位符
#如下配置,Config server会在git目录spring-cloud-config-respo,及其子目录下查找配置文件
spring.cloud.config.server.git.searchPaths=spring-cloud-config-respo
#git用户名
[email protected]
#git用户密码
spring.cloud.config.server.git.password=niu85848116

#消息代理地址
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=springcloud
spring.rabbitmq.password=123456

#取消bus/refresh发送post请求 需要认证,刷新是关闭验证
management.security.enabled=false
spring.cloud.bus.trace.enabled=true

6.config client:

①pom文件:


    org.springframework.cloud
    spring-cloud-starter-eureka



    org.springframework.cloud
    spring-cloud-starter-hystrix


    org.springframework.boot
    spring-boot-starter-web



    org.springframework.boot
    spring-boot-starter-actuator


    org.springframework.cloud
    spring-cloud-starter-config



    org.springframework.retry
    spring-retry


    org.springframework.boot
    spring-boot-starter-aop



    org.springframework.cloud
    spring-cloud-starter-bus-amqp

②config client端需要创建bootstrap.properties

application.yml是用户级的资源配置项,bootstrap.yml是系统级的,优先级更改,默认情况下他不会被本地配置覆盖。

#指定注册中心
eureka.client.serviceUrl.defaultZone=http://testhost:8000/eureka/,http://testhost2:8001/eureka/

#开起通过服务来访问Config Server
spring.cloud.config.discovery.enabled=true

#指定配置分布式配置中心服务名
spring.cloud.config.discovery.serviceId=config-server

#指定git仓库的分支,对应config server所获取的配置文件的{label}
spring.cloud.config.label=master

#失败快速响应和重试
spring.cloud.config.failFast=true

#对应 config server所获取的配置文件的{application}
spring.application.name=niugang

#对应config server所获取的配置文的{profile}
spring.cloud.config.profile=dev

#http://localhost:8082/bus/refresh  挂到总线上的客户端都从注册中心 干掉了  这是bug
#Dalston.SR1

#消息代理地址
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=springcloud
spring.rabbitmq.password=123456

#取消bus/refresh发送post请求 需要认证,刷新是关闭验证
management.security.enabled=false
spring.cloud.bus.trace.enabled=true

③测试类:

package com.niugang.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
/**
 * 
 * 在refresh作用域中放置@Bean定义的便利注释。以这种方式注释的bean可以在运行时刷新,使用它们的任何组件将在下一个方法调用中获得一个新实例,完全初始化并注入所有依赖项。
 *
 */
@RefreshScope  //必须加这个注解,否则通过消息总线从git上已经更新了最新到配置到本地仓库,但是代码运行时拿不到最新的配置
public class ConfigClientController {
/**
* 从niugang-dev.properties中获取配置的from值
*/
@Value("${from}")
private String from;
@RequestMapping("/profile")
public String profile() {
return this.from;
}
}

 

你可能感兴趣的:(springboot,Java)