首页 > 编程语言 >解析Java Chassis 3中应用视角的配置管理

解析Java Chassis 3中应用视角的配置管理

时间:2024-01-23 11:13:08浏览次数:34  
标签:服务 Spring 配置 配置管理 Chassis 应用 Java

本文分享自华为云社区《Java Chassis 3技术解密:应用视角的配置管理》,作者: liubao68。

谈论微服务配置管理的时候,最多的是以配置中心为视角,讨论其配置管理能力。 和注册中心一样,不同的配置中心会有一些关键的设计指标。

  • 配置的格式和类型。支持不同格式和类型的配置项,比如YAML、文本、JSON、XML等。
  • 配置的逻辑层次。比如 Kie 提供了 Label 来表达配置的层次,可以简化为应用配置、服务配置和自定义配置等;Nacos 使用 Namespace、Group等概念来表达配置的层次。
  • 变更通知机制。和注册中心一样,配置中心也有变更通知机制,两者的机制相似。相较而言,配置中心对于变更感知周期的的要求更低。
  • 配置历史和推送轨迹。通过配置历史,能够了解配置项的改动记录,方便进行审计和回退,推送轨迹则帮助了解配置项被应用到了哪些微服务。

Java Chassis 3的设计目标之一,就是以应用的视角,支持不同的配置中心,并提供统一一致的使用方式。

Java Chassis 3简化了微服务定义,只包含如下核心概念:

  • 环境名称:用于表示部署环境,不同环境的微服务之间不能进行服务发现。对于不同的注册中心和配置中心,会以对应的概念表示环境。比如Nacos使用 namespace 来表示环境。
  • 应用名称:用于描述一组可以相互访问的微服务,不同应用名称之间是逻辑隔离的,不能进行服务发现。对于不同的注册中心和配置中心,会以对应的概念表示应用。比如Nacos使用 group 来表示应用。
  • 微服务名称:用于标识一个微服务。可以通过微服务名称查询需要访问的目标微服务。
  • 微服务版本:表示微服务的版本。当存在微服务属性变化、接口变化的场景,建议修改版本号。
  • 微服务描述:简单的微服务描述信息。
  • 微服务属性:用于描述微服务的扩展信息。
servicecomb:
  service:
    application: hello-applicaton
    name: hello-service
    version: 0.0.1 
    properties: 
      key1: value1
      key2: value2
    description: This is a description about the microservice
    environment: production

当一个微服务接入配置中心以后,Java Chassis 3的配置管理模块,会自动从配置中心获取如下配置层次的配置信息:

  • 应用配置。
  • 服务配置。
  • 版本配置。
  • 自定义配置。

这些配置在不同配置中心的对应关系:

项目Nacos 配置中心Kie 配置中心备注
应用配置 namespace=environment
group=application
dataId=application
environment=environment
app=application
 
服务配置 namespace=environment
group=application
dataId=service
environment=environment
app=application
service=service
 
版本配置 namespace=environment
group=application
dataId=service-version
environment=environment
app=application
service=service
version=version
 
自定义配置 namespace=environment
group=group
dataId=dataId
customLabel=customLabelValue  

以应用视角建立这种对应关系的好处,是用户不需要自行规划如何在配置中心存放数据,可以直接将一个优秀的管理实践应用于业务场景。将用户需要思考的问题,固定为几个具体的问题:如何创建应用级别的配置?如何创建服务级别的配置?如何创建微服务自定义的配置?

应用视角的配置管理另外一个关键问题,是开发者如何使用配置。

  • Spring Boot使用配置

Spring Boot的开发者一般通过 @Value@ConfigurationProperties 和 Environment 获取配置。 它提供了 PropertySource 来扩展配置源。 Spring Boot并未针对配置变更提供额外的处理机制,无法很好的处理配置变更。 尽管当 PropertySource 的内容变化后,通过 Environment 可以获取到最新的版本内容,但是 @Value@ConfigurationProperties 定义的配置项则不会发生变化。

  • Spring Cloud使用配置

Spring Cloud在Spring Boot基础之上,提供了动态配置的能力。 可以使用 @RefershScope 标签声明 Bean, 在配置变化后,Spring Cloud会销毁老的 Bean, 并重建新的 Bean,新的 Bean会使用最新的配置值进行初始化。 Spring Cloud在处理配置变更的过程中,会对Bean的访问加读写锁。

  • Java Chassis 3使用配置

Java Chassis 3完全兼容 Spring Boot的配置使用方式。 并提供了更加友好的 API 监听配置变更和处理优先级配置。 配置监听 API 主要用于高性能场景:配置变更后需要进行必要的业务逻辑初始化,初始化可以在配置变更线程中执行,而不阻塞当前业务执行。

@RestSchema(schemaId = "ProviderController")
@RequestMapping(path = "/")
public class ProviderController {
  private DynamicProperties dynamicProperties;

  private String example;

  @Autowired
  public ProviderController(DynamicProperties dynamicProperties) {
    this.dynamicProperties = dynamicProperties;
    this.example = this.dynamicProperties.getStringProperty("basic.example",
            value -> this.example = value, "not set");
  }
}

优先级配置是Java Chassis3特有的管理配置优先级方式。比如对于某个方法,会考虑是否有应用级别的全局配置、针对服务的配置和针对这个方法的配置,针对方法的配置优先级最高。 这种配置方式被广泛应用于Java Chassis 3的限流等服务治理场景中。 下面的代码片段是Java Chassis的接口超时配置示例。

