• 0
  • 0
分享

  一、配置架构

  在微服务的代码工程中,配置管理是一项复杂的事情,即需要做好各个环境的配置隔离措施,还需要确保生产环境的配置安全;如果划分的微服务足够的多,还要考虑配置更新时的效率;

2-1.png

  常规情况下,在配置管理的体系中,分为四个主要的环境:开发、测试、灰度、生产;通常来说除了运维团队之外,其他人员没有查看灰度和生产配置的权限,以此来保证配置的安全性;配置中心的服务也会搭建两套:研发与生产各自独立部署。

  二、配置方式

  在项目中涉及到的配置非常多,类型也很多,但是从大的结构上可以分为:工程级、应用级、组件级三大块;实际上这里只是单纯的从代码工程来看配置,如果把持续集成、自动化相关模块也考虑进来的话,配置的管理会更加复杂;

2-2.png

  站在开发的角度来看,主要还是对应用级的配置进行管理,而在微服务的架构下,多个不同的服务既有大量相同的配置,又存在各种差异化的自定义参数,所以在维护上有一定的复杂性;

2-3.png

  在单服务的工程中,应用中只会存在一个bootstrap.yml配置文件,配置内容基本就是服务名称,和配置中心地址等常规内容,其他复杂的配置都被封闭维护,避免核心内容泄露引发安全问题;

2-4.png

  配置主体通常会被拆分成如下几个层次:环境控制,用来识别灰度和生产;应用基础,管理和加载各个服务的通用配置;服务差异则配置在各自独立的文件内;并且对多个配置进行分类分层管理;以此保证配置的安全和降低维护难度。

  三、Nacos配置

  首先还是从bootstrap.yml文件作为切入点,以当下常见的Nacos组件为例,围绕基础原理作为思路,来分析服务工程是如何加载Nacos配置中心的参数;

  spring:
    profiles:
      active: dev,facade
    cloud:
      nacos:
        config:
          prefix: application
          server-addr: 127.0.0.1:8848
          file-extension: yml

2-5.png

  组件配置:配置逻辑中,单个服务端提供自身配置参数的信息,从上篇服务管理的源码中发现,这是一种很常用的手段;需要基于这些信息去Nacos服务中加载配置;

  @ConfigurationProperties("spring.cloud.nacos.config")
  public class NacosConfigProperties {
      public Properties assembleConfigServiceProperties() {
          Properties properties = new Properties();
          properties.put("serverAddr", Objects.toString(this.serverAddr, ""));
          properties.put("namespace", Objects.toString(this.namespace, ""));
          return properties ;
      }
  }

  加载逻辑:服务启动时,先基于相应参数读取Nacos中配置的,然后解析数据并被Spring框架进行加载,加载的过程通过MapPropertySource类进行Key和Value的读取;

  public class NacosPropertySourceBuilder {
      private List<PropertySource<?>> loadNacosData(String dataId, String group, String fileExtension) {
          // 查询配置
          String data = this.configService.getConfig(dataId, group, this.timeout);
          // 解析配置
          return NacosDataParserHandler.getInstance().parseNacosData(dataId, data, fileExtension);
      }
  }

  请求服务:服务端与Nacos中心通过Http请求的方式进行交互,通过Get请求携带参数,调用Nacos中心服务,从而获取相应配置;

  public class ClientWorker implements Closeable {
      public String[] getServerConfig(String dataId, String group, String tenant, long readTimeout) {
          // 核心参数
          Map<String, String> params = new HashMap<String, String>(3);
          params.put("dataId", dataId);
          params.put("group", group);
          params.put("tenant", tenant);
          // 执行请求
          HttpRestResult<String> result = agent.httpGet(Constants.CONFIG_CONTROLLER_PATH, null, params, agent.getEncode(), readTimeout);
      }
  }

  四、Spring加载

  从源码的结构图来看,配置文件的加载逻辑也是采用事件模型实现的,这在前面任务管理中有详细的描述;配置的核心作用就是在程序启动时进行加载引导,这里关键要理解EnvironmentPostProcessor的接口设计;

