自己開發了一個股票智能分析軟件,功能很強大,需要的點擊下面的鏈接獲取:
https://www.cnblogs.com/bclshuai/p/11380657.html
分布式系統RPC和IPC
目錄
1 簡介
1.1 分布式系統
1.2 遠程過程調用RPC(remote procedure call)
1.3 進程間通訊IPC(Inter-process communication)
2 RPC詳解
2.1 RPC的結構
2.2 主流的RPC服務框架
3 IPC 進程間通訊
3.1 同計算機進程間通訊方式
3.2 遠程進程間通訊
1 簡介
1.1 分布式系統
一台電腦或者服務器構成一個節點,以前只是在一台電腦上運行程序。現在將多個電腦連接起來,把他們組成一個分布式系統,把分散的物理和邏輯資源、運算資源通過計算機網絡實現信息交換。通過統一調度運算、存儲,將一個大的任務分配到多台計算機上執行, 系統中存在一個以全局的方式管理計算機資源的分布式操作系統,負責任務分配、資源調度。不同節點之間通過消息傳遞的形式進行通信和協作以完成特定的功能。節點不僅僅是計算機,也可以是其他的設備。分布式系統分為分布式計算、分布式存儲、分布式控制、分布式服務。
1.2 遠程過程調用RPC(remote procedure call)
分布式系統中,各個節點之間通過消息傳遞的方式去調用各個服務的接口函數。返回調用結果。例如本地需要調用遠程服務上的加法函數add(int x, int y);這時需要方法遠程調用callid(遠程服務上函數的調用id,唯一標識)、x,y的值用一定的協議格式,序列化之后為字節流,通過網絡傳輸到服務器,服服務器反序列化數據,再解析協議,根據callid去查找函數,然后將參數傳入,按照協議去執行加法,再返回結果。
RPC三要素:
(1)服務端的CAllID映射
(2)序列化和反序列化,以用protobuf
(3)網絡傳輸。socket,zeromq,netty。
1.3 進程間通訊IPC(Inter-process communication)
分布式系統中,節點和節點之間,進程之間的通訊方式叫IPC。面向數據(data-centric) vs 面向消息(Message passing)。基於 Socket 的消息傳輸是分布式系統中最主要的通信方式,分為 RPC 和 Web Services 兩大類。RPC 是面向函數的消息傳遞方式,Web Services 是面向服務的信息傳遞方式。

2 RPC詳解
2.1 RPC的結構
RPC主要由客戶端向服務端發起請求,服務端返回結果,其中包含了負載均衡,數據序列化,網絡傳輸,數據反序列化,協議編碼解碼等。還有個注冊中心,服務端注冊服務和函數到注冊中心,客戶端去注冊中心查找服務函數進行調用。

