当前位置:首页 > 科技  > 软件

实战:Nacos配置中心的Pull原理,附源码

来源: 责编: 时间:2023-11-17 17:14:37 194观看
导读大家好,我是哪吒。在单体服务时代,关于配置信息,管理一套配置文件即可。而拆分成微服务之后,每一个系统都会有自己的配置,并且都各不相同,有些配置还需要动态改变,以达到动态降级、切流量、扩缩容等目的。一、本地配置在Spri

MzP28资讯网——每日最新资讯28at.com

大家好,我是哪吒。MzP28资讯网——每日最新资讯28at.com

在单体服务时代,关于配置信息,管理一套配置文件即可。MzP28资讯网——每日最新资讯28at.com

而拆分成微服务之后,每一个系统都会有自己的配置,并且都各不相同,有些配置还需要动态改变,以达到动态降级、切流量、扩缩容等目的。MzP28资讯网——每日最新资讯28at.com

一、本地配置

在Spring Boot开发中,可以把配置项放到config文件中,把配置当代码使用。比如:MzP28资讯网——每日最新资讯28at.com

public class AppConfig {    public static final String static_SUCCESS_CODE = "0000";    public static final String static_ERROR_CODE = "0001";}

也可以通过@Value加载yaml配置文件中的配置。MzP28资讯网——每日最新资讯28at.com

@Componentpublic class HttpConfig {    // 核心线程数    public static String config_CORE_POOL_SIZE;    @Value("${async.corePoolSize}")    public void setSaveUrl(String corePoolSize) {        HttpConfig.config_CORE_POOL_SIZE = corePoolSize;    }}

无论是将配置定义在代码中,还是将配置写在yaml配置文件中,都相当于把配置存在应用程序的本地。MzP28资讯网——每日最新资讯28at.com

如果想修改配置,就需要将在Linux服务器中部署的程序停止,然后手动修改其配置,再进行重启。MzP28资讯网——每日最新资讯28at.com

如果修改的配置项较多,这也是一项容易出错,而且繁琐的事情,长期运维的小伙伴应该深有体会。MzP28资讯网——每日最新资讯28at.com

当时,我就在想,作为世界上使用人数最多的语言,更新一个配置,需要这么复杂吗?MzP28资讯网——每日最新资讯28at.com

答案肯定不是的。MzP28资讯网——每日最新资讯28at.com

二、配置中心

配置中心(Configuration Center)通常用于集中管理应用程序的配置信息。这些配置信息可以包括数据库连接信息、外部服务地址、日志级别、超时设置等。配置中心可以提高应用部署的灵活性和可维护性。MzP28资讯网——每日最新资讯28at.com

程序启动时,可以自动从配置中心拉取所需要的配置项,配置中心中配置有所改变时,同样可以自动从配置中心拉取最新的配置信息,服务不需要重新发布。MzP28资讯网——每日最新资讯28at.com

1、以Nacos为例:

  • 配置中心的信息一般都是放在bootstrap.yml 中。
  • 初始化的时候,Bootstrap Context负责从外部源加载配置属性并解析配置。
  • Bootstrap属性有高优先级,默认情况下,它们不会被本地配置覆盖。
  • 然后再读取application.yml中的配置,进行配置合并,完成项目的启动。

MzP28资讯网——每日最新资讯28at.com

项目的核心配置,需要热更新的配置才有放到nacos管理的必要。基本不会变更的一些配置还是保存在微服务本地比较好。MzP28资讯网——每日最新资讯28at.com

MzP28资讯网——每日最新资讯28at.com

2、Pull模式

Nacos采用的是Pull模式获取服务端数据,客户端采用长轮询的方式定时的发起Pull请求,去检查服务端配置信息是否发生了变化。MzP28资讯网——每日最新资讯28at.com