2-6.png

  public class ConfigFileApplicationListener implements EnvironmentPostProcessor, SmartApplicationListener, Ordered {
      // 基础配置
      private static final String DEFAULT_NAMES = "application";
      public static final String ACTIVE_PROFILES_PROPERTY = "spring.profiles.active";
      public static final String INCLUDE_PROFILES_PROPERTY = "spring.profiles.include";
      static {
      Set<String> filteredProperties = new HashSet<>();
      filteredProperties.add("spring.profiles.active");
      filteredProperties.add("spring.profiles.include");
      LOAD_FILTERED_PROPERTY = Collections.unmodifiableSet(filteredProperties);
      }
      // 加载逻辑
      void load() {
  FilteredPropertySource.apply(this.environment, DEFAULT_PROPERTIES, LOAD_FILTERED_PROPERTY,
  (defaultProperties) -> {
  });
      }
  }

  EnvironmentPostProcessor接口:加载应用的自定义环境;

  @FunctionalInterface
  public interface EnvironmentPostProcessor {
  void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application);
  }

  SpringApplication:用于启动和引导应用程序,提供创建程序上下文实例,初始化监听器,容器刷新等核心逻辑,可以围绕run()方法进行调试分析;

  ConfigurableEnvironment:环境配置的核心接口,涉及到当前配置文件识别,即profiles.active;以及配置文件的解析能力,即PropertyResolver;在Loader内部类中提供了构造方法和加载逻辑的实现。


作者:知了一笑    

来源:http://www.51testing.com/html/52/n-7796552.html

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   据DigiTimes的报道,由于台积电美国晶圆厂的芯片制造成本远高于中国台湾,台积电正准备将这些额外的成本转嫁给其客户。  其中,台积电美国晶圆厂的代工价格或将比台湾晶圆厂高出30%,也就是说,台积电美国客户将需要为美国制造的芯片多支付30%的费用。  报道称,台积电已经开始与客户讨论分别在美国和日本的两个海外代工厂的订单和定价,这两个工厂预计2024年底开始量产。  业内人士认为,以台积电N4和N5工艺技术生产的芯片在美国的价格将比中国台湾地区的高20%-30%,而在日本熊本工厂以N28/N22以及N16/N12节点生产的旧工艺芯片的价格可能比在中国台湾制造的类似芯片高10%-15%。 ...
            0 0 517
            分享
          • 在我们做UI自动化的时候,经常会遇到图片验证码的问题。当开发不给咱们提供万能验证码,或者测试第三方网站比如知乎的时候,我们就需要自己去识别验证码。OCROCR是一种图像文字识别的技术,例如图中的验证码,我们用肉眼识别就是c5s3,但机器可不比咱们肉眼。所以我们要利用ocr技术,让我们的Python脚本自动通过图片识别出对应的文字。常见的识别类库在Python中其实有许多识别类库,这里只介绍博主自己实践过的成功率还不错的:百度ocr。简单的说,就是百度提供了一个SDK,让我们传入图片数据,从而拿到识别的结果。ocr的细节我们不需要关心。申请开通OCR首先我们得有一个百度账号,这个相信大家都有,没...
            0 2 6390
            分享
          •   尽管他的 Twitter-X 平台屡屡出现问题,埃隆-马斯克(Elon Musk)还是频频瞄准新的对手。据马斯克称,维基百科要求用户提供了过多的资金。埃隆-马斯克上周末发布了一系列关于维基百科的推文,质疑维基媒体基金会为何要求"这么多钱"。这个美国非营利组织由吉米-威尔士(Jimmy"Jimbo"Wales)于 2003 年成立,负责托管和管理维基百科及其他维基相关项目。该基金会经常向用户募捐,马斯克似乎对这种经常性的要求感到不满。  马斯克认为,维基百科"绝对"不需要那么多钱来维持在线。马斯克在Twitter上说,用户甚至可以在...
            0 0 375
            分享
          •   前言  性能测试用例主要分为预期目标用户测试、用户并发测试、疲劳强度与大数据量测试、网络性能测试、服务器性能测试五大部分。  具体编写用例时要根据实际情况去进行,遵守低成本、策略为中心,裁减、完善模型,具体化等原则。  Web性能测试模型提出的主要依据是:一种类型的性能测试可以在某些条件下转化成为另外一种类型的性能测试,这些类型的性能测试的实施是有着相似之处的。  预期指标的性能测试  系统在需求分析和设计阶段都会提出一些性能指标,完成这些指标的相关的测试是性能测试的首要工作之一,这些指标主要诸于:系统可以支持并发用户200个,系统响应时间不得超过20秒等。  对这种预先承诺的性能要求,需...
            0 0 738
            分享
          •   Google的人工智能聊天机器人巴德(Bard)在经历了乏善可陈的发布之后,已经逐渐变得越来越有用。现在,该机器人的 YouTube 整合功能得到了方便的升级,这样它就可以分析单个视频,为观众提供特定的信息--比如关键点或食谱成分--而无需按下播放键。这可能是一个非常有用的工具,但也可能让创作者更加担心人工智能的生成影响了他们的观众观看时长。  尽管早在 9 月份推出 YouTube 扩展功能时,Bard 就已经具备了分析 YouTube 视频的能力,但现在聊天机器人可以为你具体解答与视频内容相关的问题。  公司在 Bard 的更新页面上写道:"我们正在为 Bard 理解 You...
            0 0 488
            分享
      • 51testing软件测试圈微信