可配置參數
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; } }
配置優先級
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
當一個接口實現,出現不兼容升級時,可以用版本號過渡,版本號不同的服務相互間不引用。
可以按照以下的步驟進行版本遷移:
- 在低壓力時間段,先升級一半提供者為新版本
- 再將所有消費者升級為新版本
- 然后將剩下的一半提供者升級為新版本
<!--老版本服務提供者配置--> <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"/>