使用某个框架之前,得先看看前辈们踩过的坑。
他人的间接经验 -> 自己的直接经验
前车之鉴,后事之师。比喻前人失败了,后人应该从中吸取教训,避免再犯同样的错误。
常见问题回答
1. Apollo是什么?
Apollo(阿波罗)是一款可靠的分布式配置管理中心,能够集中化管理应用的不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
更多介绍,可以参考Apollo配置中心介绍
2. Cluster是什么?
一个应用下不同实例的分组,比如典型的可以按照数据中心分,把A机房的应用实例分为一个集群,把B机房的应用实例分为另一个集群。
3. Namespace是什么?
一个应用下不同配置的分组。 请参考Apollo核心概念之“Namespace”
4. 我想要接入Apollo,该如何操作?
请参考Apollo使用指南
5. 我的应用需要不同机房的配置不一样,Apollo是否能支持?
Apollo是支持的。请参考Apollo使用指南中的三、集群独立配置说明
6. 我有多个应用需要使用同一份配置,Apollo是否能支持?
Apollo是支持的。请参考Apollo使用指南中的四、多个AppId使用同一份配置
7. Apollo是否支持查看权限控制或者配置加密?
从1.1.0
版本开始,apollo-portal增加了查看权限的支持,可以支持配置某个环境只允许项目成员查看私有Namespace的配置。
这里的项目成员是指:
- 项目的管理员
- 具备该私有Namespace在该环境下的修改或发布权限
配置方式很简单,用超级管理员账号登录后,进入管理员工具 - 系统参数
页面新增或修改configView.memberOnly.envs
配置项即可。
配置加密可以参考spring-boot-encrypt demo项目
8. 如果有多个config server,打包时如何配置meta server地址?
有多台meta server可以通过Nginx反向代理,通过一个域名代理多个meta server实现。
9. Apollo相比于Spring Cloud Config有什么优势?
Spring Cloud Config的精妙之处在于它的配置存储于Git,这就天然的把配置的修改、权限、版本等问题隔离在外。通过这个设计使得Spring Cloud Config整体很简单,不过也带来了一些不便之处。
下面尝试做一个简单的小结:
10. Apollo和Disconf相比有什么优点?
由于我们自己并非Disconf的资深用户,所以无法客观地给出评价。不过之前Apollo技术支持群中的热心网友 @Krast 做了一个开源配置中心对比矩阵,可以参考一下。
部署&开发遇到的常见问题
1. windows怎么执行build.sh?
安装Git Bash,然后运行 ./build.sh
注意前面 ./
。
也可以直接运行build.bat
2. 本地运行时Portal一直报Env is down.
默认config service启动在8080
端口,admin service启动在8090
端口。请确认这两个端口是否被其它应用程序占用。
如果还伴有异常信息:org.springframework.web.client.HttpClientErrorException: 405 Method Not Allowed,一般是由于本地启动了ShadowSocks,因为ShadowSocks默认会占用8090端口。
1.1.0版本增加了系统信息页面,可以通过管理员工具
-> 系统信息
查看当前各个环境的Meta Server以及admin service信息,有助于排查问题。
3. admin server 或者 config server 注册了内网IP,导致portal或者client访问不了admin server或config server
请参考网络策略。
4. Portal如何增加环境?
4.1 1.6.0
及以上的版本
1.6.0
版本增加了自定义环境的功能,可以在不修改代码的情况增加环境。
- protaldb增加环境,参考3.1 调整ApolloPortalDB配置
- 为apollo-portal添加新增环境对应的meta server地址,具体参考:2.2.1.1.2.4 配置apollo-portal的meta service信息。apollo-client在新的环境下使用时也需要做好相应的配置,具体参考:1.2.2 Apollo Meta Server。
注1:一套Portal可以管理多个环境,但是每个环境都需要独立部署一套Config Service、Admin Service和ApolloConfigDB,具体请参考:2.1.2 创建ApolloConfigDB,3.2 调整ApolloConfigDB配置,2.2.1.1.2 配置数据库连接信息
注2:如果是为已经运行了一段时间的Apollo配置中心增加环境,别忘了参考2.1.2.4 从别的环境导入ApolloConfigDB的项目数据对新的环境做初始化
注3:如果自定义的环境名称为 PROD,会被强制转换为 PRO。FWS 会被强制转换为 FAT。
4.2 1.5.1
及之前的版本
4.2.1 添加Apollo预先定义好的环境
如果需要添加的环境是Apollo预先定义的环境(DEV, FAT, UAT, PRO),需要两步操作:
- protaldb增加环境,参考3.1 调整ApolloPortalDB配置
- 为apollo-portal添加新增环境对应的meta server地址,具体参考:2.2.1.1.2.4 配置apollo-portal的meta service信息。apollo-client在新的环境下使用时也需要做好相应的配置,具体参考:1.2.2 Apollo Meta Server。
注1:一套Portal可以管理多个环境,但是每个环境都需要独立部署一套Config Service、Admin Service和ApolloConfigDB,具体请参考:2.1.2 创建ApolloConfigDB,3.2 调整ApolloConfigDB配置,2.2.1.1.2 配置数据库连接信息
注2:如果是为已经运行了一段时间的Apollo配置中心增加环境,别忘了参考2.1.2.4 从别的环境导入ApolloConfigDB的项目数据对新的环境做初始化
4.2.2 添加自定义的环境
如果需要添加的环境不是Apollo预先定义的环境,请参照如下步骤操作:
- 假设需要添加的环境名称叫beta
- 修改com.ctrip.framework.apollo.core.enums.Env类,在其中加入BETA枚举:
- 修改com.ctrip.framework.apollo.core.enums.EnvUtils类,在其中加入BETA枚举的转换逻辑:
- 修改apollo-env.properties,增加beta.meta占位符:
- 修改com.ctrip.framework.apollo.core.internals.LegacyMetaServerProvider类,增加读取BETA环境的meta server地址逻辑:
- protaldb增加BETA环境,参考3.1 调整ApolloPortalDB配置
- 为apollo-portal添加新增环境对应的meta server地址,具体参考:2.2.1.1.2.4 配置apollo-portal的meta service信息。apollo-client在新的环境下使用时也需要做好相应的配置,具体参考:1.2.2 Apollo Meta Server。
注1:一套Portal可以管理多个环境,但是每个环境都需要独立部署一套Config Service、Admin Service和ApolloConfigDB,具体请参考:2.1.2 创建ApolloConfigDB,3.2 调整ApolloConfigDB配置,2.2.1.1.2 配置数据库连接信息
注2:如果是为已经运行了一段时间的Apollo配置中心增加环境,别忘了参考2.1.2.4 从别的环境导入ApolloConfigDB的项目数据对新的环境做初始化
5. 如何删除应用、集群、Namespace?
0.11.0
版本开始Apollo管理员增加了删除应用、集群和AppNamespace的页面,建议使用该页面进行删除。
页面入口:
页面详情:
6. 客户端多块网卡造成获取IP不准,如何解决?
获取客户端网卡逻辑在1.4.0
版本有所调整,所以需要根据客户端版本区分。
6.1 apollo-client为1.3.0
及之前的版本
如果有多网卡,且都是普通网卡的话,需要在/etc/hosts里面加一条映射关系来提升权重。
6.2 apollo-client为1.4.0
及之后的版本
如果有多网卡,且都是普通网卡的话,可以通过调整它们在系统中的顺序来改变优先级,顺序在前的优先级更高。
7. 通过Apollo动态调整Spring Boot的Logging level
可以参考apollo-use-cases项目中的spring-cloud-logger和spring-boot-logger代码示例。
8. 将Config Service和Admin Service注册到单独的Eureka Server上
Apollo默认自带了Eureka作为内部的注册中心实现,一般情况下不需要考虑为Apollo单独部署注册中心。
9. Spring Boot中使用ConditionalOnProperty
读取不到配置
@ConditionalOnProperty
功能从0.10.0
版本开始支持,具体可以参考 Spring Boot集成方式
10. 多机房如何实现A机房的客户端就近读取A机房的config service,B机房的客户端就近读取B机房的config service?
请参考Issue 1294,该案例中由于中美机房相距甚远,所以需要config db两地部署,如果是同城多机房的话,两个机房的config service可以连同一个config db。
11. apollo是否有支持HEAD请求的页面?阿里云slb配置健康检查只支持HEAD请求
apollo的每个服务都有/health
页面的,该页面是apollo用来做健康检测的,支持各种请求方法,如GET, POST, HEAD等。
12. apollo如何配置查看权限?
从1.1.0
版本开始,apollo-portal增加了查看权限的支持,可以支持配置某个环境只允许项目成员查看私有Namespace的配置。
这里的项目成员是指:
- 项目的管理员
- 具备该私有Namespace在该环境下的修改或发布权限
配置方式很简单,用超级管理员账号登录后,进入管理员工具 - 系统参数
页面新增或修改configView.memberOnly.envs
配置项即可。
13. apollo如何放在独立的tomcat中跑?
有些公司的运维策略可能会要求必须使用独立的tomcat跑应用,不允许apollo默认的startup.sh
方式运行,下面以apollo-configservice为例简述一下如何使apollo服务端运行在独立的tomcat中:
14. 注册中心Eureka如何替换为ZooKeeper?
许多公司微服务项目已经在使用ZooKeeper,如果出于方便服务管理的目的,希望Eureka替换为ZooKeeper的情况,可以参考@hanyidreamer贡献的改造步骤:注册中心Eureka替换为zookeeper
15. 本地多人同时开发,如何实现配置不一样且互不影响?
参考#1560
16. Portal挂载到nginx/slb后如何设置相对路径?
一般情况下建议直接使用根目录来挂载portal,不过如果有些情况希望和其它应用共用nginx/slb,需要加上相对路径(如/apollo),那么可以按照下面的方式配置。
17. Portal挂载到nginx/slb后如何配置https?
- 在nginx/slb上配置https访问配置,以nginx为例:
- 配置apollo-portal解析反向代理的header信息
修改apollo-portal安装包中config目录下的application-github.properties
,增加以下配置:
server.forward-headers-strategy=framework