Skip to content

🚀 第5章 分布式配置管理——基于Nacos

分布式配置管理是分布式微服务架构中重要的基础功能。本章将结合 Nacos 来分析分布式配置管理的核心技术,以及关键原理。

🚀 5.1 认识分布式配置管理

分布式配置管理的本质: 将分散的配置信息,通过公共组件集中起来管理

🚀 5.1.1 什么是分布式配置管理

Nacos 控制台向开发者提供了管理配置信息的功能,可以将配置管理功能与应用的运行环境解耦。

如图 5-1 所示,有应用 A 和应用 B,它们分别读取本地的配置信息 A 和配置信息 B。如果将两个应用接入配置中心,则应用A和应用B就要通过远程调用从配置中心读取配置信息A和配置信息B。

应用和配置中心间的数据同步通常有如下3种模式:

  • Pull 模式:让应用开启长轮询,即定时地从配置中心拉取最新的配置信息,并更新到应用的内存中。
  • Push 模式:在配置中心配置数据变更之后,主动推送配置数据到指定的应用,应用更新到本地内存中。
  • 混合模式:应用和配置中心通过“事件机制 + 监听器”模式保持长连接。如果应用监听的配置信息发生了变化,则配置中心发布对应类型的事件。应用只有在监听到该事件之后,才会处理对应的配置信息,并更新到应用本地。

通常将变更不是很频繁的应用初始化配置信息(比如数据库连接属性)放到配置中心中。应用在启动时,从配置中心加载属性,完成应用基础环境的初始化。

应用接入配置中心,会增加一次网络开销。配置中心采用“本地缓存 + 事件监听”模式,可以减少应用和配置中心间的网络开销。

配置中心通常会提供配置变更、配置推送、历史版本管理、灰度发布等功能。通过这些功能可以降低分布式系统中管理配置信息的成本,降低因错误的配置信息变更带来的服务可用性下降和发生故障的风险

🚀 5.1.2 为什么需要分布式配置管理

作为一名开发人员,对配置文件应该都不陌生。在 Spring Boot 项目中,默认提供了一个application.properties 或者 application.yaml 文件。

可以把一些全局性的配置或者需要动态维护的配置(比如数据库连接、功能开关、降级、服务器地址等)写入该文件。

为了解决不同环境下服务连接配置信息的差异性,Spring Boot 还提供了基spring.profiles.active={profile}的机制来实现不同的环境切换。

单体架构向微服务架构演进已经是软件开发的必经之路。在服务被拆分之后,各个应用需要单独地维护本地配置文件,成本非常高。主要缺点如下:

  • 不支持配置文件的动态更新:在实际的业务开发过程中,需要动态地更新配置文件,比如切换业务功能开关、变更图片服务器地址、变更数据库连接信息等。在传统配置模式下需要修改本地配置文件并重新打包,然后重启应用并发布,这样才能保证配置文件能够生效。但这样会导致该服务在重启阶段不可用,从而影响服务整体的可用率。
  • 不支持配置集中式管理:在微服务架构中,为了保证某些核心服务的高性能会部署几百个节点。如果在每个节点上都维护一个本地配置文件,则不管是对运维人员或者开发人员而言,成本都是巨大的。
  • 不支持配置内容的安全性和权限校验:如果将配置文件随着源代码统一提交到代码库中,则配置文件内容会变得不可控。如果黑客主动攻击服务器并获取了源代码,即可直接拿到所有的配置信息。
  • 不支持多环境部署:如果通过底层框架来维护不同环境的信息,则成本也是非常高的。

分布式配置管理就是弥补上述不足的方法。简单来说,其做法是:把各个服务的某些配置信息统一交给第三方中间件来维护;分布式配置管理上的数据变更,需要实时地推送到相对应的应用服务节点上。

🚀 5.2 了解主流的配置中心

主流的配置中心有以下四种,其中,Nacos 是 Alibaba 开源的分布式配置中心。本书将以Nacos 来进行详细讲解。

🚀 5.2.1 Nacos

Nacos 的分布式配置非常简单和高效,并且部署简单,可以和注册中心共一个集群。

🚀 1.Nacos 配置管理的维度

