背景
配置文件都放在文件目录,因为服务多了又有负载均衡,每个项目启动加载基础配置,
比如:数据库配置发生变化,需要统一下发就轻松的多;
特性
- 比较独立没什么依赖就一个数据库;
- 内置了eureka实现了高可用;
- 相对于config还需要用到bus消息总线;
服务整体结构
- 服务端
- potal传递配置参数;
- admin接收到potal传递的参数,写入到DB;
- config内置了eureka,就知道appid下有哪些实例,由config推送配置到客户端;
- 客户端
- 首次启动向配置中心拉取配置;
- 连接到config,config访问admin获取配置;
- 由config响应给客户端;
角色
portal:前端ui入口
adminService:后台springBoot服务,所有配置的增删改查功能;
admin新增1个配置到数据库,admin是一个spring boot服务;
configService:后台springBoot服务,找配置和推配置的功能;
配置有修改admin会通知configService,config和客户端建立连接,推给客户端,同样客户端也向config找配置
对比
- apollo、nacos:消息推送机制;默认缓存本地;
- config:配置存储机制,
安装部署
下载
https://github.com/apolloconfig/apollo/releases/tag/v1.7.1
建立数据库
- 执行建库脚本
解压上传服务器
- unzip apollo-configservice-1.7.1-github.zip -d /root/apollo-configservice-1.7.1
- unzip apollo-portal-1.7.1-github.zip -d apollo-portal-1.7.1
- unzip apollo-adminservice-1.7.1-github.zip -d apollo-adminservice-1.7.1
配置修改
config:8080、admin:8090(连接ApolloConfigDB库)
-
config/application-github.properties
spring.datasource.url = jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf8&serverTimeZone=Asia/Shanghai spring.datasource.username = root spring.datasource.password =
portal:8070(连接ApolloPortalDB库)apollo/admin
- config/application-github.properties
spring.datasource.url = jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8&serverTimeZone=Asia/Shanghai spring.datasource.username = root spring.datasource.password =
- config/apollo-env.properties
多套环境注册到不同环境的config注册中心local.meta=http://localhost:8080 dev.meta=http://localhost:8080 #fat.meta=http://fill-in-fat-meta-server:8080 #uat.meta=http://fill-in-uat-meta-server:8080 #lpt.meta=${lpt_meta} #pro.meta=http://fill-in-pro-meta-server:8080
启动
config
admin
portal![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e3c0518f1cc391db08158c9e707fc76b.png)
portal使用
创建项目
部门修改
创建使用
- 创建项目
- 查看项目
- 编辑配置
- 如何匹配上
客户端配置
-
pom
<dependency> <groupId>com.ctrip.framework.apollo</groupId> <artifactId>apollo-client</artifactId> <version>1.7.0</version> </dependency>
-
application.properties
app.id=number apollo.bootstrap.enabled=true apollo.bootstrap.namespaces=application
-
VM options
-Denv=dev -Dapollo.configService=http://8.142.79.41:8080
密钥配置,基于springSecurity
- apollo.accesskey.secret=7c306c51dfcb409393d128e3f0dcd3d6
配置下发与热更新
- 二次开发,比如某个key不像立即加载;
@Configuration public class ApolloConfig { @Bean public void config(){ Config config = ConfigService.getAppConfig(); config.addChangeListener(changeEvent -> { System.out.println("change for namespace:"+changeEvent.getNamespace()); for (String key : changeEvent.changedKeys()) { if ("name".equals(key)){ System.out.println("做二次开发~~~~ "); } ConfigChange change = changeEvent.getChange(key); System.out.println("我来了啊~~~~ "+change); } }); } }
长轮询机制
- client给config发http长轮询请求,60秒返回个304就重新挂一次就这样一直挂着,有配置修改了就给client返回;
- 短轮询:每隔2秒就请求1次问一下有没有?
灰度发布(配置的灰度针对ip)
应用的灰度
- 1号机是V1代码;
- 2号机是V2代码;
Apollo后端服务配置的灰度
- redis买了几台新机器,先发几台试试,全ok了在全部发送配置;
- 限制了某几台性能差的机器并发量小点;
除了appid还有机器的ip,给这台机器设置并发为100;
Apollo使用灰度
- 开启灰度
- 灰度规则(选择主机ip)
- 灰度验证没问题合并到主版本
- 选择灰度发布规则
- 合并成功到主版本,并且删除灰度
namespace配置分组(redis、mysql、mq、权限相关的)
创建的分组和部门有关
- 创建分组
- 配置授权,谁可以编辑谁可以发布
坑
记录apollo坑:无法拉取配置
Apollo部署在私有云上,本地开发环境无法连接,但又需要做开发测试的话,客户端可以升级到0.11.0版本及以上,然后通过-Dapollo.configService=http://config-service的公网IP:端口来跳过meta service的服务发现
错误如下
reason: Could not complete get operation [Cause: connect timed out]
解决方法: