前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从spring boot 启动过程看apollo的初始化过程( 二)

从spring boot 启动过程看apollo的初始化过程( 二)

作者头像
MickyInvQ
发布2020-09-27 10:22:45
1.2K0
发布2020-09-27 10:22:45
举报
文章被收录于专栏:InvQ的专栏

之前一篇文章《从apollo的初始化看spring boot 1.5.3启动过程( 一)》 说到而apollo的初始化逻辑便放在这里面,本文就继续从此展开

在这里插入图片描述
在这里插入图片描述

Spring从3.1版本开始增加了ConfigurableEnvironmentPropertySource

  • ConfigurableEnvironment Spring的ApplicationContext会包含一个Environment(实现ConfigurableEnvironment接口)
  • ConfigurableEnvironment自身包含了很多个PropertySource
  • PropertySource 属性源, 可以理解为很多个Key - Value的属性配置

ConfigurableEnvironment正是被传入postProcessEnvironment方法中去执行自己想要初始化的属性源。

在这里插入图片描述
在这里插入图片描述

在运行时的结构形如:

在这里插入图片描述
在这里插入图片描述

需要注意的是,PropertySource之间是有优先级顺序的,如果有一个Key在多个property source中都存在,那么在前面的property source优先。 所以对上图的例子:

  • env.getProperty(“key1”) -> value1
  • env.getProperty(“key2”) -> value2
  • env.getProperty(“key3”) -> value4

所以,在应用启动阶段,Apollo从远端获取配置,然后组装成PropertySource并插入到第一个即可,如下图所示:

在这里插入图片描述
在这里插入图片描述

代码可参考

在这里插入图片描述
在这里插入图片描述

在配置中心中,一个重要的功能就是配置发布后实时推送到客户端。下面我们简要看一下这块是怎么设计实现的。

上图简要描述了配置发布的大致过程:

1、用户在Portal操作配置发布 2、Portal调用Admin Service的接口操作发布 3、Admin Service发布配置后,发送ReleaseMessage(此处的消息中间件为数据库)给各个Config Service

在这里插入图片描述
在这里插入图片描述

4、Config Service收到ReleaseMessage后,通知对应的客户端

在这里插入图片描述
在这里插入图片描述

而我们的应用程序是从apollo 的客户端client中去获取通知

在这里插入图片描述
在这里插入图片描述
上面说的从远端获取配置,那么如何从远端获取呢?

根据

在这里插入图片描述
在这里插入图片描述

我们知道client是从SLB中发现metaServer,进而读取Config Service的 配置信息, 即和域名系统配合,协助Client访问MetaServer获取ConfigService地址列表。 在 com/ctrip/framework/apollo/internals/ConfigServiceLocator.java 中,类初始化后,

#1、执行initialize这个方法

在这里插入图片描述
在这里插入图片描述
2、获取MetaService地址
在这里插入图片描述
在这里插入图片描述
3、获取环境信息
在这里插入图片描述
在这里插入图片描述

比如我的是windows环境,然后配置的本地的DEV开发环境

在这里插入图片描述
在这里插入图片描述
4、获取域名信息
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这个domain是一个可以从一个自定义的apollo-env.properties文件获取并put相关配置后的Static Map

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这里获取到的只是MetaService的地址,即通过包装服务后的eureka的地址,还要通过此地址,来发现configService的无状态集群式部署的机器ip:port信息。 Meta Server从Eureka获取metaService,Config Service和Admin Service的服务信息,相当于是一个Eureka Client。增设一个Meta Server的角色主要是为了封装服务发现的细节,对Portal和Client而言,永远通过一个Http接口获取Admin Service和Config Service的服务信息,而不需要关心背后实际的服务注册和发现组件。 Meta Server只是一个逻辑角色,在部署时和Config Service是在一个JVM进程中的,所以IP、端口和Config Service一致。由于和Config Service部署在一个JVM中,所以相应的metaService也是都是多实例、无状态部署,保证了服务的高可用性。 如何发现呢? 通过euerka发现,目前已经将

在这里插入图片描述
在这里插入图片描述

这两个服务注册成功。

在这里插入图片描述
在这里插入图片描述
5、获取ConfigService的配置信息

此时,就需要MetaService提供的接口,来获取ConfigService的地址。 可通过http api 接口访问获取只要在注册中心地址后拼接上我们的应用appid以及主机IP(其实可以不用拼接appid和主机ip,直接获取configservice的地址)

在这里插入图片描述
在这里插入图片描述

通过界面访问也是一样的结果

在这里插入图片描述
在这里插入图片描述

所以,这个DTO也是携程内部定义的

在这里插入图片描述
在这里插入图片描述

所有的配置信息,则从上面的那个instanceId 的value所指向的地址请求获取

然后通过portal即可访问到admin-service

简而言之,就是通过两条线路来访问数据,保证了服务上线后,我们可通过portal热更新数据,来改变应用读到的配置信息。

参考

https://github.com/ctripcorp/apollo/wiki/Apollo%E9%85%8D%E7%BD%AE%E4%B8%AD%E5%BF%83%E8%AE%BE%E8%AE%A1#133-meta-server https://mp.weixin.qq.com/s/-hUaQPzfsl9Lm3IqQW3VDQ

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/10/19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 上面说的从远端获取配置,那么如何从远端获取呢?
  • #1、执行initialize这个方法
    • 2、获取MetaService地址
      • 3、获取环境信息
        • 4、获取域名信息
          • 5、获取ConfigService的配置信息
          相关产品与服务
          消息队列 TDMQ
          消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档