spring-boot整合dubbo相關(guān)知識點補充
前言
昨天我們分享了spring-boot整合dubbo的相關(guān)內(nèi)容,不過準(zhǔn)確地說,應(yīng)該是和spring整合,因為我們其實并沒有用dubbo的starter,而是通過注解的方式把dubbo的相關(guān)配置注入到spring的ioc容器中。
這種方式只是省去了xml配置的繁瑣配置,改成了注解的方式,本質(zhì)上只能算web層面的集成,因為spring-boot的核心在stater,starter的核心在自動配置,關(guān)于定制自己的spring-starter我們前面有分享過,感興趣的小伙伴可以去看下:
不過,這對不喜歡xml配置的小伙伴來說(我算其中有一個,當(dāng)然xml有其優(yōu)勢),已經(jīng)算福音了。好了,廢話就說這么多,今天我們來對昨天的內(nèi)容做一個簡單的補充說明,由于昨天的內(nèi)容過于繁雜,而且內(nèi)容有點多,好多細節(jié)的知識點,沒有在展開說明,下面我們就來對這些知識點做一個說明。
dubbo內(nèi)容補充
配置
dubbo的配置主要有三部分,一部分是注冊中心的相關(guān)配置,一部分是應(yīng)用本身的配置,另外一部分是注冊中心的配置。今天主要說明前兩種配置,注冊中心的配置暫時先不講。
服務(wù)注冊配置
服務(wù)注冊的配置還是比較多的,下面是RegistryConfig的屬性:
// 注冊中心地址
private String address;
// 注冊中心用戶名
private String username;
// 注冊中心登錄密碼
private String password;
// 注冊中心端口
private Integer port;
// 注冊中心協(xié)議
private String protocol;
// 網(wǎng)絡(luò)傳輸類型
private String transporter;
// 具體作用不詳
private String server;
// 注冊中心客戶端類型
private String client;
/**
* 集群類型
* 影響流量在注冊中心之間的分布方式,在訂閱多個注冊中心時非常有用,可用選項:
* 1.zone-aware,根據(jù)流量的來源,特定類型的流量始終進入一個注冊表。
*/
private String cluster;
/**
* 注冊中心所屬的區(qū)域,通常用于隔離流量
*/
private String zone;
/**
* 服務(wù)所屬組
*/
private String group;
/**
* 服務(wù)版本
*/
private String version;
/**
* 注冊中心請求超時時間,單位毫秒
*/
private Integer timeout;
/**
* 注冊中心會話超時時間,單位毫秒
*/
private Integer session;
/**
* 保存注冊中心動態(tài)列表的文件
*/
private String file;
/**
* 停止服務(wù)等待時間
*/
private Integer wait;
/**
* 啟動時是否檢查注冊中心是否可用
*/
private Boolean check;
/**
* 是否允許動態(tài)服務(wù)在注冊中心注冊
*/
private Boolean dynamic;
/**
* 是否在注冊中心導(dǎo)出服務(wù)
*/
private Boolean register;
/**
* 是否允許在注冊中心訂閱服務(wù)
*/
private Boolean subscribe;
/**
* 自定義參數(shù)
*/
private Map<String, String> parameters;
/**
* 是否為默認(rèn)注冊中心
*/
private Boolean isDefault;
/**
* 簡化注冊。對提供者和使用者都很有用
*
* @since 2.7.0
*/
private Boolean simplified;
/**
* 簡化注冊表后,應(yīng)單獨添加一些參數(shù)。僅限服務(wù)提供者
* <p>
* such as: extra-keys = A,b,c,d
*
* @since 2.7.0
*/
private String extraKeys;
/**
* 該地址是否作為配置中心工作
*/
private Boolean useAsConfigCenter;
/**
* 該地址是否用作遠程元數(shù)據(jù)中心
*/
private Boolean useAsMetadataCenter;
/**
* 此注冊中心接受的rpc協(xié)議列表,例如,“dubbo,rest”
*/
private String accepts;
/**
* 如果設(shè)置為true,則始終首先使用此注冊中心,在訂閱多個注冊表時非常有用
*/
private Boolean preferred;
/**
* 請求權(quán)重(集群)
* 影響注冊中心間的流量分布,在訂閱多個注冊中時非常有用
* 僅在未指定首選注冊表時生效。
*/
private Integer weight;
以上配置只有address和client是必須配置的,其余的都是可以不配置的,下面我們選一些常用的屬性簡單介紹下:
address:注冊中心地址,以zk為例的話,就是:zookeeper://127.0.0.1:2181;client:客戶端類型,對2.7.1之后的版本,如果注冊中心是zkd的話,只能是curatorusername和password:這個應(yīng)該不用解釋了,zk應(yīng)該不用配置這個port:這個端口,目前沒發(fā)現(xiàn)有啥用,畢竟地址里面已經(jīng)包含端口了protocol:注冊中心支持的協(xié)議類型,我發(fā)現(xiàn)dubbo支持的類型還挺多的,包括dubbo、rest、http、redis等,具體大家可以看下圖:
transporter:網(wǎng)絡(luò)傳輸協(xié)議也比較多,默認(rèn)應(yīng)該是netty,因為dubbo默認(rèn)引入了netty的包