RPC的主要核心作用是
(1)RPC的服務函數尋址
服務端向注冊中心注冊服務信息和調用函數的CALLID,客戶端向注冊中心查詢服務器信息和函數的CALLID等信息。實現注冊和查找調用的功能。
(2)數據的序列化和反序列化
數據需要通過網絡傳輸,所以要將結構體數據類型轉化為字節流,然后通過網絡傳輸,在反序列化轉為結構體數據。序列化將對象轉換成二進制流的過程,反序列化將二進制流轉換成對象的過程。
(3)網路傳輸和協議
傳輸方式可以是 Socket,或者用 Asio,ZeroMQ,activemq,rabbitmq,Netty 。傳輸協議可以TCP,UDP,HTTP。
2.2 主流的RPC服務框架
目前流行的開源 RPC 框架還是比較多的,有阿里巴巴的 Dubbo、Facebook 的 Thrift、Google 的 gRPC、Twitter 的 Finagle 等。
下面重點介紹三種:
- gRPC:是 Google 公布的開源軟件,基於***的 HTTP 2.0 協議,並支持常見的眾多編程語言。RPC 框架是基於 HTTP 協議實現的,底層使用到了 Netty 框架的支持。
- Thrift:是 Facebook 的開源 RPC 框架,主要是一個跨語言的服務開發框架。
用戶只要在其之上進行二次開發就行,應用對於底層的 RPC 通訊等都是透明的。不過這個對於用戶來說需要學習特定領域語言這個特性,還是有一定成本的。
- Dubbo:是阿里集團開源的一個極為出名的 RPC 框架,在很多互聯網公司和企業應用中廣泛使用。協議和序列化框架都可以插拔是極其鮮明的特色。
3 IPC 進程間通訊
3.1 同計算機進程間通訊方式
https://www.cnblogs.com/zgq0/p/8780893.html
(1)管道:速度慢,容量有限,只有父子進程能通訊。pipe函數方式打開,read和write函數進行讀寫。
(2)命名管道FIFO:任何進程間都能通訊,但速度慢。mkfifo函數創建管道,open打開一個字符串表示的命名管道,進行讀寫,以設備文件的形式存在文件系統中。
(3)系統消息隊列:容量受到系統限制,且要注意第一次讀的時候,要考慮上一次沒有讀完數據的問題。
#include <sys/msg.h>
// 創建或打開消息隊列:成功返回隊列ID,失敗返回-1
int msgget(key_t key, int flag);
// 添加消息:成功返回0,失敗返回-1
int msgsnd(int msqid, const void *ptr, size_t size, int flag);
// 讀取消息:成功返回消息數據的長度,失敗返回-1
int msgrcv(int msqid, void *ptr, size_t size, long type,int flag);
// 控制消息隊列:成功返回0,失敗返回-1
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
(4)進程間同步信號量:不能傳遞復雜消息,只能用來同步。需要配合共享內存實現進程間數據傳輸。
#include <sys/sem.h>
// 創建或獲取一個信號量組:若成功返回信號量集ID,失敗返回-1
int semget(key_t key, int num_sems, int sem_flags);
// 對信號量組進行操作,改變信號量的值:成功返回0,失敗返回-1
int semop(int semid, struct sembuf semoparray[], size_t numops);
struct sembuf
{
short sem_num; // 信號量組中對應的序號,0~sem_nums-1
short sem_op; // 信號量值在一次操作中的改變量
short sem_flg; // IPC_NOWAIT, SEM_UNDO
}
// 控制信號量的相關信息cmd參數控制初始化,刪除
int semctl(int semid, int sem_num, int cmd, ...);
semctl函數中的cmd參數有多種命令。
SETVAL:用於初始化信號量為一個已知的值。所需要的值作為聯合semun的val成員來傳遞。在信號量第一次使用之前需要設置信號量。
IPC_RMID:刪除一個信號量集合。如果不刪除信號量,它將繼續在系統中存在,即使程序已經退出,它可能在你下次運行此程序時引發問題,而且信號量是一種有限的資源。
(5)共享內存區:能夠很容易控制容量,速度快,但要保持同步,比如一個進程在寫的時候,另一個進程要注意讀寫的問題,相當於線程中的線程安全.
#include <sys/shm.h>
// 創建或獲取一個共享內存:成功返回共享內存ID,失敗返回-1
int shmget(key_t key, size_t size, int flag);
// 連接共享內存到當前進程的地址空間:成功返回指向共享內存的指針,失敗返回-1
void *shmat(int shm_id, const void *addr, int flag);
// 斷開與共享內存的連接:成功返回0,失敗返回-1
int shmdt(void *addr);
// 控制共享內存的相關信息:例如cmd為IPC_RMID刪除共享內存。成功返回0,失敗返回-1
int shmctl(int shm_id, int cmd, struct shmid_ds *buf);
3.2 遠程進程間通訊
(1) socket TCP UDP。
(2) activemq,rabbitmq,zeromq,kafka等消息通訊方式。
(3) restfull接口 HTTP ,HTTPS。
