基于Springboot的Apollo基本使用(一)
1.Apollo简介
项目组最近的项目都是使用springcloud微服务开发,整个微服务框架中分布式的系统服务、集群等等都非常的多。
每一个服务都有着自己的配置(包括参数配置、服务器地址配置、功能开关等都能),当配置需要修改的时候就显得异常的麻烦,传统的通过配置文件、数据库配置完全不能满足要求。
在这种情况下,诞生了很多的统一配置的服务,虽然springcloud有自己的config配置中心,但是和携程的apollo相比还是太弱了,对比之后我们使用了Apollo。
Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性。
github上携程开发人员对Apollo做了特别细致的介绍,但是对于我们只使用springboot进行开发的项目来说,其实只用到了里面一小部分内容。
因此我主要将Apollo和Springboot相关的内容整理出来,本文首先对Apollo进行QuickStart简单入门介绍以及基于Springboot框架的使用。
1.1Apollo配置中心基础模型
- 开发人员在配置中心对某些应用的配置(就是一些键值对的信息)进行修改
- 配置中心通知客户端进行配置更新(需要注册监听事件)
- Apollo客户端(应用程序)从配置中心拉取更新最新配置
1.2Apollo的总体设计
上图是Apollo的总体设计,从下往上看:
- ConfigService(Apollo集成在一个jar包中)提供配置的读取,推送功能,Apollo客户端(你的应用程序)从这儿读取配置。
- AdminService(Apollo集成在一个jar包中)提供配置的修改、发布功能,Apollo Portal(开发人员登录的修改配置的系统)调用该服务。
- ConfigService和AdminService都是多实例服务,需要将它们注册到Eureka中。
- 在Eureka之上有一层MetaServer用于封装Eureka的服务发现接口。
- Client和Portal通过域名访问MetaServer获取ConfigService和AdminService的服务列表(IP+Port),然后直接通过套接字访问服务。
- 为了简化部署,实际上会把Configservice、Eureka和MetaServer部署在同一个JVM进程中。
1.3Apollo配置分类
因为对于不同的应用,在不同的环境(开发、测试)、不同的集群(华东、华北)、不同的命名空间(例如springboot的application.property文件、你自己自定义的myappconfig.property),配置都有可能不同。
所以Apollo支持了4个维度管理Key-Value格式的配置(这些都是可以配置的):
- application(应用)
- 在springboot的application.property定义appid这个key的value,标识该类型的应用。
- environment(4种环境)
- DEV(开发环境)
- FAT(功能测试)
- UAT(验收测试)
- PRO(生产环境)
- cluster(集群)
- namespace(命名空间,其实就是某个应用的不同配置文件)
2.Apollo QuickStart
携程的开发人员为了让大家几分钟快速上手Apollo配置中心,已经准备了一套安装包,大家按照教程马上就能部署好了(注意windows环境要安装能运行bash脚本的软件如gitbash)——》QuickStart github地址。
安装包在不同的端口安装了配置中心的不同服务:
- http://localhost:8070 Portal客户端的服务
- http://localhost:8080 ConfigService、MetaServer、Eureka服务
- http://localhost:8090 可能是AdminService服务
1. 打开 http://localhost:8070 进入配置中心就可以对各种应用进行配置(修改键值对)
- 进入配置中心就可以新建项目(对应你的应用)
比如你有一个叫KiddService的接口,可以给它起一个唯一标识的应用Id(这里我叫kiddApp),提交之后在主页就可以看到了。
-
进入该项目的配置,先发布后配置或先配置后发布都行,这样你的应用就可以从配置中心拉取配置了。
-
编辑配置,其实就是添加或修改键值对
2. Springboot客户端连接Apollo配置中心
使用Springboo客户端连接Apollo特别的简单,只需要几步:
-
必要的设置
- AppId,在application.properties文件加入指定appId,app.id=YOUR-APP-ID。
- Apollo Meta Server,前面说过,这是对Eureka的一个封装服务,主要是用来得到ConfigServer的地址。在application.properties或bootstrap.properties中指定apollo.meta=http://config-service-url。
- 本地配置缓存路径,确保目录存在
- Mac/Linux: /opt/data/{appId}/config-cache
- Windows: C:\opt\data{appId}\config-cache
-
可选设置
- Environment(上面说的四种环境)
- 在Java程序启动脚本中,可以指定-Denv=YOUR-ENVIRONMENT
- 还可以通过操作系统的System Environment ENV来指定
- 通过配置文件来指定env=YOUR-ENVIRONMENT;(windows C:\opt\settings\server.properties)(linux /opt/settings/server.properties)
- Cluster(集群)
- 在Java程序启动脚本中,可以指定-Dapollo.cluster=SomeCluster
- 过Spring Boot的配置文件,apollo.cluster=SomeCluster
- 可以在server.properties配置文件中指定idc=xxx
- Environment(上面说的四种环境)
例如在我的quickstart测试环境中我在application.properties文件中只要如下配置就行了:
server.port=9017
app.id=apolloapp
apollo.meta=http://127.0.0.1:8080
- Maven Dependency(maven的依赖)
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.0.0</version>
</dependency>
-
获取本应用的配置
在springboot下获取配置的方法有很多种,以我开发的KiddService为例:
- 1.直接调用Apollo的api(代码非常简单,废话。如果仅仅为了获取一个配置值搞得那么复杂别人还用它干啥?)
Config config = ConfigService.getAppConfig(); //config instance is singleton for each namespace and is never null String someKey = "key1"; String someDefaultValue = "none"; String value = config.getProperty(someKey, someDefaultValue);
- 2.使用xml整合Spring(都什么年代了,还用xml,这里不介绍了,有兴趣的同学去看Apollo Java客户端使用指南)
- 3.使用Java配置(注意有两个注解)
@Configuration @EnableApolloConfig public class AppConfig { @Bean public TestJavaConfigBean javaConfigBean() { return new TestJavaConfigBean(); } } public class TestJavaConfigBean { @Value("${timeout:100}") private int timeout; private int batch; @Value("${batch:200}") public void setBatch(int batch) { this.batch = batch; } public int getTimeout() { return timeout; } public int getBatch() { return batch; } }
一般所有的配置放在一个bean里面就可以了