原来的单体项目,我们在做配置的时候其实是很轻松的,一个配置文件就可以搞定了,但是在分布式环境下,如果想动态改变系统配置,无非就是以下几种方式:
那么配置中心就是解决了上述的这些问题
Apollo配置中心流程
用户通过管理后台发布配置之后,后台会请求adminService将配置更新到DB,然后异步通知configService读取DB中的配置信息,configService读取到DB中的配置信息后通知client
内部的异步通知的实现:
在内部其实是通过releaseMessage的表来保存所有adminService的异步通知,每次adminService接收到配置更新的消息就会在releaseMessage新增一条消息记录
configService内部有一个线程每秒检查一次releaseMessage表,检测到有新配置消息,就会对客户端进行通知
configService通知客户端的方式
configService通知客户端的方式有主动推送,也有客户端主动的拉取
客户端的主动拉取是备用机制,因为客户端和服务端的连接是一个长连接,为了防止连接断开,需要每隔一段时间主动更新配置
那么主要还是configService主动推送,原理:就是客户端请求configService下的接口,但是这个接口不会理解返回结果,而是把请求挂起,考虑到会有数万的客户端向服务端发起连接,因此服务端采用async servlet来服务http long polling请求。如果60s内没有该客户端关心的配置发布,那么会返回304给客户端,如果有,则传回对应的配置信息并且该请求立刻返回,客户端获取到返回的namespace后请求configService获取最新配置
导入数据库
Apollo服务端共需要两个数据库:ApolloPortalDB和ApolloConfigDB,我们把数据库、表的创建和样例数据都分别准备了sql文件,只需要导入数据库即可。
https://github.com/nobodyiam/apollo-build-scripts.git
分别导入
source /your_local_path/sql/apolloportaldb.sql
source /your_local_path/sql/apolloconfigdb.sql
配置数据库连接信息
Apollo服务端需要知道如何连接到你前面创建的数据库,所以需要编辑demo.sh,修改ApolloPortalDB和ApolloConfigDB相关的数据库连接串信息。
#apollo config db info
apollo_config_db_url=jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf8
apollo_config_db_username=用户名
apollo_config_db_password=密码(如果没有密码,留空即可)
# apollo portal db info
apollo_portal_db_url=jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8
apollo_portal_db_username=用户名
apollo_portal_db_password=密码(如果没有密码,留空即可)
注意:不要修改demo.sh的其它部分
执行脚本启动
./demo.sh start
有以下输出代表成功:
==== starting service ====
Service logging file is ./service/apollo-service.log
Started [10768]
Waiting for config service startup.......
Config service started. You may visit http://localhost:8080 for service status now!
Waiting for admin service startup....
Admin service started
==== starting portal ====
Portal logging file is ./portal/apollo-portal.log
Started [10846]
Waiting for portal startup......
Portal started. You can visit http://localhost:8070 now!
查看Apollo配置中心
打开http://localhost:8070
引入依赖
<dependency>
<groupId>com.ctrip.framework.apollogroupId>
<artifactId>apollo-clientartifactId>
<version>1.1.0version>
dependency>
启动类开启注解
@SpringBootApplication
@EnableApolloConfig
public class ApolloDemo {
public static void main(String[] args) {
SpringApplication.run(ApolloDemo.class,args);
}
}
yaml配置文件添加配置
server:
port: 8761
app:
id: apollodemo # appid添加Apollo后台中的appid,一般是服务名
apollo:
meta: http://47.103.95.233:8080
bootstrap:
enabled: true
eagerLoad:
enabled: true
logging:
level:
com:
gf:
controller: debug
获取配置
获取配置通过spring的注解@Value来获得
@Configuration
public class JavaConfig {
@Value("${timeout:20}")
private int timeout;
public int getTimeout() {
return timeout;
}
}