@InjectProperties(prefix = "servicecomb")
public class OperationConfig {
  public static final List<String> CONSUMER_OP_ANY_PRIORITY = Arrays.asList(
      "${service}.${schema}.${operation}",
      "${service}.${schema}",
      "${service}");
  
  /**
   * consumer request timeout
   */
  @InjectProperty(keys = {"request.${op-any-priority}.timeout", "request.timeout"}, defaultValue = "30000")
  private long msRequestTimeout;
}

相对于Spring Cloud,Java Chassis3的配置API,能够更加方便的监听配置变化,并提供了更好的性能。

客户故事:Spring Cloud配置变更会加锁。在高并发场景,配置变更会阻塞所有请求的执行。如果业务执行(已经获取读锁)包含RPC等相对慢的逻辑,配置变更等待写锁以及其他执业务线程等待读锁都会被阻塞,产生雪崩效应,触发应用吞吐急剧下降。Java Chassis 3配置变更不阻塞业务处理,能够有效的防止配置变更触发雪崩效应,特别是在高并发、需要动态调整运行、治理规则的业务场景。

 

点击关注,第一时间了解华为云新鲜技术~

 

标签:服务,Spring,配置,配置管理,Chassis,应用,Java
From: https://www.cnblogs.com/huaweiyun/p/17981895

相关文章

  • Java 将表达式解析为AST
    importorg.antlr.v4.runtime.*;importorg.antlr.v4.runtime.tree.*;publicclassExpressionParser{publicstaticvoidmain(String[]args)throwsException{//创建输入流InputStreaminput=newFileInputStream("expression.txt")......
  • 从SQL到Java数据类型映射的JDBC规范
    SQL类型Java类型CHARjava.lang.StringVARCHARjava.lang.StringLONGVARCHARjava.lang.StringNUMERICjava.math.BigDecimalDECIMALjava.math.BigDecimalBITbooleanTINYINTbyteSMALLINTshortINTEGERint......
  • Java开源表达式计算引擎(转载)
    1) jfireEL——高性能EL表达式解析框架jfireEL是快速的EL表达式解析器,支持丰富的EL表达式,7倍于SpringEL的超高性能。2)Aviator——轻量级高性能Java表达式引擎Aviator是一个高性能、轻量级的Java语言实现的表达式求值引擎,主要用于各种表达式的动态求值。支......
  • hivesql报错:java.net.SocketTimeoutException: Read timed out
    场景:在dolphin里面执行hivesql脚本,报错java.net.SocketTimeoutException:Readtimedout解决方式:hive.metastore.client.socket.timeout=1000s 扩展:"Hive报Readtimedout"错误可能也与YARN的资源限制有关。可以通过增加YARN的配置参数来解决此错误。<property><name......
  • Java开发者的Python进修指南:JSON利器之官方json库、demjson和orjson的实用指南
    JSONJSON作为目前最流行的传输格式,在Python中也有相应的实现方式。由于JSON格式的文本可以跨平台并且简单易用,因此被广泛传播。因此,我们今天的主要讨论内容是如何熟练地应用Python的JSON库来处理将JSON映射到文本,以及如何从文本映射到对象中。现在,让我们开始探讨这个话题。官方j......
  • 详解static关键字在Java中的各种适应场景,这个很重要!
    写在开头静态(static)关键字在Java的众多关键字中举足轻重!也是很多大厂面试官特别喜欢问的面试高频知识点,今天我们就一起学习,梳理,重温一下这个关键吧,之所以用重温修饰是因为在过往的文章中早已提到了static,无论是变量中还是方法中甚至于类中,static都是不可或缺的!我们知道要想调用......
  • Java集合篇
    面渣逆袭一、Java集合篇2024/1/22哈希冲突的解决方案:哈希冲突是指输入两个不同的值,通过同一个哈希函数,得到一个相同的值;而HashMap是通过链表的方式来解决哈希冲突;链地址法:在冲突的位置拉一个链表,把冲突的元素放进去;开放定址法:从冲突的位置上接着往下找,给冲突元素......
  • Java学习日记 Day8
    本来昨天计划今天开展开源架构的,但是决定先把JavaWeb的内容速通一下,明天开始SSM吧。前端+JavaWeb知识点补充:①网络传输三大基石:URL、HTTP、HTML②HTML:超文本标记语言,在浏览器中展示一个页面③CSS:美化页面④JS:实现页面动态跳转等交互⑤Tomcat:在服务器中运行程序的一个东西......
  • Java之并发工具类的详细解析
     3.并发工具类3.1并发工具类-HashtableHashtable出现的原因:在集合类中HashMap是比较常用的集合对象,但是HashMap是线程不安全的(多线程环境下可能会存在问题)。为了保证数据的安全性我们可以使用Hashtable,但是Hashtable的效率低下。代码实现:packagecom.itheima.mymap;imp......
  • 【开源】基于JAVA的生活废品回收系统
    一、摘要1.1项目介绍生活废品回收系统是可持续发展的解决方案,旨在鼓励人们分离和回收生活垃圾,减少环境污染和资源浪费,生活废品回收系统涵盖了城市居民的日常生活,包括收集、分类、处理和收集废物的完整过程。本文提出了一种基于Vue技术的生活废品回收系统,该系统可以通过垃圾的收集......