1. 程式人生 > >如何實現RPC遠端服務呼叫

如何實現RPC遠端服務呼叫

想要完成RPC呼叫,需要解決四個問題:

  • 客戶端與服務端如何建立網路連線
  • 服務端如何處理請求
  • 資料傳輸採用什麼協議
  • 資料該如何序列化和反序列化

1.客戶端與服務端如何建立網路連線

  • HTTP通訊
    HTTP通訊是基於應用層HTTP協議的,而HTTP協議又是基於TCP協議的。一次HTTP通訊過程就是發起一次HTTP呼叫,而一次HTTP呼叫就會建立一個TCP連線,經歷一次下圖所示的“三次握手”的
    過程。
    這裡寫圖片描述

完成請求後,再經歷一次“四次握手”的過程來斷開連線。
這裡寫圖片描述

  • Socket通訊
    Socket通訊是基於TCP/IP協議的封裝,建立一次Socket連線至少需要一對套接字,其中一個運行於客戶端,稱為ClientSocket;另外一個運行於伺服器端,稱為ServerSocket。就像下圖描述的,Socket
    通訊的過程分為四個步驟:伺服器監聽,客戶端請求,連線確認,資料傳輸。
    這裡寫圖片描述

  • 伺服器監聽:ServiceSocket通過呼叫bind()函式繫結某個具體的埠,然後呼叫listen()函式實時監控網路狀態,等待客戶端的連線請求。

  • 客戶端請求:ClientSocket呼叫connect()函式向ServiceSocket繫結的地址和埠發起連線請求。

  • 服務端連線確認:當ServiceSocket監聽到或者接收到ClientSocket的連線請求時,呼叫accept()函式響應ClientSocket的請求,同客戶端建立連線。

  • 資料傳輸:當ClientSocket和ServiceSocket建立連線後,ClientSocket呼叫Send()函式,ServiceSocket呼叫Receive函式,ServerSocket處理完請求後,呼叫send()函式,ClientSocket呼叫receive()函式,就可以得到返回的結果。

當遇到網路閃斷,連線超時,伺服器宕機等各種異常,通常的處理手段有兩種。

  • 鏈路存活檢測:客戶端傳送心跳檢測資訊給服務端,服務端通過檢測心跳判斷鏈路存活狀態。
  • 斷連重試:

2.服務端如何處理請求?

  • 同步阻塞方式(BIO)
  • 同步非阻塞方式(NIO)
  • 非同步非阻塞方式(AIO)

3.資料傳輸採用什麼協議?
最常用的有HTTP協議,通常協議契約包括兩個部分:訊息頭和訊息體。
消費頭存放的是協議的公共欄位以及使用者的擴充套件欄位,訊息體存放的是傳輸資料的具體內容。

4.資料該如何序列化和反序列化?

一般資料在網路中進行傳輸前,都要在傳送方一端對資料進行編碼,經過網路傳輸到另一端,再對資料進行解碼,這個過程就是序列化和反序列化。
為什麼要對資料進行序列化和反序列化呢?
要知道網路傳輸的耗時取決於網路頻寬的大小和資料的傳輸量。要加快網路傳輸,要麼提高頻寬,要麼減少資料量。而對資料編碼的目的就是減少資料量。
常見的序列化的方式分為兩類:文字類如XML/JSON等,二進位制類如PB/Thrift等,具體採用哪種方式,主要取決於以下幾個因素。

  • 支援資料結構型別的豐富度
  • 跨語言支援
  • 效能

相關推薦

基於HttpClient實現RPC遠端服務呼叫功能【SpringBoot專案】

一、什麼是RPC? RPC(Remote Procedure Call)—遠端過程呼叫,它是一種通過網路從遠端計算機程式上請求服務,而不需要了解底層網路技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,為通訊程式之間攜帶資訊資料。在OSI網路通訊模

如何實現RPC遠端服務呼叫

想要完成RPC呼叫,需要解決四個問題: 客戶端與服務端如何建立網路連線 服務端如何處理請求 資料傳輸採用什麼協議 資料該如何序列化和反序列化 1.客戶端與服務端如何建立網路連線 HTTP通訊 HTTP通訊是基於應用層HTTP協議的,而HT

徒手擼框架--實現 RPC 遠端呼叫

微服務,已經是每個網際網路開發者必須掌握的一項技術。而 RPC 框架,是構成微服務最重要的組成部分之一。趁最近有時間。又看了看 dubbo 的原始碼。dubbo 為了做到靈活和解耦,使用了大量的設計模式和 SPI機制,要看懂 dubbo 的程式碼也不太容易。 按

spring mvc 實現遠端服務呼叫的幾種方式

org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter 實現遠端服務呼叫 (1)httpinvoker方式 伺服器客戶端都是spring時推薦這種方式 服務端 必須要實現 bean實體類

用C程式碼簡要模擬實現一下RPC(遠端過程呼叫)並談談它在程式碼調測中的重要應用

        說明: 本文僅僅是一種模擬的RPC實現, 真正的RPC實現還是稍微有點複雜的。         我們來看看下面這個常見的場景: 在某系統中,我們要對某一函式進行調測, 但是, 很難很難構造出這個函式被呼叫的實際場景, 怎麼辦?         雖然很難構造

python實現rpc遠端呼叫

    遠端呼叫就是將物件名、函式名、引數等傳遞給遠端伺服器,伺服器將處理結果返回給客戶端。 遠端呼叫使得呼叫遠端伺服器的物件、方法的方式就和呼叫本地物件、方法的方式差不多,因為我們通過網路程式設計把這些都隱藏起來了。遠端呼叫是分散式系統的基礎。 遠端呼叫一般分為兩種,遠