Nacos 支持以下维度的配置管理:

  • 应用: 这个比较好理解,每个配置文件中的配置信息都归属于某一个应用。
  • Group(组): 如果服务配置了该项,则配置信息通过 Group(组)来隔离,该组中的所有应用都可以读取该配置信息,非本组的其他应用不能读取该配置信息。
  • Namespace(命令空间): 如果服务配置了该项,则配置信息通过 Namespace(命令空间)来隔离,该命名空间中的所有应用都可以读取该配置信息,非本命令空间的其他应用不能读取该配置信息。

🚀 2.Nacos 配置管理的功能

Nacos 配置管理主要包括以下功能:

  • 配置管理列表: 开发人员可以在 Nacos 控制台上,实时地看到所有接入Nacos的应用的配置信息。
  • 新建、编辑和删除配置文件: 开发人员可以在 Nacos 控制台上操作指定的配置文件在不同命名空间之间复制指定的配置文件:如果开发环境和测试环境共用一个 Nacos 集群,则开发人员可以使用配置文件的复制功能,在不同命名空间之间复制指定的配置文件,完成配置文件的跨环境的数据迁移。
  • 批量导出和导入配置文件: 如果需要将测试环境的配置信息复制到预发布环境,但是测试环境和预发布环境不在一个集群,则开发人员可以使用批量导出和导入功能,完成配置文件的跨集群的数据迁移。
  • 灰度环境的配置信息发布: 开发人员可以将新增的配置信息发布到指定的客户端(用IP 地址来区分),其余客户端配置保持不变。这样就可以用部分客户端验证新添加的配置信息对应的新的功能,以保证配置信息的平稳发布。灰度配置是生产环境中一个比较重要的功能,它能够确保生产环境运行的稳定。
  • 支持多种配置文件格式: 目前支持TEXT、JSON、XML、YAML、HTML和 Properties格式。开发人员可以灵活地使用不同的文件格式将应用接入Nacos 配置中心。

🚀 3.Nacos 配置管理支持 Open API

开发人员可以使用 Nacos 开放的 Open AP| 跨平台地管理配置文件。如果要将 Go 语言或者 Node.js 的应用接入 Nacos 配置中心,则可以通过 Open AP| 完成对应用配置文件的管理。

4.Nacos 配置管理的优势

Nacos 配置管理的主要优势如下:

(1)接入轻量级:开发者可以“开箱即用”地使用 Nacos 提供的 Starter 组件,几乎零技术成本地将应用接入 Nacos 配置中心。

(2)线上维护成本低:Nacos 本身就具备集群管理的能力,配置中心和注册中心可以共用一个集群,节省线上机器资源的成本。

(3)跨平台性:Nacos 通过 Open API 开放了它的配置管理功能,不同语言的客户端可以通过Open API 接入 Nacos 配置中心。

(4)云原生:支持用 Docker和 K8s 进行部署。

(5)开源社区活跃性高:目前 Nacos 开源社区的代码贡献者非常多,版本迭代速度非常快且 Nacos 的推广力度非常大。Nacos 线上和线下的技术分享活动非常多,能够解决开发者反馈的大部分技术问题。

Nacos 目前最新的版本 2.0.0,处于公测阶段。该版本最大的改动是:用gRPC框架替换了 HTTP 协议,提升了Nacos 集群之间,以及集群与客户端之间的通信性能。

🚀 5.2.2 Spring Cloud Config

Spring Cloud Config 是 Spring Cloud 项目开源出来的分布式配置框架,最近一次版本更新的时间是 2021年1月9日,最新的版本为 3.0.1。

Spring Cloud Config 就是我们通常意义上的配置中心--把应用原本放在本地文件中的配置信息抽取出来放在中心服务器中,从而能够提供统一的配置管理和发布。

1.主要功能

Spring Cloud Config 提供以下3个维度的配置管理。

  • 应用:这个比较好理解,每个配置文件中的配置信息都归属于某一个应用。
  • 环境:每个配置信息都是归属于某一个环境,如开发环境、测试环境和生产环境等。
  • 版本:这是一般配置中心所缺少的,即对同一份配置的不同版本进行管理,比如可以通过Git 进行版本控制。Spring Cloud Config 提供了版本支持,即对于一个应用的不同部署实例,可以从服务器获取不同版本的配置。这对于一些特殊场景(如灰度发布、AB 测试等)非常有用。

