當前位置:首頁 » 編程語言 » c語言有哪些rpc框架
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言有哪些rpc框架

發布時間: 2023-03-21 19:19:50

A. 什麼是Thrift

  • thrift是一個軟體框架,用來進行可擴展且跨語言的服務的開發。它結合了功能強大的軟體堆棧和代碼生成引擎,以構建在 C++, Java, Go,Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 這些編程語言間無縫結合的、高效的服務。


  • thrift最初由facebook開發用做系統內各語言之間的RPC通信 。
    2007年由facebook貢獻到apache基金 ,08年5月進入apache孵化器 。
    支持多種桐大局語言之間的RPC方式的通信局讓:php語言client可以構造一個對象,調用相應的服務方法來調用java語言的服務仿祥 ,跨越語言的C/S RPC調用 。


  • thrift允許定義一個簡單的定義文件中的數據類型和服務介面,以作為輸入文件,編譯器生成代碼用來方便地生成RPC客戶端和伺服器通信的無縫跨編程語言。

B. c語言 有什麼框架

三種程序基本框架:
1、順序執行框架
2、循環語句框架
3、分支語句框架
這3種框架是計算機先驅圖靈驗證過的,任何的程序設計都可以用這3種結構去實現和模擬

C. 從 0 到 1:全面理解 RPC 遠程調用

作者 | Python編程時光

責編 | 胡巍巍

什麼是RPC呢?網路給出的解釋是這樣的:「RPC(Remote Procere Call Protocol)——遠程過程調用協議,它是一種通過網路從遠程計算機程序上請求服務,而不需要了解底層網路技術的協議」。

這個概念聽起來還是比較抽象,沒關系,繼續往後看,後面概念性的東西,我會講得足夠清楚,讓你完全掌握 RPC 的基礎內容。

在 OpenStack 里的進程間通信方式主要有兩種,一種是基於HTTP協議的RESTFul API方式,另一種則是RPC調用。

那麼這兩種方式在應用場景上有何區別呢?

有使用經驗的人,就會知道:

首先,給你提兩個問題,帶著這兩個問題再往下看:

1、RPC 和 REST 區別是什麼?2、為什麼要採用RPC呢?

首先,第一個問題:RPC 和 REST 區別是什麼?

你一定會覺得這個問題很奇怪,是的,包括我,但是你在網路上一搜,會發現類似對比的文章比比皆是,我在想可能很多初學者由於基礎不牢固,才會將不相乾的二者拿出來對比吧。既然是這樣,那為了讓你更加了解陌生的RPC,就從你熟悉得不能再熟悉的 REST 入手吧。

01、所屬類別不同

REST,是Representational State Transfer 的簡寫,中文描述表述性狀態傳遞(是指某個瞬間狀態的資源數據的快照,包括資源數據的內容、表述格式(XML、JSON)等信息。)

REST 是一種軟體架構風格。這種風格的典型應用,就是HTTP。其因為簡單、擴展性強的特點而廣頃肢受開發者的青睞。

而RPC 呢,是 Remote Procere Call Protocol 的簡寫,中文描述是遠程過程調用,它可以實現客戶端像調用本地服務(方法)一樣調用伺服器的服務(方法)。

而 RPC 可以基於 TCP/UDP,也可以基於 HTTP 協議進行傳輸的,按理說它和REST不是一個層面意義上的東西,不應該放在一起討論,但是誰讓REST這么流行呢,它是目前最流行的一套互聯網應用程序的API設計標准,某種意義下,我們說 REST 可以其實就是指代 HTTP 協議。

02、使用方式不同

03、面向對象不同

從設計上來看,RPC,所謂的遠程過程調用 ,是面向方法的 ,REST:所謂的 Representational state transfer ,是面向資源的,除此之外,還有一種叫做 SOA,所謂的面向服務的架構,它是面向消息的,這個接觸不多,就不多說了。

04、序列化協議不同

介面調用通常包含兩個部分,序列化和通信協議。

