对比springcloud的config配置中心,无法动态更改项目的配置文件并应用到服务上去,可以采用apollo配置中心替代,它可以不仅提供了实时更新服务配置中心,还提供的权限配置和相应的web界面功能,功能强大而友好。
其原理图如下:
1、为了防止apollo服务端推送失败,客户端默认每隔5分钟主动向服务端发起一次请求,请求获取最新的配置信息
2、为了防止网络不通和保证服务的高可用,依然能从本地恢复配置,除了在jvm内部缓存信息还会在本地文件系统中缓存配置信息
个人认为,apollo因为有本地缓存可以不用搭建集群或apollo服务端实例不用布署那么多,而且配置信息一般没什么改动。不用像eureka那样最好搭建集群,eureka是获取服务的地址,很重要,如果不能即时获取各个服务的情况将很严重。
疑问:为什么要建立长连接,如果配置信息在apollo服务端上有变动,不能通过服务端主动向应用程序发起请求吗?
不能,这是因为建立在微服务实例地址无变化,而且微服务实例数量不会增加的前提下。如果我想增加几台机器,那么apollo服务端如何能事先知道新增机器的地址,手动在服务端写入地址也不合适。
由于Quick Start项目比较大,所以放在了另外的repository,请注意项目地址
下载项目https://github.com/nobodyiam/apollo-build-scripts
导入sql文件下的两个mysql数据库脚本(mysql>=5.7)
更改demo.sh文件的数据库用户和密码名
#!/bin/bash
# apollo config db info
apollo_config_db_url=jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf8
apollo_config_db_username=root
apollo_config_db_password=123456
# apollo portal db info
apollo_portal_db_url=jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8
apollo_portal_db_username=root
apollo_portal_db_password=123456
还有对应配置地址
# meta server url
config_server_url=http://localhost:8080
admin_server_url=http://localhost:8090
eureka_service_url=$config_server_url/eureka/
portal_url=http://localhost:8070
/opt/settings/server.properties指定为开发版本
env=DEV
启动命令(./demo.sh start),此时如无意外,那么apollo服务端就启动起来了,访问http://localhost:8070
项目中如何引用呢?
首先,配置maven依赖
<!-- apollo 携程apollo配置中心框架 -->
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-core</artifactId>
<version>1.0.0</version>
</dependency>
然后,在resources文件夹下建立META-INF文件夹并新建app.properties配置文件,在resources还要新建apollo-env.properties配置文件
app.properties内容如下,app.id是在apollo新建一个项目时所指定的id
app.id=a
apollo-env.properties内容如下,http://127.0.0.1:8080就是config_server_url的地址,也可以说是eureka的地址
local.meta=http://127.0.0.1:8080
dev.meta=http://127.0.0.1:8080
fat.meta=${fat_meta}
uat.meta=${uat_meta}
lpt.meta=${lpt_meta}
pro.meta=${pro_meta}
最后一步,启动类加上apollo的注解