  • 客户端发起长轮询请求,监听变更的dataId+group。
  • 服务端收到客户端的请求,这时会挂起客户端的请求。
  • 如果在服务端设计的29.5s之内都没有发生变更,触发自动检查机制,此时不管是否有变化,服务端都会返回响应到客户端
  • 如果在29.5s之内配置项发生了变更,则会触发一个事件机制,将变更的数据推送的客户端。

MzP28资讯网——每日最新资讯28at.com

3、也可以通过Nacos实现注册中心

这种是最简单的Nacos注册中心,有若干个服务,都注册到Nacos注册中心,调用之前,先到Nacos获取对应接口,然后进行实际的调用。MzP28资讯网——每日最新资讯28at.com

服务1和服务2和Nacos之间维护一个心跳关系,每5秒跳一次,频率不能太快或者太慢,否者会嗝屁的。MzP28资讯网——每日最新资讯28at.com

  • 如果Nacos在5秒内没有收到心跳,则表示服务挂了,Nacos会下线此服务。
  • 对于超过15秒没有收到客户端心跳的服务实例,会将它的healthy属性置为false,客户端无法调用healthy为false的服务。
  • 如果超过30秒没有收到心跳,Nacos会直接将此服务剔除。

也可以通过服务端主动注销的方式,停止注册。MzP28资讯网——每日最新资讯28at.com

服务1调用服务2时,服务1会通过定时任务到Nacos中获取在线的服务,保证所调用的服务一直都是健康在线的状态。MzP28资讯网——每日最新资讯28at.com

获取到之后,用缓存将其保存起来,然后通过负载均衡器调用服务2,此时,将不再使用服务端的负载均衡Nginx了。MzP28资讯网——每日最新资讯28at.com

MzP28资讯网——每日最新资讯28at.com

三、配置中心提供了哪些功能

  • 配置项管理:支持添加、发布、修改配置项以及配置项的分组,可以实现版本管理,支持热发布、灰度发布、环境隔离,提供API接口与可视化操作页面。
  • 权限控制:配置项访问控制,读权限和写权限。
  • 操作审计:支持记录用户的操作行为。
  • 配置变更:当有新的配置项或是现有的配置项发生变动时,配置中心能够进行实时的监控并做出相应的处理。
  • 配置推送:通过订阅/发布的模式,将配置信息推送给各个服务的消费者。
  • 历史版本管理:保存所有的配置历史版本,并提供查询和对比的功能,可以轻松的回滚到任何一个版本。
  • 灰度发布:通过配置中心可以实现在部分环境中先发布新的配置项,观察一段时间没有问题后再推送给其他所有的环境。
  • 配置变更审计:记录每次配置的修改记录,方便追踪和管理。

这些功能可以帮助降低分布式系统中管理配置信息的成本,降低因错误的配置信息变更带来可用性下降甚至发生故障的风险。MzP28资讯网——每日最新资讯28at.com

四、如何操作配置中心

1、配置注册

配置中心的配置注册通常包括以下步骤:MzP28资讯网——每日最新资讯28at.com