group:注冊的服務(wù)默認(rèn)情況下(不指定group)所屬服務(wù)組。通常我們在注冊服務(wù)的時候,會指定服務(wù)所屬服務(wù)組,如果你不指定所屬服務(wù)組,則會取當(dāng)前設(shè)置的值,這個配置的默認(rèn)值目前還沒研究
version:這個配置和group類似,不過這個設(shè)定的是服務(wù)的版本,如果不指定就會取該值,這個值可以在服務(wù)注冊時設(shè)定,但是設(shè)定的只是單個服務(wù)的版本
timeout:這個設(shè)置的是rpc請求的超時時間,也是個默認(rèn)值,這個值可以在服務(wù)注冊的時候指定,如果你不指定,就會取這個值
應(yīng)用配置
/**
* 應(yīng)用名稱
*/
private String name;
/**
* 應(yīng)用版本
*/
private String version;
/**
* 應(yīng)用所屬者
*/
private String owner;
/**
* 應(yīng)用所屬組織
*/
private String organization;
/**
* 應(yīng)用架構(gòu)
*/
private String architecture;
/**
* 環(huán)境 例如:dev 、test 或者 production
*/
private String environment;
/**
* Java 編譯版本
*/
private String compiler;
/**
* 日志等級
*/
private String logger;
/**
* 注冊中心列表
*/
private List<RegistryConfig> registries;
private String registryIds;
/**
* 監(jiān)控中心
*/
private MonitorConfig monitor;
/**
* 是否為默認(rèn)
*/
private Boolean isDefault;
/**
* thread dump保存地址
*/
private String dumpDirectory;
/**
* 是否啟用qos
*/
private Boolean qosEnable;
/**
* qos監(jiān)聽主機地址
*/
private String qosHost;
/**
* qos監(jiān)聽端口
*/
private Integer qosPort;
/**
* 是否允許外網(wǎng)訪問
*/
private Boolean qosAcceptForeignIp;
/**
* 自定義參數(shù)
*/
private Map<String, String> parameters;
/**
* 服務(wù)停止等待時間
*/
private String shutwait;
private String hostname;
/**
* 元數(shù)據(jù)類型:local 或者 remote, 如果選擇remote, 還需要指定元數(shù)據(jù)中心
*/
private String metadataType;
private Boolean registerConsumer;
private String repository;
應(yīng)用配置,只有name是必須的,其他都是非必須的。注釋也很詳細了,這里就不作過多說明了。
消費者配置
消費者的配置和提供者配置一樣,所以這里我們就不再贅述。
注入配置
前天我們的演示實例中,我們是直接把配置項寫死的,今天我們來看下如何通過配置文件設(shè)定我我們的配置。
首先,我們在spring-boot的appliaction.properties中加入dubbo的配置:
# dubbo應(yīng)用配置
# dubbo應(yīng)用名稱
application.dubbo.application.name=dubbo-server
# dubbo注冊配置
# dubbo注冊中心地址
application.dubbo.registry.address=zookeeper://127.0.0.1:2181
# dubbo注冊中心類型
application.dubbo.registry.client=curator
#application.dubbo.registry.username=dubbo
#application.dubbo.registry.password=dubbo
#application.dubbo.registry.port=20880
#application.dubbo.registry.protocol=20880
#application.dubbo.registry.transporter=20880
#application.dubbo.registry.cluster=20880d
#application.dubbo.registry.zone=20880d
#application.dubbo.registry.group=20880d
#application.dubbo.registry.version=1.0
#application.dubbo.registry.timeout=60000
#application.dubbo.registry.session=30000
#application.dubbo.registry.file=20880d
#application.dubbo.registry.wait=30000
#application.dubbo.registry.check=true
#application.dubbo.registry.dynamic=true
#application.dubbo.registry.register=true
#application.dubbo.registry.subscribe=true
#application.dubbo.registry.parameters.name=syske
#application.dubbo.registry.default=true
#application.dubbo.registry.simplified=true
#application.dubbo.registry.extraKeys=true
#application.dubbo.registry.useAsConfigCenter=true
#application.dubbo.registry.useAsMetadataCenter=true
#application.dubbo.registry.accepts=true
#application.dubbo.registry.preferred=true
#application.dubbo.registry.weight=10
然后在dubbo的配置類,加入如下代碼:
@Bean
@ConfigurationProperties(ignoreUnknownFields = false, prefix = "application.dubbo.application")
public ApplicationConfig applicationConfig() {
ApplicationConfig applicationConfig = new ApplicationConfig();
return applicationConfig;
}
@Bean
@ConfigurationProperties(ignoreUnknownFields = false, prefix = "application.dubbo.registry")
public RegistryConfig registryConfig() {
RegistryConfig registryConfig = new RegistryConfig();
return registryConfig;
}
這里簡單介紹下,@ConfigurationProperties注解可以和@Bean組合使用,這樣在創(chuàng)建bean的時候,就可以把我們的配置文件直接注入到我們bean的屬性中,確實也很方便。
需要注意的是,prefix的前綴必須與properties中的配置相對應(yīng),否則配置無法被注入。
另一個需要注意的是,如果配置項是isXXX,則需要確認(rèn)isXXX的設(shè)置方法是否是setIsXXX,如果是,properties配置就可以寫成isXXX,總之要和set方法一致,否則會報錯:

注解
注解這塊主要有兩個注解注解比較重要,一個@DubboService,一個是@Reference。
DubboService
@DubboService注解是2.7.7引入的,其主要作用就是為了標(biāo)記和配置服務(wù)提供者,它的前任是@Service,這個注解也算是個新人,它是2.7.0引入的,從注解屬性上看,他們沒有本質(zhì)區(qū)別,@Service目前已經(jīng)被棄用,我猜測棄用應(yīng)該是注解名稱太容易被混淆了,不利于服務(wù)代碼開發(fā)維護,畢竟spring的原生注解也就@Service:

文檔也說的很清楚,DubboService是Serivce的繼任者。

DubboReference
@Reference注解也是dubbo 2.7.7引入的,主要是用來發(fā)現(xiàn)服務(wù)的,也就是標(biāo)記服務(wù)消費者。這個注解的繼任者是Reference,也是2.7.0引入的。


說明,在dubbo 2.7.0之前的版本是不支持注解式配置,而且我發(fā)現(xiàn)2.7.0以前的版本是屬于com.alibaba這個groupId的,之后的版本是org.apache.dubbo這個groupId的,這是因為在2.7.0之后,阿里巴巴把dubbo捐獻給apache基金會了,現(xiàn)在它是apache旗下的頂級項目之一。


總結(jié)
dubbo的知識點還是比較多的,算上今天我們補充的內(nèi)容,我們目前已經(jīng)分享的內(nèi)容也只能算冰山一角的一角,但是到今天我們也算對dubbo有了一個最基本的認(rèn)知了,從項目創(chuàng)建,到項目啟動,再到項目配置,整個流程我們應(yīng)該已經(jīng)比較熟悉了,如果有小伙伴已經(jīng)忘記了,可以回顧下之前的內(nèi)容,至于其他更復(fù)雜的配置和高級用法,我們在后面的學(xué)習(xí)過程中,會繼續(xù)分享,繼續(xù)深挖。好了,今天的內(nèi)容就到這里吧!
