中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring Cloud Alibaba+Nacos+Dubbo如何進行零成本實現RPC調用

發布時間:2021-11-15 15:51:09 來源:億速云 閱讀:429 作者:柒染 欄目:大數據

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協議調用幾乎是零成本的改造。

一、系統結構

Spring Cloud Alibaba+Nacos+Dubbo如何進行零成本實現RPC調用

  • cloud-gateway 作為cloud集群的網關,外部的路由轉發使用http協議,內部的服務調用使用dubbo協議

  • cloud-usercloud-mq之間的遠程調用使用dubbo協議

  • 使用Nacos作為服務注冊與發現配置中心的服務

  • 使用Sentinel作為服務間httpdubbo調用的流量控制服務

目錄結構

├── cloud-admin         # 服務監控
├── cloud-gateway       # 服務網關
├── cloud-mq            # mq服務
├── cloud-provider      # 服務接口
└── cloud-user          # user服務

二、服務接口提供方實現

1. 服務接口定義

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接口

2. 引入dubbo包

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 也是必須的

3. 服務接口實現

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

4. 配置dubbo服務相關的信息

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]

三、服務調用方實現

1. 引入依賴包

<!--服務接口-->
<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>

2. 調用服務接口

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);
    }
}

3. 配置dubbo服務相關的信息

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:根據權重進輪訓

四、總結

  1. 服務間使用了長連接,在正常運行時,提供方某個節點斷掉后會需要一段時間來切換,可使用sentinel來控制快速切換可用節點

  2. 使用dubbo進行遠程調用,內部調用性能上有所提供,調用方式上也相對簡單

  3. sentinel配合,合理使用負載策略,可實現更多功能,如灰度發布,版本控制等

  4. 性能的提升讓調用鏈增加成為可能性,可實現更小粒度的微服務拆分與組合

看完上述內容,你們掌握Spring Cloud Alibaba+Nacos+Dubbo如何進行零成本實現RPC調用的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鹤山市| 拉萨市| 汾西县| 久治县| 桑日县| 沙坪坝区| 宜宾县| 当涂县| 修水县| 洮南市| 定南县| 中阳县| 大悟县| 苗栗市| 栾川县| 镇坪县| 滦平县| 安化县| 肃南| 磐安县| 石棉县| 太白县| 黑河市| 上饶市| 丹阳市| 东乡县| 巩义市| 横峰县| 石狮市| 新民市| 昌宁县| 凭祥市| 济南市| 高碑店市| 亚东县| 洛宁县| 蒲城县| 朝阳县| 华坪县| 彩票| 厦门市|