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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。