Dubbo3 API配置

2022-03-29 16:39 更新

以API 配置的方式來配置你的 Dubbo 應(yīng)用

通過API編碼方式組裝配置,啟動Dubbo,發(fā)布及訂閱服務(wù)。此方式可以支持動態(tài)創(chuàng)建ReferenceConfig/ServiceConfig,結(jié)合泛化調(diào)用可以滿足API Gateway或測試平臺的需要。

API 屬性與XML配置項一一對應(yīng),各屬性含義請參見:XML配置參考手冊,比如:ApplicationConfig.setName("xxx") 對應(yīng) 
API使用范圍說明:API 僅用于 OpenAPI, ESB, Test, Mock, Gateway 等系統(tǒng)集成,普通服務(wù)提供方或消費(fèi)方,請采用XML 配置 或 注解配置 或 屬性配置 方式使用 Dubbo
參考API示例

服務(wù)提供者

通過ServiceConfig暴露服務(wù)接口,發(fā)布服務(wù)接口到注冊中心。

注意:為了更好支持Dubbo3的應(yīng)用級服務(wù)發(fā)現(xiàn),推薦使用新的DubboBootstrap API。
import org.apache.dubbo.config.ApplicationConfig;
import org.apache.dubbo.config.RegistryConfig;
import org.apache.dubbo.config.ProviderConfig;
import org.apache.dubbo.config.ServiceConfig;
import com.xxx.DemoService;
import com.xxx.DemoServiceImpl;

public class DemoProvider {
    public static void main(String[] args) {
        // 服務(wù)實現(xiàn)
        DemoService demoService = new DemoServiceImpl();

        // 當(dāng)前應(yīng)用配置
        ApplicationConfig application = new ApplicationConfig();
        application.setName("demo-provider");

        // 連接注冊中心配置
        RegistryConfig registry = new RegistryConfig();
        registry.setAddress("zookeeper://10.20.130.230:2181");

        // 服務(wù)提供者協(xié)議配置
        ProtocolConfig protocol = new ProtocolConfig();
        protocol.setName("dubbo");
        protocol.setPort(12345);
        protocol.setThreads(200);

        // 注意:ServiceConfig為重對象,內(nèi)部封裝了與注冊中心的連接,以及開啟服務(wù)端口
        // 服務(wù)提供者暴露服務(wù)配置
        ServiceConfig<DemoService> service = new ServiceConfig<DemoService>(); // 此實例很重,封裝了與注冊中心的連接,請自行緩存,否則可能造成內(nèi)存和連接泄漏
        service.setApplication(application);
        service.setRegistry(registry); // 多個注冊中心可以用setRegistries()
        service.setProtocol(protocol); // 多個協(xié)議可以用setProtocols()
        service.setInterface(DemoService.class);
        service.setRef(demoService);
        service.setVersion("1.0.0");

        // 暴露及注冊服務(wù)
        service.export();
        
        // 掛起等待(防止進(jìn)程退出)
        System.in.read();
    }
}

服務(wù)消費(fèi)者

通過ReferenceConfig引用遠(yuǎn)程服務(wù),從注冊中心訂閱服務(wù)接口。

注意:為了更好支持Dubbo3的應(yīng)用級服務(wù)發(fā)現(xiàn),推薦使用新的DubboBootstrap API。
import org.apache.dubbo.config.ApplicationConfig;
import org.apache.dubbo.config.RegistryConfig;
import org.apache.dubbo.config.ConsumerConfig;
import org.apache.dubbo.config.ReferenceConfig;
import com.xxx.DemoService;

public class DemoConsumer {
    public static void main(String[] args) {
        // 當(dāng)前應(yīng)用配置
        ApplicationConfig application = new ApplicationConfig();
        application.setName("demo-consumer");

        // 連接注冊中心配置
        RegistryConfig registry = new RegistryConfig();
        registry.setAddress("zookeeper://10.20.130.230:2181");

        // 注意:ReferenceConfig為重對象,內(nèi)部封裝了與注冊中心的連接,以及與服務(wù)提供方的連接
        // 引用遠(yuǎn)程服務(wù)
        ReferenceConfig<DemoService> reference = new ReferenceConfig<DemoService>(); // 此實例很重,封裝了與注冊中心的連接以及與提供者的連接,請自行緩存,否則可能造成內(nèi)存和連接泄漏
        reference.setApplication(application);
        reference.setRegistry(registry); // 多個注冊中心可以用setRegistries()
        reference.setInterface(DemoService.class);
        reference.setVersion("1.0.0");

        // 和本地bean一樣使用demoService
        // 注意:此代理對象內(nèi)部封裝了所有通訊細(xì)節(jié),對象較重,請緩存復(fù)用
        DemoService demoService = reference.get();
        demoService.sayHello("Dubbo");
    }
}