2.主要优势

Spring Cloud Config 的主要优势如下:

基于应用、环境、版本这3个维度进行管理:支持3个维度的配置信息的版本管理

配置信息可以持久化方式支持 Git:后端基于 Git 存储,一方面程序员非常熟悉,另一方面在部署上会非常简单。借助于 Git,能够非常友好地支持不同配置版本(Git 本身就是一个版本管理工具)。当然,Spring Cloud Config 还支持其他的存储模式,比如本地文件、SVN 等。

可以无缝地集成 Spring Cloud:因为 Spring Cloud 无缝地支持 Spring Framework 框架的 Environment 接口和 PropertySource 接口,所以它对于已有的 Spring Framwork 应用的迁移成本非常低,并且应用获取配置信息的方式完全一致。

🚀 5.2.3 Apollo

Apollo(简称阿波罗)的最新版本为 1.7.1,最近的更新时间是2020年8月20日。

Apollo 是携程框架部门研发的分布式配置中心框架,能够集中管理应用的不同环境、不同集群的配置信息。在配置信息被修改后,Apollo 能够将修改的内容实时地推送到应用端,并且具备规范的权限管理、数据推送流程治理等特性。

🚀 5.2.4 对比Nacos、Spring Cloud Config、Apollo和Disconf

🚀 5.3 将应用接入Nacos配置中心

要将应用接入 Nacos 配置中心,就需要采用 Nacos 提供的接入方式。

5.3.1 接入方式

设计一个好配置中心,需要考虑接入方式的友好性。主流的配置中心通常包含以下接入方式:

  • 原生的 SDK:提供统一的、稳定的、可维护的 Jar包。
  • Open API:提供符合 RESTfuI API规范的 HTTP 接口。
  • RPC:提供高性能的RPC接口,通过远程通信和事件机制来完成配置信息的交换。
  • 第三方中间件:提供了更加稳定和高效的接入体验,并屏蔽了中间件底层的技术细节。

5.3.2 认识Nacos配置中心的配置信息模型

Nacos 配置中心的配置信息模型非常简单,具体见表5-2.

表5-2 Nacos Confg 的配置信息模型

字段名称语义描述
datald一条配置信息的唯一的名称,比如order-server.yaml
groupid配置信息所在组的ID,比如 ORDER-SERVER
appName配置信息对应的应用名称,通常和应用对应的名称保持一致,比如example2-distributed-server
tenantld租户的ID,主要用于隔离对应租户的配置信息
content配置内容,存储配置信息对应的数据
type配置信惠对应的文件格式,包括:TEXT、JSON、XML、YAML、HTML和Properties
beatIP发布灰度配置的灰度IP 地址(客户端 IP 地址)
tagID配置标签的 ID
namespaceNacos 对应的命名空间

在 Nacos Config 中,tenantld 实际存储的是namespace(命名空间)的值。

5.3.3 了解NacosConfigService类

NacosConfigService 类是 Nacos 配置中心的核心 API,它提供了表 5-3 中列出的方法。

表5-3 NacosConfigService 类的方法

方法名称方法功能描述
getConfig()获取指定 datald 和 group 的配置信息
publishConfig()发布指定 datald 和 group 的配置信息
removeConfig()删除指定 datald 和 group 的配置信息
getConfigAndSignListener()获取指定 datald 和 group 的配置信息,并且注册对应配置信息的监听器
addListener()添加指定配置信息的监听器
removeListener()删除指定配置信息的监听器

NacosConfigService 类的作用是:用开发人员在应用本地配置的 Nacos 集群的环境信息初始化用于连接 Nacos 集群的 HTTP 代理。

在 Nacos 中,HTTP 代理的具体实现是 ServerHttpAgent类。ServerHttpAgent 类只是一个代理,其代理的对象是NacosRestTemplate 类。NacosRestTemplate 类是 Nacos 自研的 HTTP框架,具体的原理会在 5.4 节介绍。

🚀 5.3.4 【实例】用Nacos Client接入应用

