中间件使用:apollo

夏侯兰
• 阅读 2983

Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。

功能:

  • 统一管理不同环境、不同集群的配置,以命名空间namespace为最小粒度进行配置,一个服务引入了这个命名空间,即使用了该命名空间的配置。
  • 配置修改实时生效
  • 版本发布管理
  • 灰度发布
  • 权限管理、发布审核、操作审计
  • 客户端配置信息监控

使用:

  • 服务端的配置:

    • 新建appId,appId可以理解为是一套应用。在appId新建namespace添加配置内容。Namespace可以理解为是配置的集合,原先一个yml文件存放配置,现在可以通过某个环境 ,某个appId下的namespace引入。
  • 客户端的使用:

    • 引入maven包并在启动类加入@EnableApollo即可,通过meta.server,appId和namespace找到所需的配置。可以理解为在apollo的配置就在配置文件里。通过@Value,@ConfigurationProperties引入的变量不受影响,对代码的入侵比较小。
    • 监听配置的变化,不同的namespace
  • 在项目的使用:

    • 把配置信息放入apollo。直接的做法是每个服务使用一个namespace,但是经过梳理发现,有些配置是多个服务共同使用的。
    • 服务的配置进行分类:

      • 通用:Log,eureka,feign调用相关的
      • 某些服务公用:database(openapi monitor) redis(card openapi double) kafka activemq ElasticSearch
      • 各自的服务拥有单独的namespace

经过分类后,如果要修改数据库地址,redis地址,或者新增一个中间件的地址,只用新增namespace,在配置文件引入/修改该namespace即可。
如果想更改某个服务的配置,在相应的namespace下修改,并重启docker服务。可以看到发布历史,有哪些实例在使用。
项目是用docker部署的,原先一部分配置在服务里,一部分配置在docker-compose里,改造后尽可能所有的配置都放在apollo里,apollo的配置放在docker-compose.yml里,docker-compose.yml可以引入公共的配置文件env_file,真正的apollo配置存放文件,包括apollo.meta,app.id,apollo.cacheDir,不用再通过profile.active区分。一些无法通过apollo配置的放在服务的配置或docker的配置中。理论上能当在服务的配置文件里的都能放在apollo里。
每个服务只需一个配置文件,甚至不用配置文件。为了本地开发的方便,在本地放置了sit环境的配置。
通过apollo.meta区分不同的环境,apollo.meta变量通过docker-compose文件的公共配置env_file引入

需要注意的:

  • 配置的备份
  • 假设两个人对同一个服务进行开发,需要修改配置
  • Application里的配置会实时生效,自定义的namespace不会。
  • 开关,限流额度,路径
  • 对于日志级别,database等需要更新bean的,需要写代码

Namespace的类型:

  • 私有:namespace从属于appId,只有配置了该appId才可访问
  • 公有:只要连上了apollo就能使用,属于所有应用,全局唯一
  • 关联:属性是私有的,可以理解为在继承公有属性的基础上,可对公有属性进行修改

其他的功能:

  • 密钥管理,保护配置不被其他应用获取
  • 权限分配:以namespace为粒度分配修改,发布,查看的权限
  • 添加集群
  • 配置覆盖,前面的会覆盖后面的,尽可能不要覆盖,保证配置的唯一性

架构:
中间件使用:apollo
从逻辑上来说比较清晰,将配置的编辑/发布与客户端获取配置分开,用两个服务实现
Portal通过调用admin service接口修改配置
Client通过config service接口获取配置
为了保证高可用,添加了一层eureka,client和portal通过eureka调用接口服务。
为了使不同语言的client可通过http接口即可获取admin service和config service的信息,eureka上搭建Meta service,用来封装服务发现的细节,不用关心背后的注册中心和服务发现组件(用于不同语言的服务注册到eureka上)。

完整架构如下:
中间件使用:apollo
主要模块:

  • Config Service:配置的读取、推送等,服务对象是Apollo客户端
  • Admin Service:配置的修改、发布等,服务对象是Apollo Portal(管理界面)
  • Config Service和Admin Service都是多实例、无状态部署,所以需要将自己注册到Eureka中并保持心跳
  • Meta Server:在Eureka之上搭建,用于封装Eureka的服务发现接口:

    • Client通过域名访问Meta Server获取Config Service服务列表(IP+Port),而后直接通过IP+Port访问服务,同时在Client侧会做load balance、错误重试
    • Portal通过域名访问Meta Server获取Admin Service服务列表(IP+Port),而后直接通过IP+Port访问服务,同时在Portal侧会做load balance、错误重试
  • 为了简化部署,实际上会把Config Service、Eureka和Meta Server三个逻辑角色部署在同一个JVM进程中

服务端设计:
中间件使用:apollo
Admin service发布了配置修改的事件,所有config service收到消息并通知客户端修改配置。
有两个值得去探索的点:

  • Admin service发布事件的方式:可以用中间件redis,activemq实现。这里为了减少外部组件的依赖,通过数据库实现。