Thrift RPC實現跨語言服務呼叫

工程開始之前的準備: Thrift RPC類似與JAVA RMI,它們都是RPC(遠端過程呼叫協議)協議的具體實現,Thrift RPC中間多個IDL(介面描述語言-跨平臺開發的基礎),使得它可

SpringCloud微服務搭建之fegin客戶端遠端服務呼叫

什麼是Feign Feign是一個宣告式的偽Http客戶端,它使得寫Http客戶端變得更簡單。使用Feign,只需要建立一個介面並註解。它具有可插拔的註解特性,可使用Feign 註解和JAX-RS註解。Feign支援可插拔的編碼器和解碼器。Feign預設集成了Ribbon,並和Eureka結合,預設實現了負

dubbo其實很簡單,就是一個遠端服務呼叫的框架(1)

dubbo專題」dubbo其實很簡單,就是一個遠端服務呼叫的框架(1) 一、dubbo是什麼? 1)本質:一個Jar包,一個分散式框架,,一個遠端服務呼叫的分散式框架。 既然是新手教學,肯定很多同學不明白什麼是分散式和遠端服務呼叫,為什麼要分散式,為什麼要遠端呼叫。我簡單畫個對比圖說明(

zuul動態路由整合hystrix實現熔斷保護並整合feign實現宣告式服務呼叫

上一篇中。將userService提供服務的返回時間延遲4000ms。導致feign在呼叫時候出發熔斷。直接返回fallback回撥。 這一篇中加入zuul實現動態路由功能。並加入ZuulFilter的前置過濾功能。zuul整合hystrix預設在早期版本是開啟的。但在後期 版本就關閉了自動

Fegin整合Hystrix實現宣告式服務呼叫服務熔斷降級

1:fegin集成了Hystrix。所以只需要引入feigin的依賴: <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud

Java實現RPC服務物件使用註解並自動注入)

使用到的技術: 註解和反射機制 包掃描以及jar包掃描 CGlib動態代理 類似於spring框架的控制反轉依賴自動注入技術 目錄結構: RPCclass註解 @Retention(RetentionPolicy.RUNTIME) @Target(ElementTy

RabbitMQ的學習(四):RPC-遠端過程呼叫(純demo-可直接使用)

前言:在前面三篇文章中,分別對rabbitmq的搭建,並對rabbitmq常用的四種不同的交換機結合路由鍵編寫了各自的demo,可以參考: 1. RabbitMQ的學習(一):Windows下安裝及配置RabbitMQ,erlang環境變數; 2. RabbitMQ的學習(二):簡單的j

基於netty實現遠端服務框架

HSF服務管理平臺 基於netty實現遠端服務框架,為終端提供REST形式的HTTP服務。 目前只實現部分功能,可以提供REST形式和傳統形式的HTTP服務,其特點主要包括: 基於netty實現http協議開發,作為服務端和客戶端的通訊橋樑 利用zk管理服務提供者,實

【圖文詳細 】Scala——RPC 遠端過程呼叫

1、RPC 遠端過程呼叫    1.1、RPC 概念  RPC(Remote Procedure Call)—遠端過程呼叫,它是一種通過網路從遠端計算機程式上請 求服務,而不需要了解底層網路技術的協議。RPC 協議假定某些傳輸協議的存在,如 TCP 或

dubbo原始碼淺析(五)-遠端服務呼叫流程

消費端呼叫遠端服務介面時,使用上和呼叫普通的java介面是沒有任何區別,但是服務消費者和提供者是跨JVM和主機的,客戶端如何封裝請求讓服務端理解請求並且解析服務端返回的介面呼叫結果,服務端如何解析客戶端的請求並且向客戶端返回呼叫結果,這些框架是如何實現的,下面就

RPC遠端過程呼叫詳解

今天看了兩篇關於RPC遠端過程呼叫的,寫的很好,分享一下。 http://blog.csdn.net/mindfloating/article/details/39473807 http://blog.csdn.net/mindfloating/article/detail

httpInvoker提供遠端服務呼叫總結(一

1 使用httpInvoker提供遠端服務 使用HttpInvoker,不需要額外的類庫。和Hessian的輕量級傳輸協議不同的是,Spring HttpInvoker使用Java序列化來序列化引數和返回值,然後基於HTTP協議傳輸經序列化後的物件。當引數或返回值是複雜型別,並且不能通過Hessian的序列

httpInvoker提供遠端服務呼叫總結(一)

1 使用httpInvoker提供遠端服務 使用HttpInvoker,不需要額外的類庫。和Hessian的輕量級傳輸協議不同的是,SpringHttpInvoker使用Java序列化來序列化引數和返回值,然後基於HTTP協議傳輸經序列化後的物件。當引數或返回值是複雜型別,並且不能通過Hessian的序列化

Dubbo分散式遠端服務呼叫框架(告別Web Service模式中的WSdl,以服務者與消費者的方式在dubbo上註冊

1. Dubbo是什麼? Dubbo是一個分散式服務框架,致力於提供高效能和透明化的RPC遠端服務呼叫方案,以及SOA服務治理方案。簡單的說,dubbo就是個服務框架,如果沒有分散式的需求,其實是不需要用的,只有在分散式的時候,才有dubbo這樣的分散式服務框架的需求,