项目代码:Demo4Book/sca/chapterfive/use-nacos-client-nacos-config

Nacos Client是 Nacos 暴露给开发者的原生 SDK。依赖 SDK,开发者可以用NacosConfigService 类来调用 Nacos 配置中心。

1.新建一个项目

(1)用IDEA快速创建一个 Spring Boot 项目,并添加启动项目的 Starter,具体代码如下所示:

xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-actuator</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
</dependency>

(2)用注解@SpringBootApplication 快速启动项目

2.引入 Nacos Client 依赖包

将 Nacos Client引入项目中,代码如下:

xml
<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-client</artifactId>
    <version>1.3.1</version>
</dependency>

3.用 NacosConfigService 从配置中心获取配置信息

下面使用注解 @Configuration 和 @Bean 初始化 NacosConfigService 对象,具体代码如下:

文件:Demo4Book/sca/chapterfive/use-nacos-client-nacos-config/src/main/java/com/alibaba/cloud/youxia/config/NacosConfig.java

java
package com.alibaba.cloud.youxia.config;

import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.PropertyKeyConst;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.exception.NacosException;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Properties;

@Configuration
public class NacosConfig {

    @Bean
    public ConfigService configService() throws NacosException {
        final Properties properties = new Properties();
        //设置Nacos节点,对应的IP地址。
        properties.setProperty(PropertyKeyConst.SERVER_ADDR,"127.0.0.1:8848");
        //设置命名空间。
        properties.setProperty(PropertyKeyConst.NAMESPACE,"c7ba173f-29e5-4c58-ae78-b102be11c4f9");
        //如果开启Nacos权限校验,设置用户名。
        properties.setProperty(PropertyKeyConst.USERNAME,"nacos");
        //如果开启Nacos权限校验,设置用户密码。
        properties.setProperty(PropertyKeyConst.PASSWORD,"QinshanTop12#$");
        //设置获取配置信息的长轮训超时时间。
        properties.setProperty(PropertyKeyConst.CONFIG_LONG_POLL_TIMEOUT,"3000");
        //设置获取配置信息失败之后,重试的次数。
        properties.setProperty(PropertyKeyConst.CONFIG_RETRY_TIME,"5");
        //设置是否开启客户端主动拉取最新的配置信息。
        properties.setProperty(PropertyKeyConst.ENABLE_REMOTE_SYNC_CONFIG,"true");
        //设置最大重试次数。
        properties.setProperty(PropertyKeyConst.MAX_RETRY,"5");
        //构造一个ConfigService实例
        ConfigService configService = NacosFactory.createConfigService(properties);
        return configService;
    }
}

下面通过 NacosConfigManager 类,模拟业务调用方调用 NacosConfigService 类的getConfig()方法获取配置信息:

文件:Demo4Book/sca/chapterfive/use-nacos-client-nacos-config/src/main/java/com/alibaba/cloud/youxia/manager/NacosConfigManager.java

java
package com.alibaba.cloud.youxia.manager;

import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.exception.NacosException;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;

@Component
public class NacosConfigManager {
    @Resource
    private ConfigService configService;

    @PostConstruct
    private void init() throws NacosException {
        String data=configService.getConfig("use-nacos-client-nacos-config","use-nacos-client-nacos-config",2000);
        System.out.println("通过Nacos Client 从Nacos配置中心获取配置信息为:"+data);
    }
}

在 Nacos 控制台中,添加 datald为“use-nacos-client-nacos-config”,group 为use-nacos-client-nacos-config”的配置文件。

运行服务后可以看到,datald为“use-nacos-client-nacos-config”,group 为use-nacos-client-nacos-config”的配置信息,可以将属性"spring.youxia.config.name"加载到当前应用中。

🚀 5.3.5 【实例】用Open API接入应用

项目代码:Demo4Book/sca/chapterfive/openapi-nacos-config

本实例使用 Nacos 的 Open AP| 将应用接入 Nacos 配置中心。

1.新建一个项目

用 IDEA 新建一个项目,并添加相关的 Starter,具体代码如下:

xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-actuator</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
</dependency>

