springcloudconfig高可用的服务配置中心
在单体式应用中,我们通常的做法是将配置文件和代码放在一起,这没有什么不妥。当你的应用变得越来越大从而不得不进行服务化拆分的时候,会发现各种provider实例越来越多,修改某一项配置越来越麻烦,你常常不得不为修改某一项配置而重启某个服务所有的provider实例,甚至为了灰度上线需要更新部分provider的配置。这个时候有一套配置文件集中管理方案就变得十分重要,SpringCloudConfig和SpringCloudBus就是这种问题的解决方案之一。
SpringCloudConfig就是我们通常意义上的配置中心,把应用原本放在本地文件的配置抽取出来放在中心服务器,从而能够提供更好的管理、发布能力。SpringCloudConfig分服务端和客户端,服务端负责将git(svn)中存储的配置文件发布成REST接口,客户端可以从服务端REST接口获取配置。但客户端并不能主动感知到配置的变化,从而主动去获取新的配置,这需要每个客户端通过POST方法触发各自的/refresh
。
1、所以我们先来构建一个高可用的配置中心。
【简单的说就是,我们的每个微服务都可以从配置中心读取配置,配置中心可以从我们的git版本管理上读取东西,同时使配置中心也成为一个微服务】
创建一个module命名为configserver,步骤如同之前,这里不做赘述。
添加依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> <version>1.4.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
配置文件
server: port: 8882 eureka: client: serviceUrl: defaultZone: http://localhost:8072/eureka/ spring: cloud: config: server: git: uri: http://172.16.20.14:7990/scm/ycm/configurationcenter.git search-paths: springcloud-configs username: hanyulong password: 1q2w3e4R label: master application: name: config-server
在这里我们看到它也是注册在eureka的一个服务,我们核心来关注
spring.cloud.config:
以下的配置,
spring.cloud.config.server.git.uri=http://172.16.20.14:7990/scm/ycm/configurationcenter.git
spring.cloud.config.label=master
spring.cloud.config.server.git.username= your username
spring.cloud.config.server.git.password= your password
git.url指向配置文件的git地址
label指分支
git.username指用户名
git.password指密码
通过这些配置config.server就会从git上去读我们的代码仓库的文件
同时需要在核心启动类中添加注解
@EnableConfigServer 【此注解标明这是一个配置中心服务】 @EnableEurekaClient
此时访问http://localhost:8882/from/config-client-dev
你就会看到返回
证明配置服务中心可以从远程程序获取配置信息。
http请求地址和资源文件映射如下
- /{application}/{profile}[/{label}]
- /{application}-{profile}.yml
- /{label}/{application}-{profile}.yml
- /{application}-{profile}.properties
- /{label}/{application}-{profile}.propertie
2、然后我们来构建一个配置服务消费者
【简单地说就是可以获取配置中心的从git上获取的配置的配置消费者】
创建一个基本的Eureka的消费者cnfigclient。
以下是依赖
<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.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
创建配置文件bootstrap.yml,注意:这里不再使用application.yml,同时名称必须是bootstrap
配置如下 spring: application: name: config-client cloud: config: label: master profile: dev discovery: enabled: true service-id: config-server server: port: 8881 eureka: client: serviceUrl: defaultZone: http://localhost:8072/eureka/
这里我们核心关注
spring.application.name=config-client 【对应上面提到映射的application部分】
spring.cloud.config.label=master 【对应上面提到映射的label部分】
spring.cloud.config.profile=dev 【对应上面提到映射的profile部分】
spring.cloud.config.discovery.enabled=true 【是否从注册服务发现】
spring.cloud.config.discovery.serviceId=config-server 【注册服务ID】
创建一个简单的REST接口
@Value("${from}") String from; @RequestMapping(value = "/hi") public String hi(){ return from; }
然后依次启动eurekaserver,启动configserver,启动configclient
调用http://localhost:8881/hi 可以看到返回
git-dev-1.0
这里我们的高可用配置中心就完成了。
3、然后我们来实现消息总线
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> <version>1.3.2.RELEASE</version> </dependency>
<dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
然后在application.ym配置文件中添加RabbitMQ的配置
rabbitmq: host: 172.16.20.19 port: 5672 username: jiak password: jiak
这样就完了。你可以在多个端口启动这个配置消费实例查看当前配置。
然后在GIT中修改配置,再使用POST方式请求其中一个实例的http://地址:端口/bus/refresh ,你会看到,在程序的控制塔输出从配置中心重新拉取的输出。在不重启服务的情况下再次查看其配置。
你会发现,全部实例的配置都修改了。