目录
- SpringCloud微服务入门(零),开篇
- SpringCloud微服务入门(一),Eureka注册中心
- SpringCloud微服务入门(二),Eureka Client
- SpringCloud微服务入门(三),Eureka高可用集群
- SpringCloud微服务入门(四),创建服务
- SpringCloud微服务入门(五),Feign实现服务通信
- SpringCloud微服务入门(六),负载均衡Ribbon
- SpringCloud微服务入门(七),服务网关Zuul
- SpringCloud微服务入门(八),服务熔断组件Hystrix
- SpringCloud微服务入门(九),统一配置中心Config
- SpringCloud微服务入门(十),完结篇,是结束也是开始
- 番外篇 - 安装Docker,运行RabbitMQ镜像)
正文
SpringCloud统一配置中心使用Config组件。分为Server端与Client端,这点跟Eureka类似。在创建项目的时候选择对应的模块就可以了。
统一配置中心有种种好处,诸如:方便维护、安全可控、远程加载、动态更新。
Config可以从远程Git从库加载配置文件,动态更新配置,无需重启应用。
1、创建config-server项目
请看右边的模块列表,这个项目是EurekaClient也是ConfigServer。
项目创建完成后,还是按照老规矩来,在启动类加注解,启用Config。启用注解是@EnableConfigServer
。
然后修改application.properties文件,添加配置向EurekaServer注册,设置端口为7070,并指定远程配置的git地址和用户、密码。
spring.application.name=config-server
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
server.port=7070
spring.cloud.config.server.git.uri=giturl
spring.cloud.config.server.git.username=gituser
spring.cloud.config.server.git.password=gitpass
笔者用的远程配置git地址:https://gitee.com/dev-tang/sc-config
里面有一个park的配置,用来模拟数据库配置。为方便测试,git仓库为public的,无需配置用户密码。
2、验证config-server是否有效
启动config-server,在浏览器中访问http://localhost:7070/park-dev.properties
,如果与git仓库中的内容一致,就表示成功了。.properties后缀是可以变化的,比如要json格式,把后缀改成.json就可以了。需要yml格式就改成.xml。主要记住park-dev.properties这个格式是有意思的。park表示Eureka的服务名,dev表示模式,后缀表示格式。
properties格式
json格式
yml格式
config-server启动成功后,接下来就在现有的服务中应用config了。笔者将在park服务中使用config。
3、应用config
一个特别需要注意的地方,需要将application.properties文件名改成bootstrap.properties。 SpringCloud启用有一个优先级关系,bootstrap优先级高于application。如果不该名字在里面的config发现配置将会无效。
首先在park服务的pom.xml中引入config-clent依赖,将park变成ConfigClient。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
然后修改park的bootstrap.properties文件,在里面配置config的发现服务。
spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.serviceId=config-server
spring.cloud.config.profile=dev
创建一个config包,在里面引用远程git中的jdbc配置。代码如下:
package com.javafm.park.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConfigurationProperties(prefix = "jdbc")
public class DBConfig {
private String url;
private String user;
private String password;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
这里并不会真的去创建数据库连接和数据源。只是简单的取出配置,作为config演示。
接下来在controller里面加一个接口来向访问者输出配置,代码如下:
package com.javafm.park.controller;
import com.javafm.park.config.DBConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ParkController {
@Autowired
private DBConfig dbConfig;
@GetMapping("/db-config")
public String dbConfig() {
return dbConfig.getUrl() + " " + dbConfig.getUser() + " " + dbConfig.getPassword();
}
}
浏览器打开http://localhost:8080/db-config
,最终效果如图所示:
如图已成功拿到远程配置文件。但是当你在git中修改远程配置后,本地配置并不会动态刷新。这就需要引入另外一个组件了Spring Cloud Bus。动态刷新才是注册中心的灵魂所在。
4、Spring Cloud Bus实现配置动态刷新
4.1、笔者使用AMQP,因此需要在config-server和park的pom.xml文件中引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
4.2、在config-server的配置文件中加入以下配置:
management.endpoints.web.exposure.include=*
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
4.3、在park中也加入mq配置,但不需要配置management
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
动态配置的原理就是在ConfigServer中开放一个POST接口,当请求这个接口的时候,会向AMQP中发送一条消息,当ConfigClient收到消息,就会去更新配置。config-server的management配置就是为了暴露POST接口给外部调用。
4.4、修改park的DBConfig代码,在类加上加上一个注解@RefreshScope
,只有加上了这个注解才可以收到配置中心发来的动态更新。
5、测试动态配置
通过第4点的 Spring Cloud Bus配置,config-server对外暴露了一个POST接口地址http://localhost:7070/actuator/bus-refresh
,当git配置发生变化,只要向这个接口发起一次POST请求就可以了。
测试访问就是在git上面手动修改一个配置的值,然后发起POST请求,再访问http://localhost:8080/db-config
看配置是否发生变化。
POST请求命令:
curl -v -X POST "http://localhost:7070/actuator/bus-refresh"
如果没有配置错误的话,当执行这个命令后,配置就已经动态更新了。笔者为了方便,使用了命令行工具curl发起请求,你也可以用postman等工具,效果是一样的。
可爱的你有时会忍不住想,git中每次更改配置后都要执行命令发起请求不是很麻烦?早就有解决办法了,一般git仓库都提供WebHooks功能,只要在WebHooks中配置POST地址就可以了。当然还有另外的方法,比如跟Jenkins或者其它工具集成。
本节代码地址:https://gitee.com/dev-tang/learn-springcloud/tree/sc-07