在上面的代码中,使用 Spring Framework 的 RestTemplate 类访问 Nacos Config 的 Open APl。RestTemplate 是一个基础的 HTTP 客户端。

2.初始化 RestTemplate

通过注解@Configuration 和@Bean 初始化 RestTemplate,具体代码如下:

文件:Demo4Book/sca/chapterfive/openapi-nacos-config/src/main/java/com/alibaba/cloud/youxia/OpenApiConfig.java

java
package com.alibaba.cloud.youxia;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

@Configuration
public class OpenApiConfig {
    @Bean
    public RestTemplate restTemplate() {
        SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
        requestFactory.setConnectTimeout(2000);
        requestFactory.setReadTimeout(2000);
        RestTemplate restTemplate = new RestTemplate(requestFactory);
        return restTemplate;
    }
}

3.通过 RestTemplate 读取配置信息

通过注解@Component和@PostConstruct,实现在应用启动的过程中调用 Open API 并读取配置信息,具体代码如下:

文件:Demo4Book/sca/chapterfive/openapi-nacos-config/src/main/java/com/alibaba/cloud/youxia/ReaderConfigManager.java

java
package com.alibaba.cloud.youxia;

import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;

@Component
public class ReaderConfigManager {
    @Resource
    private RestTemplate restTemplate;

    //使用RestTemplate访问Nacos Config的Open API
    @PostConstruct
    public void readConfig(){
        String url="http://127.0.0.1:8848/nacos/v1/cs/configs?dataId={dataId}&group={group}&tenant={tenant}";
        Map<String,String> params=new HashMap<String,String>(16);
        params.put("dataId", "openapi-nacos-config");
        params.put("group", "openapi-nacos-config");
        params.put("tenant","c7ba173f-29e5-4c58-ae78-b102be11c4f9");
        //入参
        ResponseEntity<String> responseEntity=restTemplate.getForEntity(url,String.class,params);
        String result=responseEntity.getBody();
        System.out.println("通过Open API 从Nacos配置中心获取配置信息为:"+result);
    }
}

在Nacos控制台中,添加datald 为“openapi-nacos-config”的配置文件。

运行服务后可以看到,datald为“openapi-nacos-config”,group为“openapi-nacos-config”的配置信息,可以将属性“spring.youxia.config.name”加载到当前应用中。

🚀 5.3.6 【实例】用Spring Cloud Alibaba Config接入应用

项目代码:Demo4Book/sca/chapterfive/spring-cloud-alibaba-config

Spring Cloud Alibaba 在 Nacos Client 的基础上,重新封装了一个“开箱即用”的基础组件 spring-cloud-starter-alibaba-nacos-config (简称 Spring Cloud Alibaba Config)。本实例使用 Spring Cloud Alibaba Config 接入应用。

1.新建一个 Spring Cloud Alibaba 项目 用 IDEA 新建一个 Spring Boot 项目,并添加 Spring Cloud Alibaba Config 对应的 Jar 包依赖,具体代码如下:

xml
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

2.新增配置文件 bootstrap.yaml 和 application.properties,bootstrap.yaml 的具体代码如下所示:

文件:Demo4Book/sca/chapterfive/spring-cloud-alibaba-config/src/main/resources/bootstrap.yaml

yaml
spring:
  application:
    name: spring-cloud-alibaba-config
  cloud:
    nacos:
      config:
        namespace: c7ba173f-29e5-4c58-ae78-b102be11c4f9
        group: spring-cloud-alibaba-config
        password: QinshanTop12#$
        enable-remote-sync-config: true
        server-addr: 127.0.0.1:8848
        username: nacos
        name: spring-cloud-alibaba-config
        file-extension: properties
        extension-configs:
          - data-id: spring-cloud-alibaba-config-test.yaml
            group: spring-cloud-alibaba-config
            namespace: c7ba173f-29e5-4c58-ae78-b102be11c4f9
            refresh: true
server:
  port: 8889

文件:Demo4Book/sca/chapterfive/spring-cloud-alibaba-config/src/main/resources/application.properties

ini
spring.youxia.config.name=test2
spring.application.name=spring-cloud-alibaba-config

3.解析配置信息

