Apollo配置中心迁移Consul落地技术方案(Spring项目)
1、前言
实习接到的第一个需求,网上找遍资料也没有Apollo迁移Consul的具体文章,所以还是自己动手来做。Apollo相对Consul提供了更多方便实用的api,所以在代码方面需要改动的地方比较多,这也是本文的重点。公司相关信息已做隐私处理。
2、依赖导入
//SpringCloud集成Consul服务注册发现
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
//SpringCloud集成Consul配置中心
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-config</artifactId>
</dependency>
//在单元测试中嵌入式运行Consul库
<dependency>
<groupId>com.pszymczyk.consul</groupId>
<artifactId>embedded-consul</artifactId>
</dependency>
3、Bootstrap配置
仅做参考,具体参数待定
spring:
profiles:
active: dev
cloud:
consul:
host: ${
CONSUL_HOST:127.0.0.1}
port: ${
CONSUL_PORT:8500}
config:
prefix: config
default-context: orderService
enabled: ${
CONSUL_CONFIG_ENABLED:true}
format: YAML
data-key: ${
SPRING_CONSUL_CONFIG_FILE:data}
failFast: true
profileSeparator: '-'
overrideNone: false
watch:
enabled: true
delay: 1000
wait-time: 30
这段配置表示读取配置中心下config/orderService-dev的配置,且如果没有指定读取的key就由data作为key。
对于环境的区分,Consul采用字符串切割的形式,默认是",“,如上配置我改成了”-“。假如config文件夹下分别由"orderService-dev”,“orderService-prod”,“orderService-test”,“orderService”,我们可以通过更改active配置项来选择不同的Consul文件夹,从而加载不同的配置,默认加载"orderService",即没有指定环境。
4、配置项的迁移
原Apollo的配置是依据应用、环境、集群进行了配置划分
app:
id: ${
APOLLO_APP_ID:aaabbb123456789}
apollo:
meta: ${
APOLLO_CLUSTER:http://zheshiyigelianjie.com}
cluster: ${
APOLLO_META:default}
cacheDir: ./data/settings/
bootstrap:
enabled: true
而在Consul中,不同纬度的区分则是文件夹层级的区别,我们只需要按照原Apollo的纬度创建一一对应的文件夹,类似于"/应用-环境/集群"的格式即可。
需要注意的是,Consul不支持json格式的Value值输入,也就是,只要被"{}“或”[]"包起来的Value必须要用单引号圈起来。
jsonConfig2:
arrayList: '["zhangsan","lisi","wangwu"]'
关于json输入,Apollo可以直接读取,会在下面代码改造部分讲到。
5、代码改造
代码改造这部分,我将其划分为需要改造和不需要改造的部分
5.1、普通注入(不需要改造)
普通注入的代码主要分为三种,一种是在applica.yml文件中,如下代码:
SERVER_IP: ${
spring.cloud.client.ip-address}
server:
port: ${
SERVER_PORT:8080}
ip: ${
SERVER_IP}