简介
在分布式服务化的系统中,由于微服务模快的不断增加,为了方便服务配置文件的统一管理和实时更新,所以需要有分布式配置中心组件。至于具体为什么选择spring cloud config ,仁者见仁智者见智,就不一一赘述了。总的来说还是根据系统本身的需求,选择最合适的即是最好的。因为出于项目实际需要,也是现学现卖。而在整合spring cloud config 的过程中,发现与Consul集成的类似示例很少,几乎没有或者是不够详细。配置中心服务化的原理本质上与集成Eureka并无区别,只是在于配置方面稍有不同。以下就从config-server 和 config-client 开始介绍完整实现示例。
项目示例
一、config-server(配置中心服务端)
1、pom.xml 配置文件中加入Consul 依赖
com.demo
config-server
1.0.0
config
project for Spring Boot
jar
org.springframework.boot
spring-boot-starter-parent
1.5.3.RELEASE
UTF-8
1.8
Dalston.SR1
org.springframework.cloud
spring-cloud-dependencies
Dalston.SR2
pom
import
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-tomcat
org.springframework.boot
spring-boot-starter-jetty
org.springframework.cloud
spring-cloud-starter-config
org.springframework.boot
spring-boot-starter-test
test
org.springframework.cloud
spring-cloud-config-server
1.3.1.RELEASE
org.springframework.cloud
spring-cloud-starter-bus-amqp
org.springframework.boot
spring-boot-starter-actuator
org.springframework.cloud
spring-cloud-starter-consul-discovery
1.1.1.RELEASE
org.springframework
spring-context
4.3.10.RELEASE
org.springframework.cloud
spring-cloud-config-monitor
1.3.1.RELEASE
ch.qos.logback
logback-core
1.1.7
ch.qos.logback
logback-classic
1.1.7
slf4j-api
org.slf4j
${basedir}/src/main/resources
false
org.springframework.boot
spring-boot-maven-plugin
org.springframework
springloaded
1.2.5.RELEASE
org.springframework.boot
spring-boot-maven-plugin
com.demo.core.Application
repackage
2、Application启动类添加Consul支持注解,将配置服务注册到Consul上去
@EnableDiscoveryClient //consul服务发现
@EnableConfigServer //激活配置中心
@SpringBootApplication
public class Application {
public static void main(String[] args) throws Exception {
//启动Spring Boot项目的唯一入口
new SpringApplicationBuilder(Application.class).web(true).run(args);
}
}
3、application.yml 配置
server:
port: 8888
spring:
profiles:
active: dev
application:
name: config-server #应用程序名称
cloud:
config:
server:
#git 仓库相关配置
git:
uri: http://x.x.x.x:8082/xxxxx/config.git #git 仓库地址(当前配置中心微服务的地址,以Gitlab为例)
search-paths: config-repo #配置所在目录(项目中存放配置文件的文件夹)
username: admin #git 用户名
password: 123456 #git 密码
clone-on-start: true #程序启动是否clone远程仓库配置到本地
#关闭安全验证(后续也可以通过集成spring security做安全验证)
management:
security:
enabled: false
---
spring:
profiles: dev
cloud:
bus:
trace:
enabled: true #spring cloud bus 跟踪总线事件
#服务发现配置 consul
consul:
host: 192.168.1.1 #当前环境Consul的IP地址
port: 8500 #当前环境Consul的端口号
enabled: true #是否启用Consul
discovery:
enabled: true #启用Consul服务发现
tags: protocol_config
service-name: config-server #该配置服务在Consul中的服务名称
instance-id: config-server #该配置服务在Consul中的实例名称
hostname: 192.168.1.1 #该配置服务的服务发现地址与consul.host一致
port: ${server.port}
health-check-interval: 10s #Consul健康检查时间间隔
health-check-url: http://192.168.1.1:8888/health #Consul健康检查地址,端口与server.port保持一致
heartbeat: #是否启用Consul的心跳检测
enabled: true
rabbitmq:
host: 192.168.1.1 #spring cloud bus基于AMQP实现所以需要配置,此处以Rabbitmq 为例
username: guest
password: guest
4、创建配置文件 config-server-dev.properties(在config-repo目录下)
#环境标识
environment=dev
服务端配置完毕,启动Config Server
二、config-client(客户端)
1、pom.xml 配置文件中加入Consul 依赖
com.demo
config-client
3.0.0
jar
org.springframework.boot
spring-boot-starter-parent
1.5.2.RELEASE
UTF-8
1.8
5.1.38
0.3.0
1.2.1
1.1.1
1.2.11
4.5.3
org.springframework.cloud
spring-cloud-starter-bus-amqp
org.springframework.cloud
spring-cloud-config-client
1.3.1.RELEASE
org.springframework.cloud
spring-cloud-starter-consul-discovery
1.1.1.RELEASE
org.springframework.retry
spring-retry
1.2.0.RELEASE
org.springframework.boot
spring-boot-starter-redis
1.4.6.RELEASE
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-tomcat
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-starter-jetty
org.springframework.boot
spring-boot-starter-aop
org.springframework.boot
spring-boot-starter-redis
1.4.6.RELEASE
org.springframework.boot
spring-boot-starter-amqp
1.5.1.RELEASE
com.zaxxer
HikariCP
2.6.1
mysql
mysql-connector-java
${mysql.version}
com.github.pagehelper
pagehelper-spring-boot-starter
${pagehelper.version}
com.alibaba
fastjson
${version.fastjson}
org.apache.httpcomponents
httpclient
${httpclient.version}
com.jcraft
jsch
0.1.53
commons-lang
commons-lang
2.6
commons-io
commons-io
2.5
ch.qos.logback
logback-core
1.1.7
ch.qos.logback
logback-classic
1.1.7
slf4j-api
org.slf4j
org.springframework.boot
spring-boot-starter-freemarker
org.springframework.cloud
spring-cloud-dependencies
Dalston.SR1
pom
import
org.springframework.boot
spring-boot-maven-plugin
maven-assembly-plugin
com.allen.capturewebdata.Main
jar-with-dependencies
org.apache.maven.plugins
maven-surefire-plugin
true
2、Application启动类添加Consul支持注解,从Consul发现服务
@EnableDiscoveryClient //服务发现客户端
@SpringBootApplication
public class Application {
public static void main(String[] args) throws Exception {
MotanSwitcherUtil.setSwitcherValue(MotanConstants.REGISTRY_HEARTBEAT_SWITCHER, true);
}
}
3、application.yml 配置 (几乎无需配置,当时未抽离数据源)
server:
port: 7777
spring:
profiles:
active: dev
---
spring:
profiles: dev
datasource:
url: jdbc:mysql://192.168.1.1:3306/config-client?characterEncoding=UTF8&useSSL=false&allowMultiQueries=true
driver-class-name: com.mysql.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
4、bootstrap.yml 配置(spring cloud config 客户端必须配置)
spring:
application:
name: client
profiles:
active: dev
management:
security:
enabled: false #关闭安全验证,与服务端一致,若开启同时服务端也需要相关配置
---
spring:
profiles: dev
cloud:
bus:
trace:
enabled: true #与配置服务端一样,客户端也有spring cloud bus 的消息追踪
consul:
#配置consul地址与服务端使用的地址一致
host: 192.168.1.1
port: 8500
discovery:
#需要配置成false,否则系统启动的时候,会向consul注册一个服务
register: false
config:
#获取对应配置中心的某个环境的配置,对应config-server-dev.properties 中的 dev
profile: dev
#获取对应配置中心的某个分支的配置,服务端 git 代码分支
label: master
#获取对应配置中心的服务名称
name: config-server
#服务发现配置
discovery:
#启用Consul服务发现
enabled: true
#对应配置中心服务实例名称
service-id: config-server
#是否快速失败
fail-fast: true
5、统一管理所有配置(读取配置中心配置)
@RefreshScope //配置实时刷新所必需注解
@Component
public class PropertiesFile {
/*配置中心具体配置的Key*/
@Value("{environment}")
public String environment;
public String getEnviroment(){
return environment;
}
}
6、获取配置
//注入配置管理类
@Autowired
private PropertiesFile propertiesFile;
public String test(){
//获取配置中心属性值,配置获取均使用get方法
String enviroment = propertiesFile.getEnvironment();
return enviroment;
}
这样就完成了config-server和config-client的全部配置
其他
一、抽离数据源至config-server可参照这里,支持多数据源,已经测试过可以使用,有兴趣的同学可以自行上手。
https://yq.aliyun.com/articles/8302
二、奈何才疏学浅,整个配置中心在应用上并不完善。顺带提一下Spring Cloud Config还有通过加密的方式保护配置信息数据,也可以整合Spring Security 进行安全验证,具体的实现大家可以先自行查阅资料,希望大家多多支持,如果有哪些地方讲得不合理,也希望能指出,大家共同进步。
这么说吧,如果你关心的是结局,是答案,是目的,你就读哲学,但如果你觉得人生的过程可能比答案还要迷人,你就要读文学。 -- 蒋勋 《生活十讲》