通信協議,上面已經提及了,REST 是 基於 HTTP 協議,而 RPC 可以基於 TCP/UDP,也可以基於 HTTP 協議進行傳輸的。

常見的序列化協議,有:json、xml、hession、protobuf、thrift、text、bytes等,REST 通常使用的是 JSON或者XML,而 RPC 使用的是渣歷 JSON-RPC,或者 XML-RPC。

通過以上幾點,我們知道了 REST 和 RPC 之間有很明顯的差異。

然後第二個問題:為什麼要採用RPC呢?

那到底為何要使用 RPC,單純的依靠RESTful API不可以嗎?為什麼要搞這么多復雜的協議,渣渣表示真的學不過來了。

關於這一點,以下幾點僅是我的個人猜想,僅供交流哈:

說了這么多,我們該如何選擇這兩者呢?我總結了如下兩點,供你參考:

「遠程調用」意思就是:被調用方法的具體實現不在程序運行本地,而是在別的某個地方(分布到各個伺服器),調用者只想要函數運算的結果,卻不需要實現函數的具體細節。

光說不練嘴把式,接下來,我將分別用三種不同的方式全面地讓你搞明白 rpc 遠程調用是如何實現的。

01、基於 xml-rpc

Python實現 rpc,可以使用標准庫里的 SimpleXMLRPCServer,它是基於XML-RPC 協議的。

有了這個模塊,開如乎搜啟一個 rpc server,就變得相當簡單了。執行以下代碼:

有了 rpc server,接下來就是 rpc client,由於我們上面使用的是 XML-RPC,所以 rpc clinet 需要使用xmlrpclib 這個庫。

然後,我們通過 server_proxy 對象就可以遠程調用之前的rpc server的函數了。

SimpleXMLRPCServer是一個單線程的伺服器。這意味著,如果幾個客戶端同時發出多個請求,其它的請求就必須等待第一個請求完成以後才能繼續。

若非要使用 SimpleXMLRPCServer 實現多線程並發,其實也不難。只要將代碼改成如下即可。

02、基於json-rpc

SimpleXMLRPCServer 是基於 xml-rpc 實現的遠程調用,上面我們也提到 除了 xml-rpc 之外,還有 json-rpc 協議。

那 python 如何實現基於 json-rpc 協議呢?

答案是很多,很多web框架其自身都自己實現了json-rpc,但我們要獨立這些框架之外,要尋求一種較為干凈的解決方案,我查找到的選擇有兩種

第一種是 jsonrpclib

第二種是 python-jsonrpc

先來看第一種 jsonrpclib

它與 Python 標准庫的 SimpleXMLRPCServer 很類似(因為它的類名就叫做 SimpleJSONRPCServer ,不明真相的人真以為它們是親兄弟)。或許可以說,jsonrpclib 就是仿照 SimpleXMLRPCServer 標准庫來進行編寫的。

它的導入與 SimpleXMLRPCServer 略有不同,因為SimpleJSONRPCServer分布在jsonrpclib庫中。

服務端

客戶端

再來看第二種python-jsonrpc,寫起來貌似有些復雜。

服務端

客戶端

調用過程如下

還記得上面我提到過的 zabbix API,因為我有接觸過,所以也拎出來講講。zabbix API 也是基於 json-rpc 2.0協議實現的。

因為內容較多,這里只帶大家打個,zabbix 是如何調用的:直接指明要調用 zabbix server 的哪個方法,要傳給這個方法的參數有哪些。

03、基於 zerorpc

以上介紹的兩種rpc遠程調用方式,如果你足夠細心,可以發現他們都是http+rpc 兩種協議結合實現的。

接下來,我們要介紹的這種(zerorpc),就不再使用走 http 了。

zerorpc 這個第三方庫,它是基於TCP協議、 ZeroMQ 和 MessagePack的,速度相對快,響應時間短,並發高。zerorpc 和 pyjsonrpc 一樣,需要額外安裝,雖然SimpleXMLRPCServer不需要額外安裝,但是SimpleXMLRPCServer性能相對差一些。

