Spring Cloud Alibaba+Nacos+Dubbo如何進行零成本實現(xiàn)RPC調(diào)用,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
成都創(chuàng)新互聯(lián)公司專注于荊州企業(yè)網(wǎng)站建設(shè),成都響應式網(wǎng)站建設(shè)公司,商城網(wǎng)站開發(fā)。荊州網(wǎng)站建設(shè)公司,為荊州等地區(qū)提供建站服務。全流程定制網(wǎng)站建設(shè),專業(yè)設(shè)計,全程項目跟蹤,成都創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務
dubbo的rpc框架學習成本較高,代碼入侵性強,本身生態(tài)不完整,需要整合多個外部組件,故選擇了相對性能弱一點的Spring Cloud全家桶。
直到Spring Cloud Alibaba的出現(xiàn),使用Nacos作為服務發(fā)現(xiàn)與注冊,同時兼容使用Feign的http
方式和使用dubbo的rpc
方式調(diào)用。
Spring Cloud 為什么需要RPC
在Spring Cloud構(gòu)建的微服務系統(tǒng)中,大多數(shù)的開發(fā)者使用都是官方提供的Feign組件來進行內(nèi)部服務通信,這種聲明式的HTTP客戶端使用起來非常的簡潔、方便、優(yōu)雅,并且和開發(fā)平臺、語言無關(guān),但是通常情況下,HTTP并不會開啟KeepAlive功能,即當前連接為短連接,短連接的缺點是每次請求都需要建立TCP連接,這使得其效率變的相當?shù)拖隆?/p>
對外部提供REST API服務是一件非常好的事情,但是如果內(nèi)部調(diào)用也是使用HTTP調(diào)用方式,就會顯得顯得性能低下,Spring Cloud默認使用的Feign組件進行內(nèi)部服務調(diào)用就是使用的HTTP協(xié)議進行調(diào)用,這時,我們?nèi)绻麅?nèi)部服務使用RPC調(diào)用,對外使用REST API,將會是一個非常不錯的選擇。
引用至:Dubbo 與 Spring Cloud 完美結(jié)合
使用Dubbo Spring Cloud使用內(nèi)部的RPC協(xié)議調(diào)用幾乎是零成本的改造。
cloud-gateway
作為cloud集群的網(wǎng)關(guān),外部的路由轉(zhuǎn)發(fā)使用http協(xié)議,內(nèi)部的服務調(diào)用使用dubbo協(xié)議
cloud-user
和cloud-mq
之間的遠程調(diào)用使用dubbo協(xié)議
使用Nacos
作為服務注冊與發(fā)現(xiàn)和配置中心的服務
使用Sentinel
作為服務間http和dubbo調(diào)用的流量控制服務
目錄結(jié)構(gòu)
├── cloud-admin # 服務監(jiān)控 ├── cloud-gateway # 服務網(wǎng)關(guān) ├── cloud-mq # mq服務 ├── cloud-provider # 服務接口 └── cloud-user # user服務
public interface UserProvider { UserDTO checkUser(String userName, String password); UserDTO findByUserName(String userName); } @Data @Builder @NoArgsConstructor @AllArgsConstructor public class UserDTO implements Serializable { String userName; String realName; String password; }
服務接口是服務提供方和消費方的契約,包含服務的方法傳輸對象DTO。由于涉及多個應用服務的引入,最好是將其獨立成Module
DTO對象必須實現(xiàn)Serializable
接口
POM
com.alibaba.cloud spring-cloud-starter-dubbo org.springframework.boot spring-boot-starter-actuator
spring-boot-starter-actuator
也是必須的
import org.apache.dubbo.config.annotation.Service; @Service public class UserProviderImpl implements UserProvider { @Autowired private UserService userService; @Override public UserDTO checkUser(String userName, String password) { User user = userService.checkUser(userName, password); return UserConvertor.toDTO(user); } }
@Service
必須是org.apache.dubbo.config.annotation.Service
spring: main: allow-bean-definition-overriding: true dubbo: scan: base-packages: fun.barryhome.cloud.provider #指定 Dubbo 服務實現(xiàn)類的掃描基準包 protocols: dubbo: name: dubbo # Dubbo 的協(xié)議名稱 port: -1 # port 為協(xié)議端口( -1 表示自增端口,從 20880 開始) registry: address: spring-cloud://localhost # 掛載到 Spring Cloud 注冊中心
啟動后有可能出現(xiàn)連接失敗,不影響使用
java.net.ConnectException: Connection refused (Connection refused) at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.8.0_111] at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_111] at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_111]
fun.barryhome cloud-provider 0.0.1-SNAPSHOT compile com.alibaba.cloud spring-cloud-starter-dubbo org.springframework.boot spring-boot-starter-actuator
import org.apache.dubbo.config.annotation.Reference; public class UserController { @Reference private UserProvider userProvider; @GetMapping(value = "/sessionUser") public UserDTO sessionUser(HttpServletRequest request) { String userName = request.getHeader("X-User-Name"); if (Strings.isEmpty(userName)) { throw new RuntimeException("沒有找到用戶"); } return userProvider.findByUserName(userName); } }
dubbo: cloud: subscribed-services: cloud-user # 服務提供方的服務名 consumer: check: false loadbalance: "leastactive" # 最小活躍數(shù)負載均衡 registry: # 掛載到 Spring Cloud 注冊中心 address: spring-cloud://localhost
dubbo.consumer.check
:用于啟動時是否檢查服務提供方是否運行正常,如果不正常將不能啟動調(diào)用方
dubbo.consumer.loadbalance
:負載均衡策略
RandomLoadBalance:隨機,按權(quán)重設(shè)置隨機概率
ConsistentHashLoadBalance:一致性哈希算法
LeastActiveLoadBalance:最小活躍數(shù)負載均衡
RoundRobinLoadBalance:根據(jù)權(quán)重進輪訓
服務間使用了長連接,在正常運行時,提供方某個節(jié)點斷掉后會需要一段時間來切換,可使用sentinel
來控制快速切換可用節(jié)點
使用dubbo進行遠程調(diào)用,內(nèi)部調(diào)用性能上有所提供,調(diào)用方式上也相對簡單
與sentinel
配合,合理使用負載策略,可實現(xiàn)更多功能,如灰度發(fā)布,版本控制等
性能的提升讓調(diào)用鏈增加成為可能性,可實現(xiàn)更小粒度的微服務拆分與組合
看完上述內(nèi)容,你們掌握Spring Cloud Alibaba+Nacos+Dubbo如何進行零成本實現(xiàn)RPC調(diào)用的方法了嗎?如果還想學到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!