六年java老鸟细聊分布式配置中心,满满的干货指导

本文详细探讨了Java应用如何使用Apollo作为分布式配置中心,包括客户端的主动拉取和长轮询机制,以及服务端处理配置更新的策略。通过主动拉取和长轮询相结合,确保配置变更的实时性。同时提到了@Value属性更新时监听器onChange()的执行。文章还提及了一线开发大牛整理的Java高并发编程文档资源。
摘要由CSDN通过智能技术生成

前言

系统开发过程中往往伴随着各种各样的配置,系统配置一旦设置就不再变更,业务配置随着业务发展变化需要经常变更。经常变更的配置如果写死在配置文件中,一来无法及时响应业务需求;二来会让系统失去灵活性,每次修改配置都需要重新发布应用。

基于存在的痛点问题,急需一种快速、方便修改配置的解决方案:apollo

对于apollo我们同样也存在着一些疑惑:

  • 应用程序通过什么方式来获取配置信息?
  • 配置信息发生变更后,应用程序又是如何及时进行更新的?

为了解决上面的疑惑,先从客户端看起

 

客户端

1. 主动拉取配置

应用程序客户端要想获取配置信息,可以采用主动方式去拉取

1.1 基于命名空间创建远程配置仓库

public RemoteConfigRepository(String namespace) {
    gson = new Gson();
    // 1.主动同步配置(客户端应用启动的时候执行)
    this.trySync();
    // 2.固定周期主动拉取配置(5分钟一次)
    this.schedulePeriodicRefresh();
    // 3.开启长轮询,询问服务器端是否有最新的配置,如果有最新的配置,客户端会主动去拉取最新配置;否则等待一段时间后继续询问
    this.scheduleLongPollingRefresh();
}

1.2 查询Config Service服务地址

private String assembleMetaServiceUrl() {
    // 1.获取metaServer地址(配置文件中指定)
    String domainName = m_configUtil.getMetaServerDomainName();
    // 2.应用唯一id
    String appId = m_configUtil.getAppId();
    // 3.本地ip
    String localIp = m_configUtil.getLocalIp();

    Map<String, String> queryParams = Maps.newHashMap();
    queryParams.put("appId", queryParamEscaper.escape(appId));
    if (!Strings.isNullOrEmpty(localIp)) {
        queryParams.put("ip", queryParamEscaper.escape(localIp));
    }
    // 4.请求地址
    return domainName + "/services/config?" + MAP_JOINER.join(queryParams);
}

由于meta serverconfig service部署在一起,那么通过meta server的地址 + /services/config路径就可以获取config service服务对应配置列表信息【config service可部署多台,会注册到eureka中,mata server又包装了eureka】

HttpResponse<List<ServiceDTO>> response = m_httpUtil.doGet(request, m_responseType);

得到服务配置列表后,以随机的方式主动拉取配置信息

private ApolloConfig loadApolloConfig() {
    // 1.config service服务配置列表
    List<ServiceDTO> configServices = getConfigServices();
    String url = null;
    retryLoopLabel:
    for (int i = 0; i < maxRetries; i++) {
        List<ServiceDTO> randomConfigServices = Lists.newLinkedList(configServices);
        // 2.对服务配置列表进行洗牌
        Collections.shuffle(randomConfigServices);
        //Access the server which notifies the client first
  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值