Dubbo3 配置概述

2022-03-29 16:36 更新

Dubbo配置介紹

本文主要介紹Dubbo配置概況,包括配置組件、配置來(lái)源、配置方式及配置加載流程。

配置組件

Dubbo框架的配置項(xiàng)比較繁多,為了更好地管理各種配置,將其按照用途劃分為不同的組件,最終所有配置項(xiàng)都會(huì)匯聚到URL中,傳遞給后續(xù)處理模塊。

常用配置組件如下:

  • application: Dubbo應(yīng)用配置
  • registry: 注冊(cè)中心
  • protocol: 服務(wù)提供者RPC協(xié)議
  • config-center: 配置中心
  • metadata-report: 元數(shù)據(jù)中心
  • service: 服務(wù)提供者配置
  • reference: 遠(yuǎn)程服務(wù)引用配置
  • provider: service的默認(rèn)配置或分組配置
  • consumer: reference的默認(rèn)配置或分組配置
  • module: 模塊配置
  • monitor: 監(jiān)控配置
  • metrics: 指標(biāo)配置
  • ssl: SSL/TLS配置

consumer 與 reference的關(guān)系

reference可以指定具體的consumer,如果沒(méi)有指定consumer則會(huì)自動(dòng)使用全局默認(rèn)的consumer配置。

consumer的屬性是reference屬性的默認(rèn)值,可以體現(xiàn)在兩個(gè)地方:

  1. 在刷新屬性(屬性覆蓋)時(shí),先提取其consumer的屬性,然后提取reference自身的屬性覆蓋上去,疊加后的屬性集合作為配置來(lái)源之一。
  2. 在組裝reference的URL參數(shù)時(shí),先附加其consumer的屬性,然后附加reference自身的屬性。
可以將consumer組件理解為reference組件的虛擬分組,根據(jù)需要可以定義多個(gè)不同的consumer,不同的consumer設(shè)置特定的默認(rèn)值, 然后在reference中指定consumer或者將 標(biāo)簽嵌套在標(biāo)簽之中。

provider 與 service的關(guān)系

service可以指定具體的provider,如果沒(méi)有指定則會(huì)自動(dòng)使用全局默認(rèn)的provider配置。 provider的屬性是service屬性的默認(rèn)值,覆蓋規(guī)則類似上面的consumer與reference,也可以將provider理解為service的虛擬分組。

配置來(lái)源

從Dubbo支持的配置來(lái)源說(shuō)起,默認(rèn)有6種配置來(lái)源:

  • JVM System Properties,JVM -D 參數(shù)
  • System environment,JVM進(jìn)程的環(huán)境變量
  • Externalized Configuration,外部化配置,從配置中心讀取
  • Application Configuration,應(yīng)用的屬性配置,從Spring應(yīng)用的Environment中提取"dubbo"打頭的屬性集
  • API / XML /注解等編程接口采集的配置可以被理解成配置來(lái)源的一種,是直接面向用戶編程的配置采集方式
  • 從classpath讀取配置文件 dubbo.properties

覆蓋關(guān)系

下圖展示了配置覆蓋關(guān)系的優(yōu)先級(jí),從上到下優(yōu)先級(jí)依次降低:

覆蓋關(guān)系

請(qǐng)參考相關(guān)內(nèi)容:屬性覆蓋。

配置方式

按照驅(qū)動(dòng)方式可以分為以下四種方式:

API配置

以Java編碼的方式組織配置,包括Raw API和Bootstrap API,具體請(qǐng)參考API配置。

XML配置

以XML方式配置各種組件,支持與Spring無(wú)縫集成,具體請(qǐng)參考XML配置。

Annotation配置

以注解方式暴露服務(wù)和引用服務(wù)接口,支持與Spring無(wú)縫集成,具體請(qǐng)參考Annotation配置。

屬性配置

根據(jù)屬性Key-value生成配置組件,類似SpringBoot的ConfigurationProperties,具體請(qǐng)參考屬性配置。