調用過程如下

客戶端除了可以使用zerorpc框架實現代碼調用之外,它還支持使用「命令行」的方式調用。

客戶端可以使用命令行,那服務端是不是也可以呢?

是的,通過 Github 上的文檔幾個 demo 可以體驗到這個第三方庫做真的是優秀。

比如我們可以用下面這個命令,創建一個rpc server,後面這個 time Python 標准庫中的 time 模塊,zerorpc 會將 time 注冊綁定以供client調用。

經過了上面的學習,我們已經學會了如何使用多種方式實現rpc遠程調用。

通過對比,zerorpc 可以說是脫穎而出,一支獨秀。

為此,我也做了一番思考:

OpenStack 組件繁多,在一個較大的集群內部每個組件內部通過rpc通信頻繁,如果都採用rpc直連調用的方式,連接數會非常地多,開銷大,若有些 server 是單線程的模式,超時會非常的嚴重。

OpenStack 是復雜的分布式集群架構,會有多個 rpc server 同時工作,假設有 server01,server02,server03 三個server,當 rpc client 要發出rpc請求時,發給哪個好呢?這是問題一。

你可能會說輪循或者隨機,這樣對大家都公平。這樣的話還會引出另一個問題,倘若請求剛好發到server01,而server01剛好不湊巧,可能由於機器或者其他因為導致服務沒在工作,那這個rpc消息可就直接失敗了呀。要知道做為一個集群,高可用是基本要求,如果出現剛剛那樣的情況其實是很尷尬的。這是問題二。

集群有可能根據實際需要擴充節點數量,如果使用直接調用,耦合度太高,不利於部署和生產。這是問題三。

引入消息中間件,可以很好的解決這些問題。

解決問題一:消息只有一份,接收者由AMQP的負載演算法決定,默認為在所有Receiver中均勻發送(round robin)。

解決問題二:有了消息中間件做緩沖站,client 可以任性隨意的發,server 都掛掉了?沒有關系,等 server 正常工作後,自己來消息中間件取就行了。

解決問題三:無論有多少節點,它們只要認識消息中間件這一個中介就足夠了。

既然講到了消息隊列,如果你之前沒有接觸過這塊內容,最好花幾分鍾的時間跟我好好過下關於消息隊列的幾個基礎概念。

首先,RPC只是定義了一個通信介面,其底層的實現可以各不相同,可以是 socket,也可以是今天要講的 AMQP。

AMQP(Advanced Message Queuing Protocol)是一種基於隊列的可靠消息服務協議,作為一種通信協議,AMQP同樣存在多個實現,如Apache Qpid,RabbitMQ等。

以下是 AMQP 中的幾個必知的概念:

Publisher:消息發布者

Queue:用來保存消息的存儲空間,消息沒有被receiver前,保存在隊列中。

Exchange:用來接收Publisher發出的消息,根據Routing key 轉發消息到對應的Message Queue中,至於轉到哪個隊列里,這個路由演算法又由exchange type決定的。

Exchange type:主要四種描述exchange的類型。

direct:消息路由到滿足此條件的隊列中(queue,可以有多個):routing key = binding key

topic:消息路由到滿足此條件的隊列中(queue,可以有多個):routing key 匹配 binding pattern. binding pattern是類似正則表達式的字元串,可以滿足復雜的路由條件。

fanout:消息路由到多有綁定到該exchange的隊列中。

binding :binding是用來描述exchange和queue之間的關系的概念,一個exchang可以綁定多個隊列,這些關系由binding建立。前面說的binding key /binding pattern也是在binding中給出。

為了讓你明白這幾者的關系,我畫了一張模型圖。

關於AMQP,有幾下幾點值得注意:

前面鋪墊了那麼久,終於到了講真實應用的場景。在生產中RPC是如何應用的呢?

其他模型我不太清楚,在 OpenStack 中的應用模型是這樣的

至於為什麼要如此設計,前面我已經給出了自己的觀點。

