Dubbo基本用法-Dubbo Provider配置 原 薦

Dubbo基本用法

本章節主要講述如何配置dubbo,按照配置方式上分,可以分爲:XML配置,properties方式配置,註解方式配置,API調用方式配置。

按照功能角度進行劃分,可以分爲Dubbo Provider和Dubbo Consumer。接下來章節中,分別對dubbo provider和Dubbo consumer進行講解。

Dubbo Provider配置

Provider 配置詳解

配置Dubbo Provider有4種方式:XML配置,properties方式配置,API調用方式配置,註解方式配置。

XML配置

最簡單的配置的樣例:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org
/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd"> 
<dubbo:application name="hello-world-app" /> 
<dubbo:registry address="multicast://224.5.6.7:1234" /> 
<dubbo:protocol name="dubbo" port="20880" /> 
<dubbo:service interface="com.alibaba.dubbo.demo.
DemoService" ref="demoServiceLocal" /> 
<dubbo:reference id="demoServiceRemote" interface="com.alibaba.dubbo.demo.DemoService" /> 
</beans>

 

上面樣例中,注意下dubbo schema的寫法:

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org
/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

 

支持的配置標籤

配置之間關係圖

配置項詳解

<dubbo:application name=”hello-world-app” />

用於指定應用名,這裏需要保證應用名唯一,這個應用名在後續的console admin中可以在列表中顯示,方便管理。

<dubbo:registry address=”multicast://224.5.6.7:1234” />

註冊中心配置,和服務發現的具體機制有關係。可以是zookeeper地質,也可以eureka地質。上面這個是廣播地址,在本地服務調用的測試過程中非常方便。

<dubbo:protocol name=”dubbo” port=”20880” />

這裏是傳輸的協議和默認端口,一般不需要更改。

接下來重點講解下<dubbo:service/>的配置。

<dubbo:service/>支持的主要屬性列表:

| 屬性名 | 說明 |

| ——– | —– |

| version | 版本號 |

| scope | 服務可見性, 值爲:local 或者 remote,默認爲remote |

| actives | 最大的激活的請求數 |

| async | 方法調用是否異步,默認爲false |

| cache | 服務緩存,可選值:lru/threadlocal/jcache |

| callbacks | callback實例的限制 |

| generic | 泛化調用,可以繞過 |

| class | Service的實現的類名 |

| connections | 這個服務裏的連接數 |

| delay | 發佈服務延遲的毫秒數 |

| executes | 服務執行的請求上限 |

| retries | 超時重試次數 |

| timeout | 調用超時時間 |

其他配置屬性請參考xsd:http://dubbo.apache.org/schema/dubbo/dubbo.xsd

<dubbo:method/>作爲<dubbo:service/>的子元素,它可以針對方法進行配置。比較常用的屬性有:

其他屬性,可以參考上面的xsd。

配置的覆蓋關係

配置的覆蓋關係圖

這裏的覆蓋關係包含了Provider和Consumer兩端的配置,如果對consumer有疑問,可以參考後一章節的consumer章節之後再來理解。

dubbo.properties方式配置

如果公共配置很簡單,沒有多註冊中心,多協議等情況,或者想多個 Spring 容器想共享配置,可以使用 dubbo.properties 作爲缺省配置。

Dubbo 將自動加載 classpath 根目錄下的 dubbo.properties,可以通過JVM啓動參數 -Ddubbo.properties.file=xxx.properties 改變缺省配置位置。

dubbo.properties配置樣例

 

映射規則

將 XML 配置的標籤名,加屬性名,用點分隔,多個屬性拆成多行

比如:dubbo.application.name=foo等價於<dubbo:application name=”foo” />

比如:dubbo.registry.address=10.20.153.10:9090等價於<dubbo:registry address=”10.20.153.10:9090” />

如果 XML 有多行同名標籤配置,可用 id 號區分,如果沒有 id 號將對所有同名標籤生效

比如:dubbo.protocol.rmi.port=1234等價於<dubbo:protocol id=”rmi” name=”rmi” port=”1099” /> 2

比如:dubbo.registry.china.address=10.20.153.10:9090等價於<dubbo:registry id=”china” address=”10.20.153.10:9090” />

 

覆蓋策略

 

JVM 啓動 -D 參數優先,這樣可以使用戶在部署和啓動時進行參數重寫,比如在啓動時需改變協議的端口。

XML 次之,如果在 XML 中有配置,則 dubbo.properties 中的相應配置項無效。

Properties 最後,相當於缺省值,只有 XML 沒有配置時,dubbo.properties 的相應配置項纔會生效,通常用於共享公共配置,比如應用名。

注意:

1.如果 classpath 根目錄下存在多個 dubbo.properties,比如多個 jar 包中有 dubbo.properties,Dubbo 會任意加載,並打印 Error 日誌,後續可能改爲拋異常。 