屬性配置的另外一個(gè)重要的功能特性是屬性覆蓋,使用外部屬性的值覆蓋已創(chuàng)建的配置組件屬性。

如果要將屬性配置放到外部的配置中心,請(qǐng)參考外部化配置。

除了外圍驅(qū)動(dòng)方式上的差異,Dubbo的配置讀取總體上遵循了以下幾個(gè)原則:

  1. Dubbo 支持了多層級(jí)的配置,并按預(yù)定優(yōu)先級(jí)自動(dòng)實(shí)現(xiàn)配置間的覆蓋,最終所有配置匯總到數(shù)據(jù)總線URL后驅(qū)動(dòng)后續(xù)的服務(wù)暴露、引用等流程。
  2. 配置格式以 Properties 為主,在配置內(nèi)容上遵循約定的 path-based 的命名規(guī)范

配置加載流程

配置加載流程

從上圖可以看出,配置加載大概分為兩個(gè)階段:

  • 第一階段為DubboBootstrap初始化之前,在Spring context啟動(dòng)時(shí)解析處理XML配置/注解配置/Java-config 或者是執(zhí)行API配置代碼,創(chuàng)建config bean并且加入到ConfigManager中。
  • 第二階段為DubboBootstrap初始化過(guò)程,從配置中心讀取外部配置,依次處理實(shí)例級(jí)屬性配置和應(yīng)用級(jí)屬性配置,最后刷新所有配置實(shí)例的屬性,也就是屬性覆蓋。

幾種編程配置方式

接下來(lái),我們看一下選擇不同的開(kāi)發(fā)方式時(shí),對(duì)應(yīng)到 ServiceConfig、ReferenceConfig 等編程接口采集的配置的變化。

Spring XML

參見(jiàn)示例
  <!-- dubbo-provier.xml -->
  
  <dubbo:application name="demo-provider"/>
  <dubbo:config-center address="zookeeper://127.0.0.1:2181"/>
  
  <dubbo:registry address="zookeeper://127.0.0.1:2181" simplified="true"/>
  <dubbo:metadata-report address="redis://127.0.0.1:6379"/>
  <dubbo:protocol name="dubbo" port="20880"/>
  
  <bean id="demoService" class="org.apache.dubbo.samples.basic.impl.DemoServiceImpl"/>
  <dubbo:service interface="org.apache.dubbo.samples.basic.api.DemoService" ref="demoService"/>

Spring Annotation

參見(jiàn)示例
  // AnnotationService服務(wù)實(shí)現(xiàn)
  
  @Service
  public class AnnotationServiceImpl implements AnnotationService {
      @Override
      public String sayHello(String name) {
          System.out.println("async provider received: " + name);
          return "annotation: hello, " + name;
      }
  }
  ## dubbo.properties

dubbo.application.name=annotation-provider
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880

Spring Boot

參見(jiàn)示例
  ## application.properties

# Spring boot application
spring.application.name=dubbo-externalized-configuration-provider-sample

# Base packages to scan Dubbo Component: @com.alibaba.dubbo.config.annotation.Service
dubbo.scan.base-packages=com.alibaba.boot.dubbo.demo.provider.service

# Dubbo Application
## The default value of dubbo.application.name is ${spring.application.name}
## dubbo.application.name=${spring.application.name}

# Dubbo Protocol
dubbo.protocol.name=dubbo
dubbo.protocol.port=12345

## Dubbo Registry
dubbo.registry.address=N/A

## DemoService version
demo.service.version=1.0.0

API

參考示例
public static void main(String[] args) throws IOException {
        ServiceConfig<GreetingsService> service = new ServiceConfig<>();
        service.setApplication(new ApplicationConfig("first-dubbo-provider"));
        service.setRegistry(new RegistryConfig("multicast://224.5.6.7:1234"));
        service.setInterface(GreetingsService.class);
        service.setRef(new GreetingsServiceImpl());
        service.export();
        System.out.println("first-dubbo-provider is running.");
        System.in.read();
        }


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)