Bootstrap API

通過DubboBootstrap API可以減少重復(fù)配置,更好控制啟動過程,支持批量發(fā)布/訂閱服務(wù)接口,還可以更好支持Dubbo3的應(yīng)用級服務(wù)發(fā)現(xiàn)。

import org.apache.dubbo.config.bootstrap.DubboBootstrap;
import org.apache.dubbo.config.ApplicationConfig;
import org.apache.dubbo.config.RegistryConfig;
import org.apache.dubbo.config.ProviderConfig;
import org.apache.dubbo.config.ServiceConfig;
import com.xxx.DemoService;
import com.xxx.DemoServiceImpl;

public class DemoProvider {
    public static void main(String[] args) {

        ConfigCenterConfig configCenter = new ConfigCenterConfig();
        configCenter.setAddress("zookeeper://127.0.0.1:2181");

        // 服務(wù)提供者協(xié)議配置
        ProtocolConfig protocol = new ProtocolConfig();
        protocol.setName("dubbo");
        protocol.setPort(12345);
        protocol.setThreads(200);

        // 注意:ServiceConfig為重對象,內(nèi)部封裝了與注冊中心的連接,以及開啟服務(wù)端口
        // 服務(wù)提供者暴露服務(wù)配置
        ServiceConfig<DemoService> demoServiceConfig = new ServiceConfig<>();
        demoServiceConfig.setInterface(DemoService.class);
        demoServiceConfig.setRef(new DemoServiceImpl());
        demoServiceConfig.setVersion("1.0.0");
        
        // 第二個服務(wù)配置
        ServiceConfig<FooService> fooServiceConfig = new ServiceConfig<>();
        fooServiceConfig.setInterface(FooService.class);
        fooServiceConfig.setRef(new FooServiceImpl());
        fooServiceConfig.setVersion("1.0.0");
        
        ...

        // 通過DubboBootstrap簡化配置組裝,控制啟動過程
        DubboBootstrap.getInstance()
                .application("demo-provider") // 應(yīng)用配置
                .registry(new RegistryConfig("zookeeper://127.0.0.1:2181")) // 注冊中心配置
                .protocol(protocol) // 全局默認(rèn)協(xié)議配置
                .service(demoServiceConfig) // 添加ServiceConfig
                .service(fooServiceConfig)
                .start()    // 啟動Dubbo
                .await();   // 掛起等待(防止進(jìn)程退出)
    }
}
import org.apache.dubbo.config.bootstrap.DubboBootstrap;
import org.apache.dubbo.config.ApplicationConfig;
import org.apache.dubbo.config.RegistryConfig;
import org.apache.dubbo.config.ProviderConfig;
import org.apache.dubbo.config.ServiceConfig;
import com.xxx.DemoService;
import com.xxx.DemoServiceImpl;

public class DemoConsumer {
    public static void main(String[] args) {

        // 引用遠(yuǎn)程服務(wù)
        ReferenceConfig<DemoService> demoServiceReference = new ReferenceConfig<DemoService>(); 
        demoServiceReference.setInterface(DemoService.class);
        demoServiceReference.setVersion("1.0.0");
        
        ReferenceConfig<FooService> fooServiceReference = new ReferenceConfig<FooService>(); 
        fooServiceReference.setInterface(FooService.class);
        fooServiceReference.setVersion("1.0.0");

        // 通過DubboBootstrap簡化配置組裝,控制啟動過程
        DubboBootstrap bootstrap = DubboBootstrap.getInstance();
        bootstrap.application("demo-consumer") // 應(yīng)用配置
                .registry(new RegistryConfig("zookeeper://127.0.0.1:2181")) // 注冊中心配置
                .reference(demoServiceReference) // 添加ReferenceConfig
                .service(fooServiceReference)
                .start();    // 啟動Dubbo

        ...
        
        // 和本地bean一樣使用demoService
        // 通過Interface獲取遠(yuǎn)程服務(wù)接口代理,不需要依賴ReferenceConfig對象
        DemoService demoService = DubboBootstrap.getInstance().getCache().get(DemoService.class);
        demoService.sayHello("Dubbo");

        FooService fooService = DubboBootstrap.getInstance().getCache().get(FooService.class);
        fooService.greeting("Dubbo");
    }
    
}

其它配置

API配置能力與XML配置是等價的,其它的各種配置都可以用API設(shè)置。

下面只列出不同的地方,其它參見上面的寫法。

基本配置

可以在DubboBootstrap中設(shè)置全局基本配置,包括應(yīng)用配置、協(xié)議配置、注冊中心、配置中心、元數(shù)據(jù)中心、模塊、監(jiān)控、SSL、provider配置、consumer配置等。

// 注冊中心
RegistryConfig registry = new RegistryConfig();
registry.setAddress("zookeeper://192.168.10.1:2181");
...
  
// 服務(wù)提供者協(xié)議配置
ProtocolConfig protocol = new ProtocolConfig();
protocol.setName("dubbo");
protocol.setPort(12345);
protocol.setThreads(200);
...
  
// 配置中心
ConfigCenterConfig configCenter = new ConfigCenterConfig();
configCenter.setAddress("zookeeper://192.168.10.2:2181");
...
  
// 元數(shù)據(jù)中心
MetadataReportConfig metadataReport = new MetadataReportConfig();
metadataReport.setAddress("zookeeper://192.168.10.3:2181");
...
  
// Metrics
MetricsConfig metrics = new MetricsConfig();
metrics.setProtocol("dubbo");
...
  
// SSL
SslConfig ssl = new SslConfig();
ssl.setServerKeyCertChainPath("/path/ssl/server-key-cert-chain");
ssl.setServerPrivateKeyPath("/path/ssl/server-private-key");
...
  
// Provider配置(ServiceConfig默認(rèn)配置)
ProviderConfig provider = new ProviderConfig();
provider.setGroup("demo");
provider.setVersion("1.0.0");
...
  
// Consumer配置(ReferenceConfig默認(rèn)配置)
ConsumerConfig consumer = new ConsumerConfig();
consumer.setGroup("demo");
consumer.setVersion("1.0.0");
consumer.setTimeout(2000);
...
  
DubboBootstrap.getInstance()
    .application("demo-app")
    .registry(registry)
    .protocol(protocol)
    .configCenter(configCenter)
    .metadataReport(metadataReport)
    .module(new ModuleConfig("module"))
    .metrics(metrics)
  	.ssl(ssl)
  	.provider(provider)
  	.consumer(consumer)
  	...
  	.start();

方法級設(shè)置

...
 
// 方法級配置
List<MethodConfig> methods = new ArrayList<MethodConfig>();
MethodConfig method = new MethodConfig();
method.setName("sayHello");
method.setTimeout(10000);
method.setRetries(0);
methods.add(method);
 
// 引用遠(yuǎn)程服務(wù)
ReferenceConfig<DemoService> reference = new ReferenceConfig<DemoService>(); // 此實例很重,封裝了與注冊中心的連接以及與提供者的連接,請自行緩存,否則可能造成內(nèi)存和連接泄漏
...
reference.setMethods(methods); // 設(shè)置方法級配置
 
...

點對點直連

...

// 此實例很重,封裝了與注冊中心的連接以及與提供者的連接,請自行緩存,否則可能造成內(nèi)存和連接泄漏
ReferenceConfig<DemoService> reference = new ReferenceConfig<DemoService>(); 
// 如果點對點直連,可以用reference.setUrl()指定目標(biāo)地址,設(shè)置url后將繞過注冊中心,
// 其中,協(xié)議對應(yīng)provider.setProtocol()的值,端口對應(yīng)provider.setPort()的值,
// 路徑對應(yīng)service.setPath()的值,如果未設(shè)置path,缺省path為接口名
reference.setUrl("dubbo://10.20.130.230:20880/com.xxx.DemoService"); 
 
...


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號