  • 服务提供者在启动时,将自己的配置信息注册到配置中心。这些信息可能包括服务的IP地址、端口号、数据库连接信息等。
  • 配置中心接收并存储这些配置信息。一般来说,配置中心会提供一个统一的接口或者界面,让服务提供者能够方便地进行注册。
  • 服务消费者在需要使用某个服务时,会从配置中心获取相应的配置信息。这样,即使服务提供者的地址等信息发生变化,服务消费者也能通过配置中心获取到最新的配置信息,而无需手动修改。

通过这种方式,配置中心实现了配置的统一管理和动态更新。服务提供者和消费者都可以通过配置中心来进行配置的注册和获取,大大提高了配置的灵活性和便利性。同时,也减少了因为手动配置错误而导致的问题,提高了系统的稳定性和可用性。MzP28资讯网——每日最新资讯28at.com

要通过Java代码实现配置注册到配置中心,你可以遵循以下步骤。这里继续提供一个通用的示例代码,以展示基本的流程和步骤。请注意,实际的代码可能会因所使用的具体配置中心而有所不同。MzP28资讯网——每日最新资讯28at.com

import com.configcenter.sdk.ConfigCenterClient;  import com.configcenter.sdk.exception.ConfigCenterException;  import com.configcenter.sdk.model.Configuration;    public class ConfigurationRegistration {        public static void main(String[] args) {          // 配置中心的服务器URL和认证令牌          String serverUrl = "configcenter_server_url";          String authToken = "your_auth_token";            // 创建配置对象          Configuration configuration = new Configuration();          configuration.setId("your_configuration_id");          configuration.setKey("your_configuration_key");          configuration.setValue("your_configuration_value");          // 可选:设置其他配置项属性,如描述、标签等            try {              // 初始化配置中心的客户端              ConfigCenterClient client = ConfigCenterClient.init(serverUrl, authToken);                // 调用配置中心的注册API              boolean success = client.registerConfiguration(configuration);              if (success) {                  System.out.println("配置注册成功");              } else {                  System.out.println("配置注册失败");              }          } catch (ConfigCenterException e) {              System.out.println("配置注册出现异常: " + e.getMessage());              e.printStackTrace();          }      }  }

在这个示例中:MzP28资讯网——每日最新资讯28at.com

  • 我们首先创建了一个Configuration对象,设置了配置项的ID、键(key)和值(value)。你可以根据需要设置其他属性,如描述、标签等。
  • 然后,我们初始化配置中心的客户端,并调用client.registerConfiguration()方法来执行配置注册操作,传入创建好的Configuration对象。
  • 该方法将返回一个布尔值,表示注册是否成功,我们根据返回结果打印相应的消息。
  • 如果发生异常,我们进行异常处理并打印异常信息。

2、配置反注册

配置中心的配置反注册是指从配置中心中移除或注销某个配置项的过程。当某个服务或应用不再需要使用某个配置项时,可以进行配置反注册操作。这个操作通常通过配置中心提供的接口来完成,它会将指定的配置项从配置中心中删除或标记为注销状态。MzP28资讯网——每日最新资讯28at.com

配置反注册可以是手动触发的,也可以是自动触发的。MzP28资讯网——每日最新资讯28at.com

  • 在手动触发方式下,管理员或开发者可以通过调用配置中心提供的反注册接口,指定需要反注册的配置项。
  • 自动触发方式下,通常会在服务或应用停止时,自动触发配置反注册操作。

配置反注册是配置中心的一个重要功能,它可以帮助管理员或开发者更好地管理配置项的生命周期,确保配置中心中的数据与实际应用需求保持一致。同时,通过反注册不再需要的配置项,也可以减少配置中心的存储空间和资源消耗。MzP28资讯网——每日最新资讯28at.com

要通过Java代码实现配置反注册,你需要使用配置中心提供的Java SDK或API。以下是一个示例代码,展示了如何使用Java来实现配置反注册。MzP28资讯网——每日最新资讯28at.com

import com.configcenter.sdk.ConfigCenterClient;  import com.configcenter.sdk.exception.ConfigCenterException;    public class ConfigurationDeregistration {        public static void main(String[] args) {          // 配置中心的服务器URL和认证令牌          String serverUrl = "configcenter_server_url";          String authToken = "your_auth_token";            // 初始化配置中心的客户端          ConfigCenterClient client = ConfigCenterClient.init(serverUrl, authToken);            // 配置项的ID          String configurationId = "your_configuration_id";            try {              // 调用配置中心的反注册API              boolean success = client.deregisterConfiguration(configurationId);              if (success) {                  System.out.println("配置反注册成功");              } else {                  System.out.println("配置反注册失败");              }          } catch (ConfigCenterException e) {              System.out.println("配置反注册出现异常: " + e.getMessage());              e.printStackTrace();          }      }  }

在这个示例中:MzP28资讯网——每日最新资讯28at.com

  • 我们首先通过ConfigCenterClient.init()初始化配置中心的客户端,传入服务器URL和认证令牌。
  • 然后,我们调用client.deregisterConfiguration()方法来执行配置反注册操作,传入配置项的ID。
  • 该方法将返回一个布尔值,指示反注册是否成功。
  • 根据返回结果,我们打印相应的消息。
  • 如果发生异常,我们捕获并打印异常信息。

3、配置查看

通过配置中心的用户界面和API接口,你可以方便地查看和管理配置项。MzP28资讯网——每日最新资讯28at.com

import com.configcenter.sdk.ConfigCenterClient;  import com.configcenter.sdk.exception.ConfigCenterException;  import com.configcenter.sdk.model.Configuration;    public class ConfigurationViewer {        public static void main(String[] args) {          // 配置中心的服务器URL和认证令牌          String serverUrl = "configcenter_server_url";          String authToken = "your_auth_token";            // 配置项的ID或键(key)          String configurationId = "your_configuration_id";          // 或者使用配置项的键(key)来获取配置项,根据配置中心API的要求而定          // String configurationKey = "your_configuration_key";            try {              // 初始化配置中心的客户端              ConfigCenterClient client = ConfigCenterClient.init(serverUrl, authToken);                // 调用配置中心的API接口获取配置项              Configuration configuration = client.getConfiguration(configurationId);              // 或者使用配置项的键(key)来获取:              // Configuration configuration = client.getConfigurationByKey(configurationKey);                // 输出配置项的信息              if (configuration != null) {                  System.out.println("配置项ID: " + configuration.getId());                  System.out.println("配置项键(key): " + configuration.getKey());                  System.out.println("配置项值(value): " + configuration.getValue());                  // 输出其他配置项属性,如描述、标签等              } else {                  System.out.println("未找到配置项");              }          } catch (ConfigCenterException e) {              System.out.println("查看配置项出现异常: " + e.getMessage());              e.printStackTrace();          }      }  }

在上面的示例代码中:MzP28资讯网——每日最新资讯28at.com

  • 我们首先初始化配置中心的客户端。
  • 然后调用相应的API接口来获取配置项。
  • 在获取到配置项后,我们可以输出配置项的各种属性,如ID、键(key)、值(value)等。
  • 如果发生异常,我们进行异常处理并打印相应的异常信息。

4、配置变更订阅

配置中心通常支持配置变更订阅功能,允许应用程序或其他服务订阅配置项的变更通知。当配置项发生变化时,配置中心会向订阅者发送通知,以便订阅者能够及时获取最新的配置项。MzP28资讯网——每日最新资讯28at.com

要通过Java代码实现配置变更订阅,你可以按照以下步骤进行操作:MzP28资讯网——每日最新资讯28at.com

  • 首先,确保你已经初始化了配置中心的客户端,如上述示例代码所示。
  • 创建一个订阅者(listener)类,实现配置中心提供的订阅接口。这个类将负责处理配置项的变更通知。
  • 在订阅者类中,实现接口中定义的方法,以处理配置项的变更事件。该方法通常会在配置项发生变化时被调用,并且会接收包含变更信息的参数。
  • 在你的应用程序或服务中,创建一个订阅请求(subscription request)对象,指定你希望订阅的配置项或配置项的过滤条件。
  • 使用配置中心的客户端对象,调用订阅方法,将订阅请求对象和订阅者对象作为参数传递给该方法。这将向配置中心注册你的订阅请求,并指定订阅者类来处理变更通知。
  • 一旦注册成功,当配置项发生变更时,配置中心将调用订阅者类中的方法,将变更信息传递给订阅者。你可以在这个方法中编写逻辑来处理配置项的变更,如更新本地缓存、重新加载配置等。

下面是一个简单的示例代码,展示如何实现配置变更订阅:MzP28资讯网——每日最新资讯28at.com

import com.configcenter.sdk.ConfigCenterClient;  import com.configcenter.sdk.exception.ConfigCenterException;  import com.configcenter.sdk.listener.ConfigurationChangeListener;  import com.configcenter.sdk.model.Configuration;    public class ConfigurationSubscriber {        public static void main(String[] args) {          // 初始化配置中心的客户端(省略代码)            // 创建订阅者类          ConfigurationChangeListener listener = new ConfigurationChangeListener() {              @Override              public void onConfigurationChanged(Configuration configuration) {                  // 处理配置项变更事件                  System.out.println("配置项发生变化: " + configuration.getKey() + " = " + configuration.getValue());                  // 在这里可以更新本地缓存、重新加载配置等              }          };            try {              // 创建订阅请求对象(根据配置中心API的要求而定)              // 指定你希望订阅的配置项过滤条件,如配置项的键(key)或其他属性                // 调用配置中心的订阅方法              ConfigCenterClient client = ConfigCenterClient.init(serverUrl, authToken);              client.subscribeToConfigurationChanges(filter, listener);          } catch (ConfigCenterException e) {              System.out.println("配置变更订阅出现异常: " + e.getMessage());              e.printStackTrace();          }      }  }

五、主流的微服务注册中心有哪些,如何选择?

1、在选择微服务注册中心时,可以考虑以下因素:

  • 功能和特性:不同的注册中心可能具有不同的功能和特性,需要根据自己的需求来选择。例如,一些注册中心可能更侧重于服务发现,而另一些可能提供更全面的配置管理功能。
  • 性能和稳定性:注册中心作为微服务架构的核心组件,其性能和稳定性至关重要。需要对候选的注册中心进行性能测试和稳定性评估,确保它们能够满足你的业务需求。
  • 易用性和开发体验:注册中心的易用性和开发体验也是选择的重要因素。选择一个提供良好开发文档、客户端库和工具的注册中心,可以使开发过程更加顺畅高效。
  • 社区支持和生态系统:一个活跃和健康的社区可以为注册中心提供持续的支持和改进。同时,一个丰富的生态系统可以提供更多的集成选项和解决方案。因此,需要评估候选注册中心的社区活跃度和生态系统成熟度。
  • 安全性和合规性:安全性和合规性对于任何系统都至关重要。需要确保所选的注册中心能够提供足够的安全保障,并满足你的合规性要求。

最终,选择微服务注册中心是一个权衡的过程,需要根据自己的实际需求、技术栈、团队熟悉度等因素进行综合考虑。MzP28资讯网——每日最新资讯28at.com

2、主流注册中心

在Eureka、Consul、Zookeeper和Nacos这几个微服务注册中心中,选择最适合的一个取决于你的具体需求和环境。MzP28资讯网——每日最新资讯28at.com

(1)Eureka

  • 是Netflix开发的服务注册中心,与Spring Cloud集成良好。
  • 保证了高可用性和最终一致性,服务注册相对较快。
  • 在数据不一致时,每个Eureka节点仍能正常对外提供服务,保证了可用性。

(2)Consul

  • 使用Go语言编写,具有较好的跨平台性。
  • 提供了丰富的功能和强大的一致性保证。
  • 支持多数据中心和分布式部署,适合大规模环境。

(3)Zookeeper

  • 最初是一个分布式协调服务,后来被用于服务注册和发现。
  • 提供了强一致性和高可用性,但相对较复杂,需要自行实现一些服务发现功能。

(4)Nacos

  • 是阿里巴巴开源的项目,支持基于DNS和基于RPC的服务发现。
  • 除了服务注册和发现,还支持动态配置服务。
  • 在Spring Cloud中使用较为简单,只需简单的配置即可完成服务的注册和发现。

3、如何选择?

  • 如果你使用Spring Cloud作为微服务框架,Eureka可能是一个自然的选择,因为它与Spring Cloud集成良好。
  • 如果你需要强大的跨平台支持和一致性保证,Consul是一个不错的选择。
  • 如果你已经在使用Zookeeper或其他Apache项目,并且希望在同一生态系统中解决服务注册和发现问题,那么Zookeeper可能适合你。
  • 如果你在寻找一个简单且与阿里巴巴技术栈集成的解决方案,Nacos是一个值得考虑的选项。

最终的选择应基于你的技术需求、团队熟悉度和业务场景。MzP28资讯网——每日最新资讯28at.com

MzP28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-27989-0.html实战:Nacos配置中心的Pull原理,附源码

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: .NET Core中生成二维码和识别二维码内容方法

下一篇: 带你吃透Kafka的可靠性设计

标签:
  • 热门焦点
  • 2023年Q2用户偏好榜:12+256G版本成新主流

    2023年Q2用户偏好榜:12+256G版本成新主流

    3月份的性能榜、性价比榜和好评榜之后,就要轮到2023年的第二季度偏好榜了,上半年的新机潮已经过去,最明显的肯定就是大内存和存储的机型了,另外部分中端机也取消了屏幕塑料支架
  • 十个简单但很有用的Python装饰器

    十个简单但很有用的Python装饰器

    装饰器(Decorators)是Python中一种强大而灵活的功能,用于修改或增强函数或类的行为。装饰器本质上是一个函数,它接受另一个函数或类作为参数,并返回一个新的函数或类。它们通常用
  • 在线图片编辑器,支持PSD解析、AI抠图等

    在线图片编辑器,支持PSD解析、AI抠图等

    自从我上次分享一个人开发仿造稿定设计的图片编辑器到现在,不知不觉已过去一年时间了,期间我经历了裁员失业、面试找工作碰壁,寒冬下一直没有很好地履行计划.....这些就放在日
  • 零售大模型“干中学”,攀爬数字化珠峰

    零售大模型“干中学”,攀爬数字化珠峰

    文/侯煜编辑/cc来源/华尔街科技眼对于绝大多数登山爱好者而言,攀爬珠穆朗玛峰可谓终极目标。攀登珠峰的商业路线有两条,一是尼泊尔境内的南坡路线,一是中国境内的北坡路线。相
  • 2023年,我眼中的字节跳动

    2023年,我眼中的字节跳动

    此时此刻(2023年7月),字节跳动从未上市,也从未公布过任何官方的上市计划;但是这并不妨碍它成为中国最受关注的互联网公司之一。从2016-17年的抖音强势崛起,到2018年的“头腾
  • 东方甄选单飞:有些鸟注定是关不住的

    东方甄选单飞:有些鸟注定是关不住的

    文/彭宽鸿编辑/罗卿东方甄选创始人俞敏洪带队的“7天甘肃行”直播活动已在近日顺利收官。成立后一年多时间里,东方甄选要脱离抖音自立门户的传闻不绝于耳,“7
  • 小米汽车电池信息疑似曝光:容量101kWh,支持800V高压快充

    小米汽车电池信息疑似曝光:容量101kWh,支持800V高压快充

    7月14日消息,今日一名博主在社交媒体发布了一张疑似小米汽车电池信息的照片,显示该电池包正是宁德时代麒麟电池,容量为101kWh,电压为726.7V,可以预测小
  • 华为发布HarmonyOS 4:更好玩、更流畅、更安全

    华为发布HarmonyOS 4:更好玩、更流畅、更安全

    在8月4日的华为开发者大会2023(HDC.Together)大会上,HarmonyOS 4正式发布。自2019年发布以来,HarmonyOS一直以用户为中心,经历四年多的发展HarmonyOS已
  • 利用职权私自解除被封帐号 Meta开除20多名员工

    利用职权私自解除被封帐号 Meta开除20多名员工

    11月18日消息,据外媒援引知情人士表示,过去一年时间内,Facebook母公司Meta解雇或处罚了20多名员工以及合同工,指控这些人通过内部系统以不当方式重置用户帐号,其
Top