微服务架构中Springboot配置文件繁多,Apollo统一高效的管理Springboot配置文件。
简单说就是说所有Springboot项目本地不再需要配置文件,所有配置文件由Apollo统一管理,讲的高大上点叫做云配置。
Apollo优点:
其他的技术
不用docker搭建,docker搭建有问题的,需要调节一些参数。
百度网盘下载在你的Apollo界面中,新建一个项目,配置中只有AppId重要,其他随意选。在你的Springboot添加Maven依赖,2019年11为止最新的Apollo client jar包版本。
<dependency> <groupId>com.ctrip.framework.apollo</groupId> <artifactId>apollo-client</artifactId> <version>1.5.0</version> </dependency> 复制代码
和Springboot和Spring整合有两种方式(xml, 注解配置),这里我只讲注解配置。
按照上图,在Apollo端配置你的配置文件,修改启动文件和本地application.properties
import com.ctrip.framework.apollo.spring.annotation.EnableApolloConfig; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @EnableApolloConfig @RestController public class TestApplication { public static void main(String[] args) { SpringApplication.run(TestApplication.class, args); } @GetMapping("/hello") public String hello() { return "我是来自Apollo的8000"; } } 复制代码
本地文件配置,Apollo需要指定服务器地址,至此你不再需要把其他配置文件保存至本地。
#指定Appid,也就是你在Apollo创建项目指定的Appid,一定要指定对 app.id=test #指定你的Apollo地址,Apollo 8070为WebUI地址,8080为Eureka注册地址 apollo.meta=http://192.168.208.102:8080 复制代码
本地访问 localhost:8000,注意这个8000是上图中我指定的server.port=8000
到此第一个云配置完成,简单吧。
本地开发我们可以有两个application.yml和application.properties,yml保存我们本地开发的配置,properties保存apollo的配置,本地开发时,我们只需要注释掉properties内的内容,注释掉@EnableApolloConfig即可完成加载本地yml配置文件,上线反之。通过注释文件和代码即可完成本地线上环境切换。
首先我们先有一个概念
AppId 对 省
集群 对 市
NameSpace 对 区
nameSpace是最底层的配置文件的描述,可以理解namesapce就是一个文件
那么我们如何通过Apollo客户端描述一个NameSpace,就像我们如何精确描述一个区一样的。
首先我们创建一个private类型yml格式的NameSpace,名称随意,只要本地配置文件能对应上就可以了。
#指定Appid,也就是你在Apollo创建项目指定的Appid,一定要指定对 app.id=test #指定你的Apollo地址,Apollo 8070为WebUI地址,8080为Eureka注册地址 apollo.meta=http://192.168.208.102:8080 apollo.bootstrap.enabled=true #如果你不手动指定集群,默认集群就是default #如何指定集群 apollo.cluster={你的集群名} #指定下你的yml配置的namespace apollo.bootstrap.namespaces=testyml 复制代码
启动报错
2019-11-09 04:16:14.513 WARN 9116 --- [ main] c.c.f.a.i.AbstractConfigRepository : Sync config failed, will retry. Repository class com.ctrip.framework.apollo.internals.RemoteConfigRepository, reason: Load Apollo Config failed - appId: test, cluster: default, namespace: testyml, url: http://192.168.208.102:8080/configs/test/default/testyml?ip=192.168.208.1 [Cause: [status code: 404] Could not find config for namespace - appId: test, cluster: default, namespace: testyml, please check whether the configs are released in Apollo!] 复制代码
有报错,根本不慌
报错为 http://192.168.208.102:8080/configs/test/default/testyml?ip=192.168.208.1 404找不到,可以看到我们Apollo客户端其实就是用Http请求拿去配置数据(上面的ip地址分别是我apollo部署的地址和我本机的地址),但是我们如果更改配置为http://192.168.208.102:8080/configs/test/default/application?ip=192.168.208.1也就是将testyml改为我们已有的application NameSpace,却可以访问成功。
怎么搞?
我第一想到去持久层Mysql看下。在ApolloConfigDB.AppNamespace表中我们可以看到,最后我们配置的yml类型Namespace存储携带了yml后缀,所以我们添加yml文件后缀名.
#修改配置文件application.properties apollo.bootstrap.namespaces=testyml.yml 复制代码
相信看到这里,Apollo也不难嘛,很容易用的,它主要优点来自于WebUI和细粒度的配置管理。
好的,我们写一个复杂的
@SpringBootApplication @EnableApolloConfig @RestController public class TestApplication { //在你yml里面添加一个 //test: 随意 @Value("${test}") private String content; public static void main(String[] args) { SpringApplication.run(TestApplication.class, args); } //监听testyml.yml的变化,填你自己的Namespace啊 @ApolloConfigChangeListener("testyml.yml") public void change(ConfigChangeEvent cg){ System.out.println("发生改变了啦,我听到了啊--------------------" + cg.getChange("test")); } @GetMapping("/hello") public String hello() { return "我是来自Apollo的" + content; } } 复制代码
application.properties文件
#指定Appid,也就是你在Apollo创建项目指定的Appid,一定要指定对 app.id=test #指定你的Apollo地址,Apollo 8070为WebUI地址,8080为Eureka注册地址 apollo.meta=http://192.168.208.102:8080 apollo.bootstrap.enabled=true #指定下你的yml配置 apollo.bootstrap.namespaces=testyml.yml 复制代码
启动后,可以尝试去Apollo修改下你的NameSpace的test对应的value,看看程序会打印出来什么。
参考别人写好的业务Demo 。
Apollo易用性,集群性,高可用非常适合企业开发,而且他用法远不止作为SpringBoot的配置管理,既然我们可以通过Http拿到配置数据,是不是还有其他很多的应用方法。
最后一句话:Apollo不难,多看看github文档你就会了(中文的啊,还有专门的源码解析)