您好,登錄后才能下訂單哦!
Spring Cloud Alibaba+Nacos+Dubbo如何進行零成本實現RPC調用,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
dubbo的rpc框架學習成本較高,代碼入侵性強,本身生態不完整,需要整合多個外部組件,故選擇了相對性能弱一點的Spring Cloud全家桶。
直到Spring Cloud Alibaba的出現,使用Nacos作為服務發現與注冊,同時兼容使用Feign的http
方式和使用dubbo的rpc
方式調用。
Spring Cloud 為什么需要RPC
在Spring Cloud構建的微服務系統中,大多數的開發者使用都是官方提供的Feign組件來進行內部服務通信,這種聲明式的HTTP客戶端使用起來非常的簡潔、方便、優雅,并且和開發平臺、語言無關,但是通常情況下,HTTP并不會開啟KeepAlive功能,即當前連接為短連接,短連接的缺點是每次請求都需要建立TCP連接,這使得其效率變的相當低下。
對外部提供REST API服務是一件非常好的事情,但是如果內部調用也是使用HTTP調用方式,就會顯得顯得性能低下,Spring Cloud默認使用的Feign組件進行內部服務調用就是使用的HTTP協議進行調用,這時,我們如果內部服務使用RPC調用,對外使用REST API,將會是一個非常不錯的選擇。
引用至:Dubbo 與 Spring Cloud 完美結合
使用Dubbo Spring Cloud使用內部的RPC協議調用幾乎是零成本的改造。
cloud-gateway
作為cloud集群的網關,外部的路由轉發使用http協議,內部的服務調用使用dubbo協議
cloud-user
和cloud-mq
之間的遠程調用使用dubbo協議
使用Nacos
作為服務注冊與發現和配置中心的服務
使用Sentinel
作為服務間http和dubbo調用的流量控制服務
目錄結構
├── cloud-admin # 服務監控 ├── cloud-gateway # 服務網關 ├── 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對象必須實現Serializable
接口
POM
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-dubbo</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
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 服務實現類的掃描基準包 protocols: dubbo: name: dubbo # Dubbo 的協議名稱 port: -1 # port 為協議端口( -1 表示自增端口,從 20880 開始) registry: address: spring-cloud://localhost # 掛載到 Spring Cloud 注冊中心
啟動后有可能出現連接失敗,不影響使用
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]
<!--服務接口--> <dependency> <groupId>fun.barryhome</groupId> <artifactId>cloud-provider</artifactId> <version>0.0.1-SNAPSHOT</version> <scope>compile</scope> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-dubbo</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
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" # 最小活躍數負載均衡 registry: # 掛載到 Spring Cloud 注冊中心 address: spring-cloud://localhost
dubbo.consumer.check
:用于啟動時是否檢查服務提供方是否運行正常,如果不正常將不能啟動調用方
dubbo.consumer.loadbalance
:負載均衡策略
RandomLoadBalance:隨機,按權重設置隨機概率
ConsistentHashLoadBalance:一致性哈希算法
LeastActiveLoadBalance:最小活躍數負載均衡
RoundRobinLoadBalance:根據權重進輪訓
服務間使用了長連接,在正常運行時,提供方某個節點斷掉后會需要一段時間來切換,可使用sentinel
來控制快速切換可用節點
使用dubbo進行遠程調用,內部調用性能上有所提供,調用方式上也相對簡單
與sentinel
配合,合理使用負載策略,可實現更多功能,如灰度發布,版本控制等
性能的提升讓調用鏈增加成為可能性,可實現更小粒度的微服務拆分與組合
看完上述內容,你們掌握Spring Cloud Alibaba+Nacos+Dubbo如何進行零成本實現RPC調用的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。