Java?Chassis3應用視角的配置管理技術解密
Java Chassis 3技術解密:應用視角的配置管理
談論微服務配置管理的時候,最多的是以配置中心為視角,討論其配置管理能力。 和注冊中心一樣,不同的配置中心會有一些關鍵的設計指標。
- 配置的格式和類型。支持不同格式和類型的配置項,比如YAML、文本、JSON、XML等。
- 配置的邏輯層次。比如 Kie 提供了 Label 來表達配置的層次,可以簡化為應用配置、服務配置和自定義配置等;Nacos 使用 Namespace、Group等概念來表達配置的層次。
- 變更通知機制。和注冊中心一樣,配置中心也有變更通知機制,兩者的機制相似。相較而言,配置中心對于變更感知周期的的要求更低。
- 配置歷史和推送軌跡。通過配置歷史,能夠了解配置項的改動記錄,方便進行審計和回退,推送軌跡則幫助了解配置項被應用到了哪些微服務。
Java Chassis 3的設計目標之一,就是以應用的視角,支持不同的配置中心,并提供統(tǒng)一一致的使用方式。
Java Chassis 3核心概念
Java Chassis 3簡化了微服務定義,只包含如下核心概念:
- 環(huán)境名稱:用于表示部署環(huán)境,不同環(huán)境的微服務之間不能進行服務發(fā)現(xiàn)。對于不同的注冊中心和配置中心,會以對應的概念表示環(huán)境。比如Nacos使用
namespace
來表示環(huán)境。 - 應用名稱:用于描述一組可以相互訪問的微服務,不同應用名稱之間是邏輯隔離的,不能進行服務發(fā)現(xiàn)。對于不同的注冊中心和配置中心,會以對應的概念表示應用。比如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 |
以應用視角建立這種對應關系的好處,是用戶不需要自行規(guī)劃如何在配置中心存放數(shù)據(jù),可以直接將一個優(yōu)秀的管理實踐應用于業(yè)務場景。將用戶需要思考的問題,固定為幾個具體的問題:如何創(chuàng)建應用級別的配置?如何創(chuàng)建服務級別的配置?如何創(chuàng)建微服務自定義的配置?
開發(fā)者如何使用配置
應用視角的配置管理另外一個關鍵問題,是開發(fā)者如何使用配置。
- Spring Boot使用配置
Spring Boot的開發(fā)者一般通過 @Value
、@ConfigurationProperties
和 Environment
獲取配置。 它提供了 PropertySource
來擴展配置源。 Spring Boot并未針對配置變更提供額外的處理機制,無法很好的處理配置變更。 盡管當 PropertySource
的內容變化后,通過 Environment
可以獲取到最新的版本內容,但是 @Value
、@ConfigurationProperties
定義的配置項則不會發(fā)生變化。
- Spring Cloud使用配置
Spring Cloud在Spring Boot基礎之上,提供了動態(tài)配置的能力。 可以使用 @RefershScope
標簽聲明 Bean, 在配置變化后,Spring Cloud會銷毀老的 Bean, 并重建新的 Bean,新的 Bean會使用最新的配置值進行初始化。 Spring Cloud在處理配置變更的過程中,會對Bean的訪問加讀寫鎖。
- Java Chassis 3使用配置
Java Chassis 3完全兼容 Spring Boot的配置使用方式。 并提供了更加友好的 API 監(jiān)聽配置變更和處理優(yōu)先級配置。 配置監(jiān)聽 API 主要用于高性能場景:配置變更后需要進行必要的業(yè)務邏輯初始化,初始化可以在配置變更線程中執(zhí)行,而不阻塞當前業(yè)務執(zhí)行。
@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"); } }
優(yōu)先級配置是Java Chassis3特有的管理配置優(yōu)先級方式。比如對于某個方法,會考慮是否有應用級別的全局配置、針對服務的配置和針對這個方法的配置,針對方法的配置優(yōu)先級最高。 這種配置方式被廣泛應用于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,能夠更加方便的監(jiān)聽配置變化,并提供了更好的性能。
客戶故事:Spring Cloud配置變更會加鎖。在高并發(fā)場景,配置變更會阻塞所有請求的執(zhí)行。如果業(yè)務執(zhí)行(已經(jīng)獲取讀鎖)包含RPC等相對慢的邏輯,配置變更等待寫鎖以及其他執(zhí)業(yè)務線程等待讀鎖都會被阻塞,產(chǎn)生雪崩效應,觸發(fā)應用吞吐急劇下降。Java Chassis 3配置變更不阻塞業(yè)務處理,能夠有效的防止配置變更觸發(fā)雪崩效應,特別是在高并發(fā)、需要動態(tài)調整運行、治理規(guī)則的業(yè)務場景。
以上就是Java Chassis3應用視角的配置管理技術解密的詳細內容,更多關于Java Chassis3應用視角配置管理的資料請關注腳本之家其它相關文章!
相關文章
Java使用XML與注解方式實現(xiàn)CRUD操作代碼
MyBatis提供了靈活的配置和使用方式,使得數(shù)據(jù)庫操作更加簡潔和高效,通過本文,我們介紹了如何使用MyBatis框架,通過XML映射文件和注解兩種方式來實現(xiàn)數(shù)據(jù)庫的增刪改查操作,感興趣的朋友跟隨小編一起看看吧2024-02-02Java使用easyExcel導出excel數(shù)據(jù)案例
這篇文章主要介紹了Java使用easyExcel導出excel數(shù)據(jù)案例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-10-10Java基于MySQL實現(xiàn)學生管理系統(tǒng)
這篇文章主要為大家詳細介紹了Java基于MySQL實現(xiàn)學生管理系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01