中间件使用:apollo
具体的做法是Admin发布一条配置后,这个配置肯定属于某个namespace,在ReleaseMessage表插入一条记录AppId+Cluster+Namespace,config service有一个线程每秒扫描ReleaseMessage表,如果有新的消息记录,就通知客户端更新配置。所以配置如果有更新,一般一秒内就可通知到客户端。

  • Config service通知客户端的方式:客户端发起获取配置的请求,config service用defferResult将请求挂起,如果60秒内没有感兴趣的namespace配置发生变化,返回304,否则立即返回变化后的配置。使用defferResult可以提高请求的并发量

客户端设计:
中间件使用:apollo

  • 客户端和服务端保持了一个长连接,从而能第一时间获得配置更新的推送。(通过Http Long Polling实现)
  • 客户端还会定时从Apollo配置中心服务端拉取应用的最新配置。

    • 这是一个fallback机制,为了防止推送机制失效导致配置不更新
    • 客户端定时拉取会上报本地版本,所以一般情况下,对于定时拉取的操作,服务端都会返回304 - Not Modified
    • 定时频率默认为每5分钟拉取一次,客户端也可以通过在运行时指定System Property: apollo.refreshInterval来覆盖,单位为分钟。
  • 客户端从Apollo配置中心服务端获取到应用的最新配置后,会保存在内存中
  • 客户端会把从服务端获取到的配置在本地文件系统缓存一份

    • 在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置
  • 应用程序可以从Apollo客户端获取最新的配置、订阅配置更新通知
  • 测试环境下多环境部署SIT,QA,UAT,用一套画面管理不同的环境:

中间件使用:apollo

与spring的集成原理
Spring的ApplicationContext会包含一个Environment,在服务启动的时候把参数注入即可。

点赞
收藏
评论区
推荐文章
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Easter79 Easter79
3年前
springcloud gateway高级功能之集成apollo后动态刷新路由
springcloud集成apollo后动态刷新路由配置,官网给的demo如下importcom.ctrip.framework.apollo.enums.PropertyChangeType;importcom.ctrip.framework.apollo.model.ConfigChange;importcom.ct
Stella981 Stella981
3年前
Spring Cloud套件
SpringCloud提供的服务  配置管理服务注册服务发现断路器负载均衡智能路由服务间调用一次性令牌微代理思维导图模板全局锁控制总线分布式式会话集群状态领导选举分布式消息  子项目功能说明SpringCloudConfig配置中心,利用git来集
Easter79 Easter79
3年前
SpringCloud微服务(06):Config组件,实现配置统一管理
一、Config简介在微服务系统中,服务较多,相同的配置:如数据库信息、缓存、参数等,会出现在不同的服务上,如果一个配置发生变化,需要修改很多的服务配置。springcloud提供配置中心,来解决这个场景问题。系统中的通用配置存储在相同的地址:GitHub,Gitee,本地配置服务等,然后配置中心读取配置以restful发布
Stella981 Stella981
3年前
Hadoop 2.6.0 HA高可用集群配置详解(二)
Zookeeper集群安装Zookeeper是一个开源分布式协调服务,其独特的LeaderFollower集群结构,很好的解决了分布式单点问题。目前主要用于诸如:统一命名服务、配置管理、锁服务、集群管理等场景。大数据应用中主要使用Zookeeper的集群管理功能。本集群使用zookeeper3.4.5cdh5.7.1版本。首先在Hado
Stella981 Stella981
3年前
Hadoop之Shell脚本自动启动
在用Hadoop进行大数据分析处理时,通常配置的服务器不止一两台。为了减少人工操作的重复性,所以hadoop提供了可以自动启动Hadoop集群的Shell脚本。在使用Shell脚本启动集群之前,需要进行相应的配置。说明:$HADOOP\_HOME/root/project/hadoop(根据自己配置的路径不同而不同)打开$HADOOP\_H
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
Disconf 分布式配置管理平台(安装配置)
Disconf分布式配置管理平台(安装配置)依赖环境Nginx:处理静态资源请求、动态请求转发到TomcatTomcat:处理Nginx的请求Redis:用户session管理MySQL:应用管理、用户管理、角色管理、环境管理、配置持久化Zookeeper:管理Disconf配置信息
Easter79 Easter79
3年前
SpringCloud 进阶之分布式配置中心(SpringCloud Config)
1\.SpringCloudConfigSpringCLoudConfig为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置;SpringCloudConfig分为服务端和客户端:服务端也称为分布式配置中心,它是一个独立的微服务应用,
Java服务总在半夜挂,背后的真相竟然是... | 京东云技术团队
最近有用户反馈测试环境Java服务总在凌晨00:00左右挂掉,用户反馈Java服务没有定时任务,也没有流量突增的情况,Jvm配置也合理,莫名其妙就挂了
Spring配置文件的魔法炼金术:如何制造容器化时代的完美配方 | 京东物流技术团队
基于现代服务的云原生十二要素理论,我们在采用容器化部署时,要保证同一个镜像可以满足不同环境的部署要求,而不是不同环境打包不同的镜像。本文档主要介绍一种基于spring框架的满足不同环境配置的编译打包方案,满足同一个镜像可以在环境分组下通过启动项配置实现不同环境的部署。