分布式系统中,因为服务数量巨多,为了方便服务配置文件统一管理,实时更新(有某些配置信息变化有必定频率和规律,而且但愿可以作到尽可能实时(营销类,或活动类应用系统)),因此须要分布式配置中心组件。 分布式配置统一解决方案主要目标java
部署极其简单
: 同一个上线包,无须改动配置,便可在多个环境中(RD/QA/PRODUCTION) 上线部署动态化
: 更改配置,无需从新打包或重启,便可实时生效统一管理
: 提供web平台,统一管理 多个环境(RD/QA/PRODUCTION)、多个产品 的全部配置支持微服务架构
目前流行的配置管理平台有360的QConf
,百度的disconf
,淘宝的diamond
等等,相比较同类产品: git
Spring Cloud Config
最大的优点是Spring无缝集成, Spring应用程序的迁移成本很是低,在配置获取的接口上是彻底一致, 结合SpringBoot可以使你的项目有更加统一的标准(包括依赖版本和约束规范),避免了应为集成不一样开软件源形成的依赖版本冲突。
支持任何语言的任何应用。它也能为你支持对应用开发环境、测试环境、生产环境的配置、切换、迁移。默认的配置实现经过git实现,同时很是容易的支持其余的扩展 github
Spring Cloud Config
本来放在本地
文件的配置抽取出来放在中心服务器
,从而可以提供更好的管理、发布能力。web
服务端
: 负责将git svn中存储的配置文件发布成REST接口客户端
: 能够从服务端REST接口获取配置,客户端并不能主动感知到配置的变化,从而主动去获取新的配置,由消息总线来通知各个Spring Cloud Config的客户端去服务端更新配置。####服务端配置 添加依赖redis
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<!-- 可选,安全认证 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
复制代码
开启服务注册(@EnableConfigServer
开启)spring
@EnableConfigServer
@SpringBootApplication
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
复制代码
增长配置数据库
spring:
application:
name: config-server
cloud:
config:
label: master
server:
git:
uri: https://github.com/ohcomeyes/spring-cloud.git #注意use https not use ssh
force-pull: true
search-paths: config
# username: ********
# password: ********
server:
port: 8888 # eureka中默认读取的端口是8888
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
# 须要添加上面所说的安全认证依赖 ConfigSever 默认实现的基本的 HttpBasic 的认证。
security:
user: # user 就是用户名
password: 123
复制代码
添加依赖api
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
复制代码
开启服务缓存
@EnableEurekaClient
@RestController
@SpringBootApplication
public class EurekaProviderApplication {
@Value("${server.port}")
String port;
// 经过 @Value 获取服务端的 content 值的内容
@Value("${version}")
String version;
@GetMapping("/")
public String home() {
return "Hello home,port:"+port+"--version:"+version;
}
@GetMapping("/dc")
public String home1() {
return "hello home1 ,port:"+port+"--version:"+version;
}
public static void main(String[] args) {
SpringApplication.run(EurekaProviderApplication.class,args);
}
}
复制代码
添加配置安全
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
spring:
application:
name: eureka-provider
cloud:
config:
label: master #远程仓库的分支
profile: dev # 配置文件
discovery:
enabled: true # 从配置中心读取文件。
service-id: config-server # 经过服务名称去 Eureka注册中心找服务
server:
port: 8081
复制代码
注意
: 仓库的配置文件按照{application}-{profile}.yml
或者{application}-{profile}.properties
格式命名,
config-client
的配置文件名和配置中心的{application}
名相匹配。
http请求地址和资源文件映射以下:
/{application}/{profile}[/{label}]
*/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
启动全部服务后,就能发现全部服务可以从配置中心获取到配置信息了
上面讲的是服务统一从配置中心获取配置信息,下面讲讲怎么来刷新 Spring Cloud Config 中使用 Refresh
要在微服务运行期间动态刷新配置,能够经过调用/refresh实现,但这样只能针对单个服务,并且要手动操做 添加依赖
<!-- actuator 健康监控 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
复制代码
添加配置
# 说明:
# 1.要经过actuator暴露端点,必须同时是启用(enabled)和暴露(exposed)的
# 2.全部除了/health和/info的端点,默认都是不暴露的
# 3.全部除了/shutdown的端点,默认都是启用的
# PS.生产环境因为安全性的问题,注意不要暴露敏感端点
# springboot 1.5.X 以上默认开通了安全认证,下面配置关闭
management:
security:
enabled: false // 指定访问信息不进行用户验证
复制代码
开启服务
//经过 @RefreshScope 开启 SpringCloudConfig 客户端的 refresh 刷新范围,
//@RefreshScope要加在声明@Controller声明的类上,不然refresh以后Conroller拿不到最新的值,会默认调用缓存。
@RefreshScope
@EnableEurekaClient
@RestController
@SpringBootApplication
public class EurekaProviderApplication {
@Value("${server.port}")
String port;
// 经过 @Value 获取服务端的 content 值的内容
@Value("${version}")
String version;
@GetMapping("/")
public String home() {
return "Hello home,port:"+port+"--version:"+version;
}
@GetMapping("/dc")
public String home1() {
return "hello home1 ,port:"+port+"--version:"+version;
}
public static void main(String[] args) {
SpringApplication.run(EurekaProviderApplication.class,args);
}
}
复制代码
上面讲到的是手动刷新,还只能针对单个服务,下面讲讲怎么经过消息总线来广播式自动刷新,经过RabbitMQ
或kafka
加 Git
的Webhooks
來触发配置的更新 Spring Cloud Bus
事件处理机制和消息中间件消息的发送和接收整合起来,主要由发送端、接收端和事件组成。针对不一样的业务需求,能够设置不一样的事件,发送端发送事件,接收端接受相应的事件,并进行相应的处理,用于实现微服务之间的通讯。本质是利用了MQ的广播机制在分布式的系统中传播消息 。
默认经常使用rabbitmq
和kafka
两个binder,说到rabbitmq,先了解下消息队列 kafka和redis中的消息队列区别:
好比kafka中发布一个东西,多个订阅者能够分组,(同一个组里只有一个订阅者)会收到该消息,这样能够用做负载均衡。
消息队列(MQ) 消息队列(Message Queue)是一种应用间的通讯方式,消息发送后能够当即返回,由消息系统来确保消息的可靠传递。消息发布者只管把消息发布到 MQ 中而不用管谁来取,消息使用者只管从 MQ 中取消息而不论是谁发布的。这样发布者和使用者都不用知道对方的存在。
其它常见场景包括最终一致性、应用解耦(订单-库存)、广播、错峰流控(秒杀等)等等
MQ和RPC的区别
RabbitMQ RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件,也称为面向消息的中间件,是一个在AMQP基础上完整的,可复用的企业消息系统。它能够用于大型软件系统各个模块之间的高效通讯,支持高并发,支持可扩展。
AMQP
:Advanced Message Queue,高级消息队列协议。它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制。RabbitMQ 最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。具体特色包括:
灵活的路由
消息集群
高可用
多种协议
多语言客户端
管理界面
跟踪机制
插件机制
webhooks
webhook
:是个在特定状况下触发的一种api. 愈来愈多在web上的操做被描述为事件向服务实例请求Spring Cloud Bus的/bus/refresh
接口,从而触发总线上其余服务实例的/refresh
, /bus/refresh
接口还提供了destination
参数,用来定位具体要刷新的应用程序
在github
上有关于Spring Cloud
完整的部署。
其它相关文章
Spring cloud(1)-简介以及选择
Spring cloud(2)-服务发现(Eureka,Consul)
Spring cloud(3)-负载均衡(Feign,Ribbon)
Spring cloud(4)-熔断(Hystrix)
Spring cloud(5)-路由网关(Zuul)
Spring cloud(6)-配置管理及刷新(Config,Bus)
最后,给个 star 吧~
我的博客~
简书~