文件:Demo4Book/sca/chapterfive/spring-cloud-alibaba-config/src/main/java/com/alibaba/cloud/youxia/config/NacosConfig.java

java
package com.alibaba.cloud.youxia.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Configuration;

@Configuration
@RefreshScope
@ConfigurationProperties(prefix = "spring.youxia.config")
public class NacosConfig {
    private String name;
    private String value;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }
}

首先,在 application.properties 中新增属性键值对“spring.youxia.config.name=test2”。然后为了展示属性动态更新的效果,在配置中心中新增一个 DataID 为 spring-cloud-alibaba-config.properties 的文件,配置内容如图 5-6 所示(其中配置了“spring.youxia.config.name=test20”)。

文件:Demo4Book/sca/chapterfive/spring-cloud-alibaba-config/src/main/java/com/alibaba/cloud/youxia/ConfigReader.java

java
package com.alibaba.cloud.youxia;

import com.alibaba.cloud.youxia.config.NacosConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.concurrent.Executors;

@Configuration
@RefreshScope
public class ConfigReader {
    @Autowired
    private NacosConfig nacosConfig;

    @PostConstruct
    public void init() {
        Executors.newCachedThreadPool().execute(new ConfigThread());
    }

    class ConfigThread implements Runnable {
        @Override
        public void run() {
            while (true) {
                System.out.println("使用Spring Cloud Alibaba接入Nacos配置中心,获取配置信息name为:" + nacosConfig.getName());
                System.out.println("使用Spring Cloud Alibaba接入Nacos配置中心,获取配置信息value为:"+nacosConfig.getValue());
                try {
                    Thread.sleep(6000);
                } catch (InterruptedException e) {
                    System.out.println(e.getMessage());
                }
            }
        }
    }
}

5.4 用HTTP协议和gRPC框架实现通信渠道

Nacos 在 2.0 版本及之后,底层通信渠道使用 gRPC 框架替换了原先的 HTTP 协议

5.4.1 什么是gRPC

HTTP 是基于 TCP/IP 协议的应用层协议。它经历过几个大的版本迭代:HTTP 1.0、HTTP 1.1、HTTP 2及 HTTP 3。

开发人员使用 HTTP 协议,都会吐槽它的性能损耗。在应用层,业务接口之间的请求通常对性能的容忍度比较高,使用 HTTP 协议能够应对大部分的业务场景。但是,分布式配置管理是底层的基础服务,所以需要通信渠道具备高性能、高可用和高并发的质量属性。

gRPC 是一个高性能、开源和通用的 RPC 框架。它使用 Protocol Buffer(简称 Protobuf)作为序列化格式。

Protocol Buffer 是来自 Google 的序列化协议,比序列化协议Jackson 更加轻便和高效。

另外,Protocol Bufer基于 HTTP2标准设计,具有双向流、流量控制、头部压缩、单TCP 连接上的多复用请求等特性。这些特性使得其在移动设备上表现更好、更省电和节省空间占用。

总体来说,gRPC 是一款高性能的RPC框架,支持长连接,可扩展性非常好。

5.4.2 “用HTTP实现Nacos Config通信渠道”的原理

5.4.3 “用‘长轮询 + 注册监听器’机制将变更之后的配置信息同步到应用”的原理

5.4.4 “用gRPC框架实现客户端与Nacos Config Server之间通信渠道”的原理

🚀 5.4.5 【实例】用“采用gRPC通信渠道的Nacos Config”实现配置数据的动态更新

5.5 用“Sofa-Jraft + Apache Derby”保证配置中心的数据一致性

5.5.1 Nacos配置中心的数据一致性原理

🚀 5.5.2 【实例】用“切换所连接的Nacos节点”验证数据一致性

5.6 用数据库持久化配置中心的数据

5.6.1 为什么需要持久化

5.6.2 持久化的基础配置

5.6.3 持久化的原理

🚀 5.6.4 【实例】用“配置信息的灰度发布”验证持久化

5.7 用“Spring Cloud Alibaba Config + Nacos Config”实现配置管理(公共配置、应用配置和扩展配置)

5.7.1 “按照优先级加载属性”的原理

🚀 5.7.2 【实例】验证公共配置、应用配置和扩展配置的优先级顺序