Dubbo Configuration


可配置參數

http://dubbo.apache.org/zh-cn/docs/user/references/xml/introduction.html

 

與 spring 整合的幾種方式

SpringBoot 與 dubbo 整合的三種方式:

http://dubbo.apache.org/zh-cn/docs/user/configuration/annotation.html
1)、導入 dubbo-starter,在 application.properties 中配置屬性
	 使用 @Service【暴露服務】使用 @Reference【引用服務】使用 @EnableDubbo【開啟掃描,相當於配置 dubbo.scan.base-packages】

http://dubbo.apache.org/zh-cn/docs/user/configuration/xml.html
2)、導入 dubbo-starter,保留 dubbo xml 配置文件(這樣可保留方法級別的配置)
	 在啟動類上使用 @ImportResource(locations="classpath:dubbo.xml") 導入 dubbo 的配置文件即可

http://dubbo.apache.org/zh-cn/docs/user/configuration/api.html
3)、使用注解 API 的方式,將每一個組件手動創建到容器中,讓 dubbo 來掃描其他的組件

 API 方式配置例子,使用 @Service【暴露服務】使用 @Reference【引用服務】使用【@EnableDubbo】配置 Dubbo 掃描,開啟基於注解的 dubbo 功能

package com.gmall.config;

import java.util.ArrayList;
import java.util.List;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.MethodConfig;
import com.alibaba.dubbo.config.MonitorConfig;
import com.alibaba.dubbo.config.ProtocolConfig;
import com.alibaba.dubbo.config.ProviderConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.config.ServiceConfig;
import com.gmall.service.UserService;

@EnableDubbo(scanBasePackages="com.gmall")
@Configuration
public class MyDubboConfig {
    
    @Bean
    public ApplicationConfig applicationConfig() {
        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName("boot-user-service-provider");
        return applicationConfig;
    }
    
    //<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"></dubbo:registry>
    @Bean
    public RegistryConfig registryConfig() {
        RegistryConfig registryConfig = new RegistryConfig();
        registryConfig.setProtocol("zookeeper");
        registryConfig.setAddress("127.0.0.1:2181");
        return registryConfig;
    }
    
    //<dubbo:protocol name="dubbo" port="20882"></dubbo:protocol>
    @Bean
    public ProtocolConfig protocolConfig() {
        ProtocolConfig protocolConfig = new ProtocolConfig();
        protocolConfig.setName("dubbo");
        protocolConfig.setPort(20882);
        return protocolConfig;
    }
    
    /**
    <dubbo:service interface="com.gmall.service.UserService" ref="userServiceImpl01" timeout="1000" version="1.0.0">
        <dubbo:method name="getUserAddressList" timeout="1000"/>
    </dubbo:service>
     */
    @Bean
    public ServiceConfig<UserService> userServiceConfig(UserService userService){
        ServiceConfig<UserService> serviceConfig = new ServiceConfig<>();
        serviceConfig.setInterface(UserService.class);
        serviceConfig.setRef(userService);
        serviceConfig.setVersion("1.0.0");
        
        //配置每一個method的信息
        MethodConfig methodConfig = new MethodConfig();
        methodConfig.setName("getUserAddressList");
        methodConfig.setTimeout(1000);
        
        //將method的設置關聯到service配置中
        List<MethodConfig> methods = new ArrayList<>();
        methods.add(methodConfig);
        serviceConfig.setMethods(methods);
        
        //ProviderConfig
        //MonitorConfig
        
        return serviceConfig;
    }
}
View Code

 

配置優先級

http://dubbo.apache.org/zh-cn/docs/user/configuration/configuration-load-process.html

JVM參數配置 > 外部化配置 > 代碼配置 > 配置文件((dubbo.xml || application.properties) >  (dubbo.properties 通常寫公共屬性配置))

 

啟動時檢查

http://dubbo.apache.org/zh-cn/docs/user/demos/preflight-check.html

Dubbo 默認會在啟動時檢查依賴的服務是否可用,不可用時會拋出異常,阻止 Spring 初始化完成。

<!--關閉某個服務的啟動時檢查 (沒有提供者時報錯)-->
<dubbo:reference interface="com.foo.BarService" check="false"/>
<!--關閉所有服務的啟動時檢查 (沒有提供者時報錯)-->
<dubbo:consumer check="false"/>
<!--關閉注冊中心啟動時檢查 (注冊訂閱失敗時報錯)-->
<dubbo:registry check="false"/>

 

超時設置(timeout),默認為一秒(1000ms)

消費者與提供者之間方法調用的時間,超過則會拋出異常,提供者與消費者都可配置,具體生效依據不同粒度配置的覆蓋關系,消費方默認超時時間取自提供方。