接下來,就是源碼解讀 OpenStack ,看看其是如何通過rpc進行遠程調用的。如若你對此沒有興趣(我知道很多人對此都沒有興趣,所以不浪費大家時間),可以直接跳過這一節,進入下一節。

目前Openstack中有兩種RPC實現,一種是在oslo messaging,一種是在openstack.common.rpc。

openstack.common.rpc是舊的實現,oslo messaging是對openstack.common.rpc的重構。openstack.common.rpc在每個項目中都存在一份拷貝,oslo messaging即將這些公共代碼抽取出來,形成一個新的項目。oslo messaging也對RPC API 進行了重新設計,對多種 transport 做了進一步封裝,底層也是用到了kombu這個AMQP庫。(註:Kombu 是Python中的messaging庫。Kombu旨在通過為AMQ協議提供慣用的高級介面,使Python中的消息傳遞盡可能簡單,並為常見的消息傳遞問題提供經過驗證和測試的解決方案。)

關於oslo_messaging庫,主要提供了兩種獨立的API:

因為 notify 實現是太簡單了,所以這里我就不多說了,如果有人想要看這方面內容,可以收藏我的博客(http://python-online.cn) ,我會更新補充 notify 的內容。

OpenStack RPC 模塊提供了 rpc.call,rpc.cast, rpc.fanout_cast 三種 RPC 調用方法,發送和接收 RPC 請求。

rpc.call 和 .rpc.cast 從實現代碼上看,他們的區別很小,就是call調用時候會帶有wait_for_reply=True參數,而cast不帶。

要了解 rpc 的調用機制呢,首先要知道 oslo_messaging 的幾個概念主要方法有四個:

transport:RPC功能的底層實現方法,這里是rabbitmq的消息隊列的訪問路徑

transport 就是定義你如何訪連接消息中間件,比如你使用的是 Rabbitmq,那在 nova.conf中應該有一行transport_url的配置,可以很清楚地看出指定了 rabbitmq 為消息中間件,並配置了連接rabbitmq的user,passwd,主機,埠。

target用來表述 RPC 伺服器監聽topic,server名稱和server監聽的exchange,是否廣播fanout。

rpc server 要獲取消息,需要定義target,就像一個門牌號一樣。

rpc client 要發送消息,也需要有target,說明消息要發到哪去。

endpoints:是可供別人遠程調用的對象

RPC伺服器暴露出endpoint,每個 endpoint 包涵一系列的可被遠程客戶端通過 transport 調用的方法。直觀理解,可以參考nova-conctor創建rpc server的代碼,這邊的endpoints就是 nova/manager.py:ConctorManager

dispatcher:分發器,這是 rpc server 才有的概念

只有通過它 server 端才知道接收到的rpc請求,要交給誰處理,怎麼處理?

在client端,是這樣指定要調用哪個方法的。

而在server端,是如何知道要執行這個方法的呢?這就是dispatcher 要乾的事,它從 endpoint 里找到這個方法,然後執行,最後返回。

Serializer:在 python 對象和message(notification) 之間數據做序列化或是反序列化的基類。

主要方法有四個:

每個notification listener都和一個executor綁定,來控制收到的notification如何分配。默認情況下,使用的是blocking executor(具體特性參加executor一節)

模仿是一種很高效的學習方法,我這里根據 OpenStack 的調用方式,抽取出核心內容,寫成一個簡單的 demo,有對 OpenStack 感興趣的可以了解一下,大部分人也可以直接跳過這章節。

注意以下代碼不能直接運行,你還需要配置 rabbitmq 的連接方式,你可以寫在配置文件中,通過 get_transport 從cfg.CONF 中讀取,也可以直接將其寫成url的格式做成參數,傳給 get_transport 。而且還要nova或者其他openstack組件的環境中運行(因為需要有ctxt這個環境變數)

簡單的 rpc client

簡單的 rpc server

【End】

熱 文 推 薦

☞Facebook 發幣 Libra;谷歌十億美金為窮人造房;第四代樹莓派 Raspberry Pi 4 發布 | 開發者周刊

☞WebRTC 將一統實時音視頻天下?

☞小米崔寶秋:小米 AIoT 深度擁抱開源

☞華為在美研發機構 Futurewei 意欲分家?

☞老司機教你如何寫出沒人敢維護的代碼!

☞Python有哪些技術上的優點?比其他語言好在哪兒?

☞上不了北大「圖靈」、清華「姚班」,AI專業還能去哪上?

☞公鏈史記 | 從鴻蒙初辟到萬物生長的十年激盪……

☞邊緣計算容器化是否有必要?

☞馬雲曾經偶像,終於把阿里留下的1400億敗光了!

你點的每個「在看」,我都認真當成了喜歡

D. C語言開發的主流框架有哪些

c語言寫的php框架 , ,yaf框架。 phalcon框架。

c語言寫的php框架 ,yaf框架。 phalcon框架。

E. php rpc好用嗎,有什麼優缺點php rpc框架哪個好

什麼是RPC框架? 如果用一句話概括RPC就是:遠程調用框架(Remote Procere Call)那什麼是遠程調用?通常我們調用一個php中的方法,比如這樣一個函數方法: localAdd(10, 20),localAdd方法的具體實現要麼是用戶自己定義的,要麼是php庫函數中自帶的,也就說在localAdd方法的代碼實現在本地,它是一個本地調用!遠程調用意思就是:被調用方法的具體實現不在程序運行本地,而是在別的某個遠程地方。

遠程調用原理

比如 A (client) 調用 B (server) 提供的remoteAdd方法:

  • 首先A與B之間建立一個TCP連接;

  • 然後A把需要調用的方法名(這里是remoteAdd)以及方法參數磨猜(10, 20)序列化成位元組流發送出去;

  • B接受A發送過來的位元組流,然後反序列化得到目標方法名,方法參數,接著執行相應的方法調用(可能是localAdd)並把結果30返回;

  • A接受遠程調用結果,輸出30。

  • RPC框架就是把我剛才說的這幾點些細節給封裝起來,給用戶暴露簡單友好的API使用。

    遠程調用的好處

    解耦:當server需要對方法內實現修改時,client完全感知不到,不用做任何變更;這種方式在跨部門,跨公司合作的時候經常用到,並且方法的提供者我們通常稱為:服務的暴露。

    RPC與Socket有什麼區別?

    通過上面的簡單闡述,好像RPC與Socket 好像啊。都是調用遠程的方法,都是client/server模式,我之前也寫了一篇文章: 細說socket 那他們有啥區別呢?

    RPC(遠程過程調用)採用客戶機/伺服器模式實現兩個進程之間相互通信。socket是RPC經常採用的通信手段之一,RPC是在Socket的基礎上實現的,它比socket需要更多的網路和系統資源。除了Socket,RPC還有其他的通信方法,比如:http、操作系統自帶的管道等技術來實現對於遠程程序的調用激芹。微軟的Windows系統中,RPC就是採用命名管道進行通信。

    RPC與REST有什麼區別?

    通過了解RPC後,我們知道是RPC是client/server模式的,調用遠程的方法,REST也是我們熟悉的一套API調用協議方法,它也是基於client/server模式的,調用遠程的方法的,那他倆又有啥區別呢?

    REST API 和 RPC 都是在 Server端 把一個個函數封裝成介面暴露出去,以供 Client端 調用,不過 REST API 是基於HTTP協議的,REST致力於通過http協議中的POST/GET/PUT/DELETE等方法和一個可讀性強的URL來提供一個http請求。而 RPC 則可以不基於 HTTP協議
    因此,如果是後端兩種語言互相調用,用 RPC 可以獲得更好的性能(省去了 HTTP 報頭等一系列東西),應該也更容易配置。如果是前端通過 AJAX 調用後端,那麼用 REST API 的形式比較好(因為無論如何也避不開 HTTP 這道坎)。

    php中流行的rpc框架有哪些

    既然php是世界上最好的語言,那php中流行的RPC框架有哪些呢?

    先列舉下: phprpc,yar, thrift, gRPC, swoole, hprose

    因為時間和精力有限,不可能一個一個的去學習和使用,我選幾個世面上用的最多的幾個用下吧。因為RPC原理是一樣的,都是Client/Server模式,只是每瞎鉛型個框架的使用方式不一樣而已。

F. c語言結構體有哪些

如下:

第一種:只有結構體定義:

1. struct stuff{

2.char job;

3. int age;

4. float height;

5. };

第二種:附加該結構體類型的「結構體變數」的初始化的結構體定義:

1. //直接帶變數名Huqinwei

2. struct stuff{

3. char job[20];

4. int age;

5. float height;

6. }Huqinwei;

也許初期看不習慣容易困惑,其實這就相當於:

1. struct stuff{

2. char job;

3. int age;

4. float height;

5. };

6. struct stuff Huqinwei;

第三種:如果該結構體你只用一個變數Huqinwei,而不再需要用。

struct stuff yourname; 去定義第二個變數。那麼,附加變數初始化的結構體定義還可進一步簡化出第三種:

1. struct{2. char job;

3. int age;

4.float height;

5. }Huqinwei;

G. Grpc原理

rpc調用原理框架如圖:

-支持多語言的rpc框架,例如Google的grpc,facebook thrift, 網路的brpc
-支持特定語言的rpc框架, 例如新浪微博的Motan
-支持服務治理微服務化特性框架,其底層仍是rpc框架,例如 阿里的Dubbo
目前業內主要使用基於多語言的 RPC 框架來構建微服務,是一種比較好的技術選擇,例如netflix ,API服務編排層和後端微服務之間採用微服務rpc進行通信

-支持C java js
-git地址 https://github.com/grpc/grpc-java
-原理圖:

gRPC 的線程模型遵循 Netty 的線程分工原則,即:協議層消息的接收和編或悉解碼由 Netty 的 I/O(NioEventLoop) 線程負責;後續應用層的處理由應用線程負責,防止由於應用處理耗時而阻塞 Netty 的 I/O 線程
不過正是因為有了分工原則,grpc 之間會做頻繁的線程切換,如果在一次grpc調用過程中,做了多次I/O線程到應用線程之間的切換,會導致性能的下降,這也是為什禪氏么grpc在一些私有協議支持不太友好的原因衫襲乎

缺點

改進:
優化後BIO線程模型採用了線程池的做法但是後端的應用處理線程仍然採用同步阻塞的模型,阻塞的時間取決對方I/O處理的速度和網路I/O傳輸的速度

grpc的線程模型主要包含服務端線程模型,客戶端線程模型

2.1.1 I/O 通信線程模型
gRPC的做法是服務監聽線程和I/O線程分離Reactor多個線程模型 其工作原理如下:

2.1.2 服務調度線程模型

gRPC 客戶端線程模型工作原理如下圖所示(同步阻塞調用為例)

相比於服務端,客戶端的線程模型簡單一些,它的工作原理如下:

grpc 線程模型

H. c語言常見的數據結構有哪些

1、線性數據結構


元素之間一般存在元素之間存在一對一關系,是最常用的一類數據結構,典型的有:數組、棧、隊列和線性表。


2、樹形結構


結點間具有層次關系,每一層的一個結點能且只能和上一層的一個結點相關,但同時可以和下一層的多個結點相關,稱為“一對多”關系,常見類型有:樹、堆。


3、圖形結構


在圖形結構中,允許多個結點之間相關,稱為“多對多”關系。


(1)線性數據結構:元素之間一般存在元素之間存在一對一關系,是最常用的一類數據結構,典型的有:數組、棧、隊列和線性表


(2)樹形結構:結點間具有層次關系,每一層的一個結點能且只能和上一層的一個結點相關,但同時可以和下一層的多個結點相關,稱為“一對多”關系,常見類型有:樹、堆


(3)圖形結構:在圖形結構中,允許多個結點之間相關,稱為“多對多”關系