2.協議的 id 沒配時,缺省使用協議名作爲 id

annotation

Service註解暴露服務

import com.alibaba.dubbo.config.annotation.Service; 

@Service(timeout = 5000)
public class AnnotateServiceImpl implements AnnotateService { 
// ...
}

 

javaconfig形式配置公共模塊

@Configuration
public class DubboConfiguration { 
@Bean
public ApplicationConfig applicationConfig() {
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setName("provider-test");
return applicationConfig;
}

@Bean
public RegistryConfig registryConfig() {
RegistryConfig registryConfig = new RegistryConfig();
registryConfig.setAddress("zookeeper://127.0.0.1:2181");
registryConfig.setClient("curator");
return registryConfig;
}
}

 

這種方式的配置和前面用xml配置的方式是一樣的效果。

 

指定dubbo掃描路徑

@SpringBootApplication
@DubboComponentScan(basePackages = "com.alibaba.dubbo.test.service.impl")
public class ProviderTestApp {
// ...
}

 

或者使用spring bean xml配置方式:

 

 

 

<dubbo:annotation package="com.chanshuyi.service.impl" />

 

api直接觸發

import com.alibaba.dubbo.rpc.config.ApplicationConfig;
import com.alibaba.dubbo.rpc.config.RegistryConfig;
import com.alibaba.dubbo.rpc.config.ProviderConfig;
import com.alibaba.dubbo.rpc.config.ServiceConfig;
import com.xxx.XxxService;
import com.xxx.XxxServiceImpl;

// 服務實現
XxxService xxxService = new XxxServiceImpl();

// 當前應用配置
ApplicationConfig application = new ApplicationConfig();
application.setName("xxx");

// 連接註冊中心配置
RegistryConfig registry = new RegistryConfig();
registry.setAddress("10.20.130.230:9090");
registry.setUsername("aaa");
registry.setPassword("bbb");

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

// 注意:ServiceConfig爲重對象,內部封裝了與註冊中心的連接,以及開啓服務端口

// 服務提供者暴露服務配置
ServiceConfig<XxxService> service = new ServiceConfig<XxxService>(); // 此實例很重,封裝了與註冊中心的連接,請自行緩存,否則可能造成內存和連接泄漏
service.setApplication(application);
service.setRegistry(registry); // 多個註冊中心可以用setRegistries()
service.setProtocol(protocol); // 多個協議可以用setProtocols()
service.setInterface(XxxService.class);
service.setRef(xxxService);
service.setVersion("1.0.0");

// 暴露及註冊服務
service.export();

 

一般在spring應用中,不推薦使用這種方式。 具體的含義這裏不做解釋,可以通過github查看源碼。

在此我向大家推薦一個架構學習交流羣。交流學習羣號:478030634  裏面會分享一些資深架構師錄製的視頻錄像:有Spring,MyBatis,Netty源碼分析,高併發、高性能、分佈式、微服務架構的原理,JVM性能優化、分佈式架構等這些成爲架構師必備的知識體系。還能領取免費的學習資源,目前受益良多 

Provider 接口和實現

上面章節更多從配置角度出發,接下來通過一個完整的例子,來講解下dubbo provider的完整使用。

這個例子中只有一個服務UserReadService,有一個方法 getUserById。 需要將這個服務通過Dubbo暴露給遠程的服務。具體的步驟如下:

1.創建工程

如果本來已經有工程,可以忽略。創建一個spring boot工程,可以通過 https://start.spring.io/ 創建。

2.定義接口

定義接口:UserReadService

public interface UserReadService{
public User getUserById(Long userId);
}

這個接口一般來說會放到獨立的jar包裏,作爲client包。 其他應用要消費這個服務的時候,一般來說需要應用引用這個client包。(除了泛化調用)

3.實現接口

實現UserReadService, 當前實現部署在Provider的應用中。

public UserReadServiceImpl implements UserReadService{
public User getUserById(Long userId){
return xxx;
}
}

 

4.Dubbo配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/
schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd"> 
<dubbo:application name="hello-world-app" /> 
<dubbo:registry address="multicast://224.5.6.7:1234" /> 
<dubbo:protocol name="dubbo" port="20880" /> 
<bean id="userReadService" class="com.package.UserReadServiceImpl"/>
<dubbo:service interface="com.package.UserReadService" ref="userReadService" /> 
</beans>

 

大家可以關注一下我個人自己的公衆號:《Java爛豬皮》 。公衆號聊的不僅僅是Java技術知識,還有面試等乾貨,後期還有大量架構乾貨。大家一起關注吧!關注爛豬皮,你會了解的更多.............. 

 

原文:https://blog.csdn.net/yunzhaji3762/article/details/82974653

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章