建議由服務提供方設置超時,因為一個方法需要執行多長時間,服務提供方更清楚,如果一個消費方同時引用多個服務,就不需要關心每個服務的超時設置。

http://dubbo.apache.org/zh-cn/docs/user/references/xml/dubbo-reference.html

<!-- 
    1)、精確優先 (方法級優先,接口級次之,全局配置再次之)
    2)、消費者設置優先(如果級別一樣,則消費方優先,提供方次之)
-->

<!--提供方設置-->
<dubbo:service interface="org.apache.dubbo.demo.DemoService" ref="demoService" timeout="1000"/>

<!--提供方設置,精確到方法-->
<dubbo:service interface="org.apache.dubbo.demo.DemoService" ref="demoService">
    <dubbo:method name="sayHello" timeout="1000"/>
</dubbo:service>

<!--所有提供方默認設置-->
<dubbo:provider timeout="1000"/>

 

不同粒度配置的覆蓋關系

http://dubbo.apache.org/zh-cn/docs/user/configuration/xml.html

以 timeout 為例,下圖顯示了配置的查找順序,其它 retries, loadbalance, actives 等類似:

  • 方法級優先,接口級次之,全局配置再次之。
  • 如果級別一樣,則消費方優先,提供方次之。

其中,服務提供方配置,通過 URL 經由注冊中心傳遞給消費方。

 

重試次數(retries),默認為 2 ,不包含第一次調用,即一共會調用 3 次

消費方默認重試次數設置取自提供方,設置方式與超時設置類似。

http://dubbo.apache.org/zh-cn/docs/user/references/xml/dubbo-service.html

<!-- retries="":重試次數,不包含第一次調用,0代表不重試
冪等操作(可設置重試次數)【如查詢、刪除、修改】,執行多少次產生的效果一樣
非冪等操作(不能設置重試次數)【如新增】
如果該服務有多個,那么當前服務出錯后,會重試其它機器上相同的服務,不會一直調用相同地址上的服務
-->

<!--提供方設置,精確到方法-->
<dubbo:service interface="org.apache.dubbo.demo.DemoService" ref="demoService">
    <dubbo:method name="sayHello" retries="3"/>
</dubbo:service>

 

多版本設置(灰度發布)

http://dubbo.apache.org/zh-cn/docs/user/demos/multi-versions.html

當一個接口實現,出現不兼容升級時,可以用版本號過渡,版本號不同的服務相互間不引用。

可以按照以下的步驟進行版本遷移:

  1. 在低壓力時間段,先升級一半提供者為新版本
  2. 再將所有消費者升級為新版本
  3. 然后將剩下的一半提供者升級為新版本
<!--老版本服務提供者配置-->
<dubbo:service interface="com.foo.BarService" version="1.0.0" />
<!--新版本服務提供者配置-->
<dubbo:service interface="com.foo.BarService" version="2.0.0" />

<!--老版本服務消費者配置-->
<dubbo:reference id="barService" interface="com.foo.BarService" version="1.0.0" />
<!--新版本服務消費者配置-->
<dubbo:reference id="barService" interface="com.foo.BarService" version="2.0.0" />

<!--如果不需要區分版本,可以按照以下的方式配置-->
<dubbo:reference id="barService" interface="com.foo.BarService" version="*" />

 

本地存根

http://dubbo.apache.org/zh-cn/docs/user/demos/local-stub.html

消費者在調用提供者之前可以做一些操作,來決定要不要調用提供者(就是為具體實現創建一個代理對象)

以之前的 HelloWord 為例,為 DemoService 創建本地存根(一般在接口項目中創建)

package org.apache.dubbo.demo;

public class DemoServiceStub implements DemoService {

    private final DemoService demoService;

    // 構造函數傳入真正的遠程代理對象
    public DemoServiceStub(DemoService demoService){
        this.demoService = demoService;
    }

    @Override
    public String sayHello(String name) {
        // 此代碼在客戶端執行, 你可以在客戶端做ThreadLocal本地緩存,或預先驗證參數是否合法,等等
        try {
            System.out.println("DemoServiceStub.....");
            return demoService.sayHello(name);
        } catch (Exception e) {
            // 你可以容錯,可以做任何AOP攔截事項
            return "容錯數據";
        }
    }
}

配置,消費方和提供方都可以配置,這里在消費方配置。

<dubbo:reference id="demoService" interface="org.apache.dubbo.demo.DemoService" stub="org.apache.dubbo.demo.consumer.DemoServiceStub"/>

<!--或者-->
<dubbo:reference id="demoService" interface="org.apache.dubbo.demo.DemoService" stub="true"/>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM