javascript
dubbo protocol port 消费者端_企业级 SpringBoot 与 Dubbo 的并用
點擊上方“匠心零度”,選擇“設(shè)為星標(biāo)”
做積極的人,而不是積極廢人
作者:SimpleWu
cnblogs.com/SimpleWu/p/10833555.html
SpringBoot?和 Dubbo?又能碰撞出什么火花呢?我們來看看企業(yè)級 SpringBoot 與 Dubbo 的并用。
版本:
Springboot2.x
Double2.6
Zk3.4.14
JDK8
這里就不介紹Dubbo了,不了解的可以看這里:
https://www.cnblogs.com/SimpleWu/p/9769797.html
zookeepr安裝
下載去官網(wǎng)查找穩(wěn)定的版本進行使用:
http://www.apache.org/dyn/closer.cgi/zookeeper/
先在服務(wù)器上安裝zookeeper。
cd?/usr/local/src/#下載
sudo?wget?http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
#解壓
tar?-zxvf?zookeeper-3.4.14.tar.gz
#修改配置文件名稱
mv?conf/zoo_sample.cfg?zoo.cfg
#啟動zk
./bin/zkServer.sh?start
#出現(xiàn)以下字樣代表啟動成功,默認(rèn)端口2181
Starting?zookeeper?...?STARTED
SpringBoot2.x整合Dubbo
父工程搭建(pom工程)
<groupId>com.simple.springbootgroupId>????<artifactId>yun-doubleartifactId>
????<version>0.0.1-SNAPSHOTversion>
<packaging>pompackaging>
<name>yun-doublename>
<description>doubledescription>
<properties>
????<java.version>1.8java.version>
????<double.version>2.0.0double.version>
????<zkclient.version>0.10zkclient.version>
properties>
<parent>
????????<groupId>org.springframework.bootgroupId>
????????<artifactId>spring-boot-starter-parentartifactId>
????????<version>2.1.4.RELEASEversion>
????????<relativePath/>
parent>
<dependencyManagement>
????<dependencies>
????????<dependency>
????????????<groupId>com.alibaba.spring.bootgroupId>
????????????<artifactId>dubbo-spring-boot-starterartifactId>
????????????<version>${double.version}version>
????????dependency>
????????<dependency>
????????????<groupId>com.101tecgroupId>
????????????<artifactId>zkclientartifactId>
????????????<version>${zkclient.version}version>
????????dependency>
????dependencies>
dependencyManagement>
創(chuàng)建公共接口工程common
該工程用于存儲服務(wù)層接口,以減少代碼的冗余。
<modelVersion>4.0.0modelVersion><parent>
????<groupId>com.simple.springbootgroupId>
????<artifactId>yun-doubleartifactId>
????<version>0.0.1-SNAPSHOTversion>
parent>
<groupId>com.simple.springbootgroupId>
<artifactId>commonartifactId>
<version>0.0.1-SNAPSHOTversion>
<name>commonname>
<description>公共接口description>
創(chuàng)建公共接口
public?interface?UserService?{????String?getUserById(int?id);
}
創(chuàng)建服務(wù)提供者(provider)
Pom文件
<modelVersion>4.0.0modelVersion><groupId>com.simple.springbootgroupId>
<artifactId>providerartifactId>
<version>0.0.1-SNAPSHOTversion>
<packaging>jarpackaging>
<name>providername>
<description>生產(chǎn)者description>
<parent>
????<groupId>com.simple.springbootgroupId>
????<artifactId>yun-doubleartifactId>
????<version>0.0.1-SNAPSHOTversion>
parent>
<dependencies>
????
????<dependency>
????????<groupId>com.alibaba.spring.bootgroupId>
????????<artifactId>dubbo-spring-boot-starterartifactId>
????dependency>
????
????<dependency>
????????<groupId>com.101tecgroupId>
????????<artifactId>zkclientartifactId>
????????
????????<exclusions>
????????????<exclusion>
????????????????<groupId>log4jgroupId>
????????????????<artifactId>log4jartifactId>
????????????exclusion>
????????????<exclusion>
????????????????<groupId>org.slf4jgroupId>
????????????????<artifactId>slf4j-apiartifactId>
????????????exclusion>
????????????<exclusion>
????????????????<groupId>org.slf4jgroupId>
????????????????<artifactId>slf4j-log4j12artifactId>
????????????exclusion>
????????exclusions>
????dependency>
????
????<dependency>
????????<groupId>com.simple.springbootgroupId>
????????<artifactId>commonartifactId>
????????<version>0.0.1-SNAPSHOTversion>
????dependency>
dependencies>
<build>
????<plugins>
????????<plugin>
????????????<groupId>org.springframework.bootgroupId>
????????????<artifactId>spring-boot-maven-pluginartifactId>
????????plugin>
????plugins>
build>
在pom文件中我們需要引入Dubbo,Zk客戶端并且引入公共接口工程
application.properties配置文件
#dubbo.application.name?應(yīng)用名稱#dubbo.registry.address?注冊中心地址
#dubbo.protocol.name?協(xié)議名稱
#dubbo.protocol.port?協(xié)議端口
#dubbo.scan?dubbo?服務(wù)類包目錄
#server.port=8080
spring.application.name=user-pro
dubbo.application.name=user-provider1
dubbo.registry.address=zookeeper://192.168.197.133:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
在這里dubbo.application.name應(yīng)用名稱一定不能重復(fù)
實現(xiàn)UserService
@Component@Service(timeout?=?10000,interfaceClass?=?UserService.class)
public?class?UserServiceImpl?implements?UserService?{
????@Override
????public?String?getUserById(int?id)?{
????????if(id?==?1)?{
????????????return?"SimpleWu";
????????}else?{
????????????return?"Apache?Dubbo";
????????}
????}
}
@Service 這個注解使用的不是Spring里面的,而是com.alibaba.dubbo.config.annotation.Service
timeout 配置超時時間
interfaceClass 接口類
version 服務(wù)版本,如果配置了服務(wù)版本在消費端引用也必須一樣,具體等會說
創(chuàng)建啟動類
在該工程中我們不需要引入Web模塊浪費端口號,只需要這樣寫啟動類
@EnableDubbo@EnableDubboConfiguration
@DubboComponentScan("com.simple.springboot.provider.common.impl")
public?class?ProviderApplication?{
????public?static?void?main(String[]?args)?{
????????SpringApplication?app?=?new?SpringApplication(ProviderApplication.class);
????????app.run(args);
????????//dubbo?Main獨立運行,脫離web容器
????????Main.main(args);
????}
}
@EnableDubbo 啟動Dubbo功能
@EnableDubboConfiguration 啟動Duubbo配置
@DubboComponentScan 掃描提供者實現(xiàn)類
創(chuàng)建服務(wù)消費者(consumer)
POM文件
<modelVersion>4.0.0modelVersion><groupId>com.simple.springbootgroupId>
<artifactId>consumerartifactId>
<version>0.0.1-SNAPSHOTversion>
<name>consumername>
<description>消費者description>
<parent>
????<groupId>com.simple.springbootgroupId>
????<artifactId>yun-doubleartifactId>
????<version>0.0.1-SNAPSHOTversion>
parent>
<dependencies>
????<dependency>
????????<groupId>org.springframework.bootgroupId>
????????<artifactId>spring-boot-starter-webartifactId>
????dependency>
????<dependency>
????????<groupId>org.springframework.bootgroupId>
????????<artifactId>spring-boot-starter-testartifactId>
????dependency>
????
????<dependency>
????????<groupId>com.alibaba.spring.bootgroupId>
????????<artifactId>dubbo-spring-boot-starterartifactId>
????dependency>
????
????<dependency>
????????<groupId>com.101tecgroupId>
????????<artifactId>zkclientartifactId>
????????
????????<exclusions>
????????????<exclusion>
????????????????<groupId>log4jgroupId>
????????????????<artifactId>log4jartifactId>
????????????exclusion>
????????????<exclusion>
????????????????<groupId>org.slf4jgroupId>
????????????????<artifactId>slf4j-apiartifactId>
????????????exclusion>
????????????<exclusion>
????????????????<groupId>org.slf4jgroupId>
????????????????<artifactId>slf4j-log4j12artifactId>
????????????exclusion>
????????exclusions>
????dependency>
????
????<dependency>
????????<groupId>com.simple.springbootgroupId>
????????<artifactId>commonartifactId>
????????<version>0.0.1-SNAPSHOTversion>
????dependency>
dependencies>
<build>
????<plugins>
????????<plugin>
????????????<groupId>org.springframework.bootgroupId>
????????????<artifactId>spring-boot-maven-pluginartifactId>
????????plugin>
????plugins>
build>
在這個工程中我們是需要依賴Web的,不然咋訪問呢
編寫Application.properties配置文件
spring.application.name=user-conserver.port=8080
dubbo.application.name=user-consumer
dubbo.registry.address=zookeeper://192.168.197.133:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
#dubbo.scan=com.simple.springboot.provider.common.impl
在這里dubbo.application.name應(yīng)用名稱一定不能重復(fù),dubbo.scan 該配置指向應(yīng)該是要和服務(wù)提供方一致
編寫Controller
@RestControllerpublic?class?UserController?{
????//timeout?可以不指定,如果提供則有填寫但是version一定要指定?不然會找不到服務(wù)?直連需要加url="dubbo://localhost:20880"
????@Reference
????private?UserService?userService;
????@GetMapping("/dubbo/user/{id}")
????public?String?getUserById(@PathVariable?int?id){
????????return?userService.getUserById(id);
????}
}
在這里是使用@Reference去發(fā)現(xiàn)服務(wù)而不是@Autowired去注入Bean,@Reference 里面可以配置version,timeout超時時間
如果需要Dubbo直連url="dubbo://localhost:20880"
dubbo提供了四種負(fù)載均衡策略,分別是:
1、Random LoadBalance 按權(quán)重的隨機負(fù)載均衡,也是dubbo默認(rèn)的負(fù)載均衡策略
2、RoundRobin LoadBalance 按權(quán)重的輪詢負(fù)載均衡,即在輪詢的基礎(chǔ)上添加了權(quán)重的策略
3、LeastActive LoadBalance 最少活躍調(diào)用數(shù),相同活躍數(shù)的隨機訪問,活躍數(shù)指調(diào)用前后的計數(shù)差即響應(yīng)時間的長短;這種策略可以使響應(yīng)慢的提供者收到的請求較少,大大提供系統(tǒng)性能
4、ConsistentHash LoadBalance 一致性哈希;相同參數(shù)的請求總是發(fā)到同一提供者
負(fù)載均衡的配置:@Reference(loadbalance = "roundrobin"),loadbalance 的值即為四種負(fù)載均衡的名稱,全部小寫
在集群調(diào)用失敗時,Dubbo 提供了多種容錯方案,缺省為 failover 重試。下面列舉dubbo支持的容錯策略:
1、Failover Cluster:失敗自動切換,當(dāng)出現(xiàn)失敗,重試其它服務(wù)器。通常用于讀操作,但重試會帶來更長延遲。可通過 retries="XXX" 來設(shè)置重試次數(shù)(不含第一次)。
2、Failfast Cluster:快速失敗,只發(fā)起一次調(diào)用,失敗立即報錯。通常用于非冪等性的寫操作,比如新增記錄。
3、Failsafe Cluster:失敗安全,出現(xiàn)異常時,直接忽略。通常用于寫入審計日志等操作。
4、Failback Cluster:失敗自動恢復(fù),后臺記錄失敗請求,定時重發(fā)。通常用于消息通知操作。
5、Forking Cluster:并行調(diào)用多個服務(wù)器,只要一個成功即返回。通常用于實時性要求較高的讀操作,但需要浪費更多服務(wù)資源。可通過 forks="2" 來設(shè)置最大并行數(shù)。
6、Broadcast Cluster:廣播調(diào)用所有提供者,逐個調(diào)用,任意一臺報錯則報錯 [2]。通常用于通知所有提供者更新緩存或日志等本地資源信息。
配置如下:@Reference(cluster = "failsafe")這里表示使用失敗安全的容錯策略
編寫啟動類
/**?*?@author:SimpleWu
?*?@date:?2019-05-08
?*/
@EnableDubbo
@SpringBootApplication
@EnableDubboConfiguration
@DubboComponentScan("com.simple.springboot.provider.common.impl")
public?class?ConsumerApplication?{
????public?static?void?main(String[]?args)?{
????????SpringApplication.run(ConsumerApplication.class,args);
????}
}
然后直接就可以訪問成功了。
如果不想使用注解掃描可以使用properties進行配置
#dubbo.scan=com.simple.springboot.provider.common.impl參考代碼:
https://gitlab.com/450255266/code/tree/master/SpringBoot/dubbo/yun-double
注意事項:
Dubbo是一個二進制的Rpc框架在傳輸數(shù)據(jù)過程中,實體類必須經(jīng)過序列化。
在使用poi導(dǎo)出功能時一定不能把response傳到Service層,否則傳輸?shù)絊ervice是導(dǎo)出不了文件而報錯,至于文件下載也一樣但是相信一般都會有單獨的文件服務(wù)器。
END
如果讀完覺得有收獲的話,歡迎點【好看】,關(guān)注【匠心零度】,查閱更多精彩歷史!!!
讓我“好看”?
總結(jié)
以上是生活随笔為你收集整理的dubbo protocol port 消费者端_企业级 SpringBoot 与 Dubbo 的并用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: w3c html规范规范文档,前端开发规
- 下一篇: 详细关闭iiop方法_疏通暖气片堵塞的方