導航:首頁 > 操作系統 > linuxgrpc

linuxgrpc

發布時間:2022-11-16 22:16:39

python後端開發需要學什麼

第一階段:Python語言基礎


主要學習Python最基礎知識,如Python3、數據類型、字元串、函數、類、文件操作等。階段課程結束後,學員需要完成Pygame實戰飛機大戰、2048等項目。


第二階段:Python語言高級


主要學習Python庫、正則表達式、進程線程、爬蟲、遍歷以及MySQL資料庫。


第三階段:Pythonweb開發


主要學習HTML、CSS、JavaScript、jQuery等前端知識,掌握python三大後端框架(Django、 Flask以及Tornado)。需要完成網頁界面設計實戰;能獨立開發網站。


第四階段:linux基礎


主要學習Linux相關的各種命令,如文件處理命令、壓縮解壓命令、許可權管理以及Linux Shell開發等。


第五階段:Linux運維自動化開發


主要學習Python開發Linux運維、Linux運維報警工具開發、Linux運維報警安全審計開發、Linux業務質量報表工具開發、Kali安全檢測工具檢測以及Kali 密碼破解實戰。


第六階段:Python爬蟲


主要學習python爬蟲技術,掌握多線程爬蟲技術,分布式爬蟲技術。


第七階段:Python數據分析和大數據


主要學習numpy數據處理、pandas數據分析、matplotlib數據可視化、scipy數據統計分析以及python 金融數據分析;Hadoop HDFS、python Hadoop MapRece、python Spark core、python Spark SQL以及python Spark MLlib。


第八階段:Python機器學習


主要學習KNN演算法、線性回歸、邏輯斯蒂回歸演算法、決策樹演算法、樸素貝葉斯演算法、支持向量機以及聚類k-means演算法。


關於python後端開發需要學什麼的內容,青藤小編就和您分享到這里了。如果您對python編程有濃厚的興趣,希望這篇文章可以為您提供幫助。如果您還想了解更多關於python編程的技巧及素材等內容,可以點擊本站的其他文章進行學習。

Ⅱ 區塊鏈技術入門,涉及哪些編程語言

Go語言

Go語言(Golang)是谷歌2009年推出的一種全新的編程語言,可以在不損失應用程序性能的情況下降低代碼的復雜性。谷歌首席軟體工程師羅布派克(Rob Pike)說:「我們之所以開發Go,是因為過去10多年間軟體開發的難度令人沮喪。」

除比特幣是由C++開發以外,目前最主流坊的客戶端均有go語言開發,足以可見Go語言在整個區塊鏈行業的地位。

C++

C++ 進一步擴充和完善了 C 語言,是一種面向對象的程序設計語言。C++ 可運行於多種平台上,如 Windows、MAC 操作系統以及 UNIX 的各種版本。C++是一種使用十分廣泛的計算機程序設計語言。它是一種通用程序設計語言,支持多重編程模式,例如過程化程序設計、數據抽象、面向對象程序設計、泛型程序設計和設計模式等。

大多數的區塊鏈企業都選擇用C++編寫區塊鏈的底層,最著名的有比特幣、ripple等,主要體現的是強計算性。

Java

Java不同於一般的編譯語言或解釋型語言。它首先將源代碼編譯成位元組碼,然後依賴各種不同平台上的虛擬機來解釋執行位元組碼,從而實現了「一次編寫,到處運行」的跨平台特性。而區塊鏈項目的開發,對Java有著明顯的依賴性。

其他的還有Python、系統架構、以太坊、Linux、hyperledger、JavaScript等都會有涉及。

Ⅲ 服務產生大量TIME_WAIT如何解決

當TIME_WAIT超過linux系統tw數量的閥值(可用數量不會大於65535),系統會把多餘的time-wait socket 刪除掉,並且顯示警告信息,如果是NAT網路環境又存在大量訪問,會產生各種連接不穩定斷開的情況,從而影響了服務的穩定性。

一、狀態的產生

要解決TIME_WAIT狀態過多的問題,先來研究下TIME_WAIT狀態的產生,下面是TCP連接斷開時的四次揮手狀態轉換圖,說明一點,途中顯示的是客戶端主動斷開連接,tcp連接也可以由伺服器端主動斷開連接。我們先來描述一下斷開的狀態:

1)客戶端進程發出連接釋放報文,並且停止發送數據。釋放數據報文首部,FIN=1,其序列號為seq=u(等於前面已經傳送過來的數據的最後一個位元組的序號加1),此時,客戶端進入FIN-WAIT-1(終止等待1)狀態。 TCP規定,FIN報文段即使不攜帶數據,也要消耗一個序號。

2)伺服器收到連接釋放報文,發出確認報文,ACK=1,ack=u+1,並且帶上自己的序列號seq=v,此時,服務端就進入了CLOSE-WAIT(關閉等待)狀態。TCP伺服器通知高層的應用進程,客戶端向伺服器的方向就釋放了,這時候處於半關閉狀態,即客戶端已經沒有數據要發送了,但是伺服器若發送數據,客戶端依然要接受。這個狀態還要持續一段時間,也就是整個CLOSE-WAIT狀態持續的時間。

3)客戶端收到伺服器的確認請求後,此時,客戶端就進入FIN-WAIT-2(終止等待2)狀態,等待伺服器發送連接釋放報文(在這之前還需要接受伺服器發送的最後的數據)。

4)伺服器將最後的數據發送完畢後,就向客戶端發送連接釋放報文,FIN=1,ack=u+1,由於在半關閉狀態,伺服器很可能又發送了一些數據,假定此時的序列號為seq=w,此時,伺服器就進入了LAST-ACK(最後確認)狀態,等待客戶端的確認。

5)客戶端收到伺服器的連接釋放報文後,必須發出確認,ACK=1,ack=w+1,而自己的序列號是seq=u+1,此時,客戶端就進入了TIME-WAIT(時間等待)狀態。注意此時TCP連接還沒有釋放,必須經過2MSL(最長報文段壽命,RFC規定一個MSL為2min,linux中一般設置為30s)的時間後,當客戶端撤銷相應的TCB後,才進入CLOSED狀態。

6)伺服器只要收到了客戶端發出的確認,立即進入CLOSED狀態。同樣,撤銷TCB後,就結束了這次的TCP連接。可以看到,伺服器結束TCP連接的時間要比客戶端早一些。

可以看到TIME_WAIT狀態產生是在tcp連接主動關閉的一端產生的正常tcp狀態,超過兩個MSL之後,就會關閉,釋放佔用的埠。基於以上的分析我們可以推斷,在我們的應用中產生大量TIME_WAIT狀態的根本原因是頻繁創建斷開連接TCP連接。要解決TIME_WATIT狀態過多的問題,就要分析我們的應用把頻繁創建的短連接改為長連接。

二、常見的短連接產生的場景

1.服務連接服務

後台業務伺服器,通常需要調用redis、mysql以及其他http服務和grpc服務,在服務相互調用中,如果使用的是短連接,高並發時就會產生大量TIME_WAIT,如何解決呢?一般情況下,redis等客戶端會有連接池,我們要做的是設置好相關的連接服用參數,一般會有連接數、連接重用時間、連接空閑數等。所以在應用中通過設置合理的連接池參數可以避免TIME_WAIT狀態過多的問題:

1.檢查http連接池

2.檢查grpc連接池

3.檢查redis連接池

4.檢查mysql連接池

...

我們來查看一個mysql連接池配置信息,最大連接數100,最大空閑連接數10,測試的並發數50,產生的效果如下:

可以看到TIME_WAIT狀態快速上升,我們查看redis客戶端的連接情況:

{MaxOpenConnections:100 OpenConnections:1 InUse:0 Idle:1 WaitCount:0 WaitDuration:0s MaxIdleClosed:0 MaxLifetimeClosed:0}

{MaxOpenConnections:100 OpenConnections:17 InUse:15 Idle:2 WaitCount:0 WaitDuration:0s MaxIdleClosed:48 MaxLifetimeClosed:0}

{MaxOpenConnections:100 OpenConnections:51 InUse:44 Idle:7 WaitCount:0 WaitDuration:0s MaxIdleClosed:82 MaxLifetimeClosed:0}

{MaxOpenConnections:100 OpenConnections:51 InUse:50 Idle:1 WaitCount:0 WaitDuration:0s MaxIdleClosed:90 MaxLifetimeClosed:0}

{MaxOpenConnections:100 OpenConnections:50 InUse:49 Idle:1 WaitCount:0 WaitDuration:0s MaxIdleClosed:126 MaxLifetimeClosed:0}

{MaxOpenConnections:100 OpenConnections:51 InUse:49 Idle:2 WaitCount:0 WaitDuration:0s MaxIdleClosed:131 MaxLifetimeClosed:0}

{MaxOpenConnections:100 OpenConnections:50 InUse:49 Idle:1 WaitCount:0 WaitDuration:0s MaxIdleClosed:181 MaxLifetimeClosed:0}

{MaxOpenConnections:100 OpenConnections:51 InUse:51 Idle:0 WaitCount:0 WaitDuration:0s MaxIdleClosed:233 MaxLifetimeClosed:0}

{MaxOpenConnections:100 OpenConnections:51 InUse:51 Idle:0 WaitCount:0 WaitDuration:0s MaxIdleClosed:240 MaxLifetimeClosed:0}

{MaxOpenConnections:100 OpenConnections:46 InUse:38 Idle:8 WaitCount:0 WaitDuration:0s MaxIdleClosed:296 MaxLifetimeClosed:0}

{MaxOpenConnections:100 OpenConnections:51 InUse:50 Idle:1 WaitCount:0 WaitDuration:0s MaxIdleClosed:313 MaxLifetimeClosed:0}

{MaxOpenConnections:100 OpenConnections:51 InUse:50 Idle:1 WaitCount:0 WaitDuration:0s MaxIdleClosed:363 MaxLifetimeClosed:0}

{MaxOpenConnections:100 OpenConnections:51 InUse:50 Idle:1 WaitCount:0 WaitDuration:0s MaxIdleClosed:409 MaxLifetimeClosed:0}

{MaxOpenConnections:100 OpenConnections:50 InUse:48 Idle:2 WaitCount:0 WaitDuration:0s MaxIdleClosed:438 MaxLifetimeClosed:0}

{MaxOpenConnections:100 OpenConnections:49 InUse:49 Idle:0 WaitCount:0 WaitDuration:0s MaxIdleClosed:494 MaxLifetimeClosed:0}

分析發現MaxIdleClosed數據持續上升,此為mysql客戶端連接池配置不合理產生大量TIME_WAIT狀態的例子

2.網路抖動

      網路情況不好時,如果主動方無TIME_WAIT等待,關閉前個連接後,主動方與被動方又建立起新的TCP連接,這時被動方重傳或延時過來的FIN包過來後會直接影響新的TCP連接。同樣網路情況不好並且無TIME_WAIT等待,關閉連接後無新連接,當接收到被動方重傳或延遲的FIN包後,會給被動方回一個RST包,可能會影響被動方其它的服務連接。

網路抖動問題比較好排查,直接使用ping命令可以觀察到。

Ⅳ docker構建與運行grpc-gateway項目

趁著實習摸魚(啊不是)之際,簡單學習一下曾經很想入門的 docker 。

在上一篇有關 DevOps 的博客中,曾提到:docker 容器的出現,推動了 DevOps 的發展。而 docker 的功勞不僅如此,它的出現可以說是:具有劃時代的意義。

很早之前,我就想學習 docker 。但,那時 docker 還未完全支持 Windows 平台,奈何電腦又太差,不敢給 Linux 虛擬機分配太高配置,導致 docker 學習一直被擱置。

如今,docker 已經推出了完美的 Windows 桌面版,而公司電腦配置也完全足夠。天時地利人和,此時不學,更待何時。

同時,作為實踐,我將用 docker 構建和運行 grpc-gateway 項目。

環境如下:

常用的命令示例:

docker 中很多命令是有相同效果的,比如: docker images == docker image ls 、 docker rmi == docker image rm 、 docker ps -a == docker container ls -a 等,可自行嘗試。

Dockerfile 用於構建鏡像。鏡像既可以通過容器 commit 構建,也可以通過 Dockerfile 構建,但更推薦後者(前者黑盒)。

Dockerfile 常用命令如下:

Dockerfile 編寫指南: 一般性的指南和建議

項目地址: https://gitee.com/dounineli/grpcDemo.git

Dockerfile 如下:

利用 Dockerfile 的多階段構建,減少鏡像體積(編譯型語言,運行環境不需要復雜的編譯環境)。

總共分為三個階段:

生成鏡像時,我們只需構建 server 和 gateway 兩個運行階段即可,兩個階段依賴的 builder 階段鏡像會自動構建,並在構建完成後自動刪除。分別得到 grpc 服務端和 grpc-gateway 網關鏡像:

由於 grpc-gateway 網關需要訪問 grpc 服務端,因此:

用 postman 進行介面測試:

不得不說,docker 的出現,讓很多事情變得輕而易舉。舉一個很簡單的例子:如果你想在電腦上安裝 MySQL ,直接運行 docker 的 MySQL 鏡像即可,幾行命令搞定,再也不用麻煩地配置環境了。

Ⅳ 深入剖析Kubernetes

容器,其實是一種特殊的進程而已。很多人會把Docker項目稱為輕量級虛擬化技術的原因,實際上就是把虛擬機的概念套用在了容器上。

Linux 容器中用來實現「隔離」的技術手段:Namespace。Namespace 技術實際上修改了應用進程看待整個計算機「視圖」,即它的「視線」被操作系統做了限制,只能「看到」某些指定的內容。「敏捷」和「高性能」是容器相較於虛擬機最大的優勢,也是它能夠在 PaaS 這種更細粒度的資源管理平台上大行其道的重要原因。

基於 Linux Namespace 的隔離機制相比於虛擬化技術也有很多不足之處,其中最主要的問題就是:隔離得不徹底。
首先,既然容器只是運行在宿主機上的一種特殊的進程,那麼多個容器之間使用的就還是同一個宿主機的操作系統內核。其次,在 Linux 內核中,有很多資源和對象是不能被 Namespace 化的,最典型的例子就是:時間。

容器的「限制」問題
Linux Cgroups 就是 Linux 內核中用來為進程設置資源限制的一個重要功能。它最主要的作用,就是限制一個進程組能夠使用的資源上限,包括 CPU、內存、磁碟、網路帶寬等等。

Docker 在鏡像的設計中,引入了層(layer)的概念。也就是說,用戶製作鏡像的每一步操作,都會生成一個層,也就是一個增量 rootfs。
通過「分層鏡像」的設計,以 Docker 鏡像為核心,來自不同公司、不同團隊的技術人員被緊密地聯系在了一起。而且,由於容器鏡像的操作是增量式的,這樣每次鏡像拉取、推送的內容,比原本多個完整的操作系統的大小要小得多;而共享層的存在,可以使得所有這些容器鏡像需要的總空間,也比每個鏡像的總和要小。這樣就使得基於容器鏡像的團隊協作,要比基於動則幾個 GB 的虛擬機磁碟鏡像的協作要敏捷得多。

一個進程,可以選擇加入到某個進程已有的 Namespace 當中,從而達到「進入」這個進程所在容器的目的,這正是 docker exec 的實現原理。
Volume 機制,允許你將宿主機上指定的目錄或者文件,掛載到容器裡面進行讀取和修改操作。
一個正確的時機,進行一次綁定掛載,Docker 就可以成功地將一個宿主機上的目錄或文件,不動聲色地掛載到容器中。

在整個「開發 - 測試 - 發布」的流程中,真正承載著容器信息進行傳遞的,是容器鏡像,而不是容器運行時。這個重要假設,正是容器技術圈在 Docker 項目成功後不久,就迅速走向了「容器編排」這個「上層建築」的主要原因:作為一家雲服務商或者基礎設施提供商,我只要能夠將用戶提交的 Docker 鏡像以容器的方式運行起來,就能成為這個非常熱鬧的容器生態圖上的一個承載點,從而將整個容器技術棧上的價值,沉澱在我的這個節點上。

從一個開發者和單一的容器鏡像,到無數開發者和龐大的容器集群,容器技術實現了從「容器」到「容器雲」的飛躍,標志著它真正得到了市場和生態的認可。
容器就從一個開發者手裡的小工具,一躍成為了雲計算領域的絕對主角;而能夠定義容器組織和管理規范的「容器編排」技術,則當仁不讓地坐上了容器技術領域的「頭把交椅」。

Kubernetes 項目依託著 Borg 項目的理論優勢,才在短短幾個月內迅速站穩了腳跟,進而確定了一個如下圖所示的全局架構:

在 Kubernetes 項目中,kubelet 主要負責同容器運行時(比如 Docker 項目)打交道。
此外,kubelet 還通過 gRPC 協議同一個叫作 Device Plugin 的插件進行交互。
而 kubelet 的另一個重要功能,則是調用網路插件和存儲插件為容器配置網路和持久化存儲
從一開始,Kubernetes 項目就沒有像同時期的各種「容器雲」項目那樣,把 Docker 作為整個架構的核心,而僅僅把它作為最底層的一個容器運行時實現。
Kubernetes 項目最主要的設計思想是,從更宏觀的角度,以統一的方式來定義任務之間的各種關系,並且為將來支持更多種類的關系留有餘地。
在 Kubernetes 項目中,這些容器則會被劃分為一個「Pod」,Pod 里的容器共享同一個 Network Namespace、同一組數據卷,從而達到高效率交換信息的目的。Pod 是 Kubernetes 項目中最基礎的一個對象。Kubernetes 項目的做法是給 Pod 綁定一個 Service 服務,而 Service 服務聲明的 IP 地址等信息是「終生不變」的。這個 Service 服務的主要作用,就是作為 Pod 的代理入口(Portal),從而代替 Pod 對外暴露一個固定的網路地址。
圍繞著容器和 Pod 不斷向真實的技術場景擴展,我們就能夠摸索出一幅如下所示的 Kubernetes 項目核心功能的「全景圖」。

在 Kubernetes 項目中,我們所推崇的使用方法是:首先,通過一個「編排對象」,比如 Pod、Job、CronJob 等,來描述你試圖管理的應用;然後,再為它定義一些「服務對象」,比如 Service、Secret、Horizontal Pod Autoscaler(自動水平擴展器)等。這些對象,會負責具體的平台級功能。這種使用方法,就是所謂的「聲明式 API」。這種 API 對應的「編排對象」和「服務對象」,都是 Kubernetes 項目中的 API 對象(API Object)。

Ⅵ grpc-源碼-網路模型

golang 的grpc庫是 https://github.com/grpc/grpc-go

grpc server端和服務端網路協議是在tcp基礎上的 http2協議,http2協議負責grpc基礎的數據傳輸、連接管理、流控等, 具體的業務層service 定義是基於 protobuf的

整個的網路過程和關鍵點如下圖

說明:

TCP KeepAlive則是為了探測/保鮮(心跳檢測,連接錯誤檢測):用於探測對端的狀態及網路情況(有可能客戶端崩潰、強制關閉了應用、主機不可達等等),也有保鮮功能。比如如防止nat超時。TCP keepalive則是通過發送發送偵測包實現。在Linux中通過net.ipv4.tcp_keepalive_intvl,net.ipv4.tcp_keepalive_probes,net.ipv4.tcp_keepalive_time配置。比如gnet 網路框架中的實現 https://github.com/panjf2000/gnet/blob/master/netpoll/netpoll_unix.go

Ⅶ Protobuf協議實現原理

protobuf 是Google開源的一款支持跨平台、語言中立的結構化數據描述和高性能序列化協議,此協議完全基於二進制,所以性能要遠遠高於JSON/XML。由於出色的傳輸性能所以常見於微服務之間的通訊,其中最為著名的是Google開源的 gRPC 框架。

那麼protobuf是如何實現高性能的,又是如何實現數據的編碼和解碼的呢?

基於128bits的數據存儲方式(Base 128 Varints)

Varint 是一種緊湊的表示數字的方法。它用一個或多個位元組來表示一個數字,值越小的數字使用越少的位元組數。這能減少用來表示數字的位元組數。

比如對於 int32 類型的數字,一般需要 4 個 byte 來表示。但是採用 Varint,對於很小的 int32 類型的數字,則可以用 1 個 byte 來表示。當然凡事都有好的也有不好的一面,採用 Varint 表示法,大的數字則需要 5 個 byte 來表示。從統計的角度來說,一般不會所有的消息中的數字都是大數,因此大多數情況下,採用 Varint 後,可以用更少的位元組數來表示數字信息

Varint 中的每個 byte 的最高位 bit 有特殊的含義,如果該位為 1,表示後續的 byte 也是該數字的一部分,如果該位為 0,則結束。其他的 7 個 bit 都用來表示數字。因此小於 128 的數字都可以用一個 byte 表示。大於 128 的數字,比如 300,會用兩個位元組來表示:1010 1100 0000 0010。

另外如果從數據大小角度來看,這種表示方式比實現的數據多了一個bit, 所以其實際傳輸大小就多14%(1/7 = 0.142857143)。

數字1表示方式:0000 0001

對於小的數據比較好理解,正常情況下1的二進制是 0000 0001,使用128bits表示的話,首位結束標識位也是0,所以兩者結果是一樣的 0 000 0001。

數字 300 表示方式:1010 1100 0000 0010

<figcaption>300</figcaption>

這個有點不太好理解了,這是因為原本用一個位元組(8bit)就可以表示,但由於使用128bits表示方法,需要對每個位元組的最高位添加一個結束標識位來表示,所以一個位元組已經不夠用了,需要佔用兩個位元組來表示,其中兩個位元組最高位都是結束標識位。

如果正向推算的話,我們知道數字300的二進制值 1 0010 1100,用兩個位元組表示完整值則為
0000 0001 0010 1100 # 二進制
_000 0010 _010 1100 # 二進制每個位元組的最高位向左移動一個位置,放入結束標識位
0 000 0010 1 010 1100 # 轉換為128bits方式,1:結束,0:未結束
1 010 1100 0 000 0010 # 轉換為 小端位元組序 , 低位元組在前,高位元組在後

注意這里是先添加結束標識符,然後再轉為小端位元組序。

消息經過序列化後會成為一個二進制數據流,該流中的數據為一系列的 Key-Value 對。如下圖所示:

採用這種 Key-Pair 結構無需使用分隔符來分割不同的 Field。 對於可選的 Field,如果消息中不存在該 field,那麼在最終的 Message Buffer 中就沒有該 field ,這些特性都有助於節約消息本身的大小。

Key 用來標識具體的 field,在解包的時候,客戶端創建一個結構對象,Protocol Buffer 從數據流中讀取並反序列化數據,並根據 Key 就可以知道相應的 Value 應該對應於結構體中的哪一個 field。

而Key也是由以下兩部分組成

Key 的定義如下:

| 1 | (field_number << 3) | wire_type |

可以看到 Key 由兩部分組成。第一部分是 field_number 。第二部分為 wire_type 。表示 Value 的傳輸類型。

一個位元組的低3位表示數據類型,其它位則表示欄位序號。

Wire Type 可能的類型如下表所示:

在我們的例子當中,field id 所採用的數據類型為 int32,因此對應的 wire type 為 0。細心的讀者或許會看到在 Type 0 所能表示的數據類型中有 int32 和 sint32 這兩個非常類似的數據類型。Google Protocol Buffer 區別它們的主要意圖也是為了減少 encoding 後的位元組數。

每個數據頭同樣採用128bits方式,一般1個位元組就足夠了,

本例中欄位a 的 序號是1

如上創建了 Test1 的結構並且把 a 的值設為 2,序列化後的二進制數據為
0 000 1000 0 000 0010

Key 部分是 0000 1000
value 部分是 0000 0010, 其中位元組最高位是結束標識位,即10進制的2,我們在轉換的時候統一將符號位轉為0即可。

協議規定數據頭的低3位表示wire_type, 其它欄位表示欄位序號field_number,因此
0000 1000
_000 1000 # 去掉結束標識符位
_000 1000 # 000 表示數據類型, 這里是Varint
_000 1000 # 0001 這四位表示欄位序號

https://www.ibm.com/developerworks/cn/linux/l-cn-gpb/

原文: https://blog.haohtml.com/archives/20215

Ⅷ 【知識總結】6.服務注冊發現框架比較(Consul/Zookeeper/etcd/Eureka)

服務發現就是服務提供者將自己提供的地址post或者update到服務中介,服務消費者從服務中介那裡get自己想要的服務的地址。

但是有兩個問題:
第一個問題:如果有一個服務提供者宕機,那麼中介的key/value中會有一個不能訪問的地址,該怎麼辦?

心跳機制: 服務提供者需要每隔5秒左右向服務中介匯報存活,服務中介將服務地址和匯報時間記錄在zset數據結構的value和score中。服務中介需要每隔10秒左右檢查zset數據結構,踢掉匯報時間嚴重落後的地址。這樣就可以保證服務列表中地址的有效性。

第二個問題是服務地址變動時如何通知消費者。有兩種解決方案。

第一種是輪詢,消費者每隔幾秒查詢服務列表是否有改變。如果服務地址很多,查詢會很慢。這時候可以引入服務版本號機制,給每個服務提供一個版本號,在服務變動時,遞增這個版本號。消費者只需要輪詢這個版本號的變動即可知道服務列表是否發生了變化。

第二種是採用pubsub。這種方式及時性要明顯好於輪詢。缺點是每個pubsub都會佔用消費者一個線程和一個額外的連接。為了減少對線程和連接的浪費,我們使用單個pubsub廣播全局版本號的變動。所謂全局版本號就是任意服務列表發生了變動,這個版本號都會遞增。接收到版本變動的消費者再去檢查各自的依賴服務列表的版本號是否發生了變動。這種全局版本號也可以用於第一種輪詢方案。

CAP理論
CAP理論是分布式架構中重要理論

關於P的理解,我覺得是在整個系統中某個部分,掛掉了,或者宕機了,並不影響整個系統的運作或者說使用,而可用性是,某個系統的某個節點掛了,但是並不影響系統的接受或者發出請求,CAP 不可能都取,只能取其中2個。原因是

(1)如果C是第一需求的話,那麼會影響A的性能,因為要數據同步,不然請求結果會有差異,但是數據同步會消耗時間,期間可用性就會降低。

(2)如果A是第一需求,那麼只要有一個服務在,就能正常接受請求,但是對與返回結果變不能保證,原因是,在分布式部署的時候,數據一致的過程不可能想切線路那麼快。

(3)再如果,同事滿足一致性和可用性,那麼分區容錯就很難保證了,也就是單點,也是分布式的基本核心,好了,明白這些理論,就可以在相應的場景選取服務注冊與發現了。

平時經常用到的服務發現的產品進行下特性的對比,首先看下結論:

補充:
(1)運維和開發如果是 Java 更熟,也更多 Java 的應用,那毫無疑問應該用 ZK;如果是搞 Go 的,那麼還是 etcd 吧,畢竟有時候遇到問題還是要看源碼的。
(2)在創建一百萬個或更多鍵時,etcd可以比Zookeeper或Consul穩定地提供更好的吞吐量和延遲。此外,它實現了這一目標,只有一半的內存,顯示出更高的效率。但是,還有一些改進的餘地,Zookeeper設法通過etcd提供更好的最小延遲,代價是不可預測的平均延遲。
(3)
一致性協議: etcd 使用 Raft 協議,Zookeeper 使用 ZAB(類PAXOS協議),前者容易理解,方便工程實現;
運維方面:etcd 方便運維,Zookeeper 難以運維;
數據存儲:etcd 多版本並發控制(MVCC)數據模型 , 支持查詢先前版本的鍵值對
項目活躍度:etcd 社區與開發活躍,Zookeeper 感覺已經快死了;
API:etcd 提供 HTTP+JSON, gRPC 介面,跨平台跨語言,Zookeeper 需要使用其客戶端;
訪問安全方面:etcd 支持 HTTPS 訪問,Zookeeper 在這方面缺失;

與 Eureka 有所不同,Apache Zookeeper 在設計時就緊遵CP原則,即任何時候對 Zookeeper 的訪問請求能得到一致的數據結果,同時系統對網路分割具備容錯性,但是 Zookeeper 不能保證每次服務請求都是可達的。

從 Zookeeper 的實際應用情況來看,在使用 Zookeeper 獲取服務列表時,如果此時的 Zookeeper 集群中的 Leader 宕機了,該集群就要進行 Leader 的選舉,又或者 Zookeeper 集群中半數以上伺服器節點不可用(例如有三個節點,如果節點一檢測到節點三掛了 ,節點二也檢測到節點三掛了,那這個節點才算是真的掛了),那麼將無法處理該請求。所以說,Zookeeper 不能保證服務可用性。

當然,在大多數分布式環境中,尤其是涉及到數據存儲的場景,數據一致性應該是首先被保證的,這也是 Zookeeper 設計緊遵CP原則的另一個原因。

但是對於服務發現來說,情況就不太一樣了,針對同一個服務,即使注冊中心的不同節點保存的服務提供者信息不盡相同,也並不會造成災難性的後果。

因為對於服務消費者來說,能消費才是最重要的,消費者雖然拿到可能不正確的服務實例信息後嘗試消費一下,也要勝過因為無法獲取實例信息而不去消費,導致系統異常要好(淘寶的雙十一,京東的618就是緊遵AP的最好參照)。

當master節點因為網路故障與其他節點失去聯系時,剩餘節點會重新進行leader選舉。問題在於,選舉leader的時間太長,30~120s,而且選舉期間整個zk集群都是不可用的,這就導致在選舉期間注冊服務癱瘓。

在雲部署環境下, 因為網路問題使得zk集群失去master節點是大概率事件,雖然服務能最終恢復,但是漫長的選舉事件導致注冊長期不可用是不能容忍的。

Spring Cloud Netflix 在設計 Eureka 時就緊遵AP原則。Eureka是在Java語言上,基於Restful Api開發的服務注冊與發現組件,由Netflix開源。遺憾的是,目前Eureka僅開源到1.X版本,2.X版本已經宣布閉源。

Eureka Server 也可以運行多個實例來構建集群,解決單點問題,但不同於 ZooKeeper 的選舉 leader 的過程,Eureka Server 採用的是Peer to Peer 對等通信。這是一種去中心化的架構,無 master/slave 之分,每一個 Peer 都是對等的。在這種架構風格中,節點通過彼此互相注冊來提高可用性,每個節點需要添加一個或多個有效的 serviceUrl 指向其他節點。每個節點都可被視為其他節點的副本。

在集群環境中如果某台 Eureka Server 宕機,Eureka Client 的請求會自動切換到新的 Eureka Server 節點上,當宕機的伺服器重新恢復後,Eureka 會再次將其納入到伺服器集群管理之中。當節點開始接受客戶端請求時,所有的操作都會在節點間進行復制(replicate To Peer)操作,將請求復制到該 Eureka Server 當前所知的其它所有節點中。

當一個新的 Eureka Server 節點啟動後,會首先嘗試從鄰近節點獲取所有注冊列表信息,並完成初始化。Eureka Server 通過 getEurekaServiceUrls() 方法獲取所有的節點,並且會通過心跳契約的方式定期更新。

默認情況下,如果 Eureka Server 在一定時間內沒有接收到某個服務實例的心跳(默認周期為30秒),Eureka Server 將會注銷該實例(默認為90秒, eureka.instance.lease-expiration-ration-in-seconds 進行自定義配置)。

當 Eureka Server 節點在短時間內丟失過多的心跳時,那麼這個節點就會進入自我保護模式。

Eureka的集群中,只要有一台Eureka還在,就能保證注冊服務可用(保證可用性),只不過查到的信息可能不是最新的(不保證強一致性)。除此之外,Eureka還有一種自我保護機制,如果在15分鍾內超過85%的節點都沒有正常的心跳,那麼Eureka就認為客戶端與注冊中心出現了網路故障,此時會出現以下幾種情況:

Eureka不再從注冊表中移除因為長時間沒有收到心跳而過期的服務;
Eureka仍然能夠接受新服務注冊和查詢請求,但是不會被同步到其它節點上(即保證當前節點依然可用);
當網路穩定時,當前實例新注冊的信息會被同步到其它節點中;
因此,Eureka可以很好的應對因網路故障導致部分節點失去聯系的情況,而不會像zookeeper那樣使得整個注冊服務癱瘓。

Consul 是 HashiCorp 公司推出的開源工具,用於實現分布式系統的服務發現與配置。Consul 使用 Go 語言編寫,因此具有天然可移植性(支持Linux、windows和Mac OS X)。
Consul採用主從模式的設計,使得集群的數量可以大規模擴展,集群間通過RPC的方式調用(HTTP和DNS)。

Consul 內置了服務注冊與發現框架、分布一致性協議實現、健康檢查、Key/Value 存儲、多數據中心方案,不再需要依賴其他工具(比如 ZooKeeper 等),使用起來也較為簡單。

Consul 遵循CAP原理中的CP原則,保證了強一致性和分區容錯性,且使用的是Raft演算法,比zookeeper使用的Paxos演算法更加簡單。雖然保證了強一致性,但是可用性就相應下降了,例如服務注冊的時間會稍長一些,因為 Consul 的 raft 協議要求必須過半數的節點都寫入成功才認為注冊成功 ;在leader掛掉了之後,重新選舉出leader之前會導致Consul 服務不可用。

默認依賴於SDK

Consul本質上屬於應用外的注冊方式,但可以通過SDK簡化注冊流程。而服務發現恰好相反,默認依賴於SDK,但可以通過Consul Template(下文會提到)去除SDK依賴。

Consul Template

Consul,默認服務調用者需要依賴Consul SDK來發現服務,這就無法保證對應用的零侵入性。

所幸通過 Consul Template ,可以定時從Consul集群獲取最新的服務提供者列表並刷新LB配置(比如nginx的upstream),這樣對於服務調用者而言,只需要配置一個統一的服務調用地址即可。

Consul強一致性(C)帶來的是:

Eureka保證高可用(A)和最終一致性:

其他方面,eureka就是個servlet程序,跑在servlet容器中; Consul則是go編寫而成。

etcd是一個採用http協議的分布式鍵值對存儲系統,因其易用,簡單。很多系統都採用或支持etcd作為服務發現的一部分,比如kubernetes。但正事因為其只是一個存儲系統,如果想要提供完整的服務發現功能,必須搭配一些第三方的工具。

比如配合etcd、Registrator、confd組合,就能搭建一個非常簡單而強大的服務發現框架。但這種搭建操作就稍微麻煩了點,尤其是相對consul來說。所以etcd大部分場景都是被用來做kv存儲,比如kubernetes。

etcd 比較多的應用場景是用於服務發現,服務發現 (Service Discovery) 要解決的是分布式系統中最常見的問題之一,即在同一個分布式集群中的進程或服務如何才能找到對方並建立連接。和 Zookeeper 類似,etcd 有很多使用場景,包括:
配置管理
服務注冊發現
選主
應用調度
分布式隊列
分布式鎖

按照官網給出的數據, 在 2CPU,1.8G 內存,SSD 磁碟這樣的配置下,單節點的寫性能可以達到 16K QPS, 而先寫後讀也能達到12K QPS。這個性能還是相當可觀。

etcd 提供了 etcdctl 命令行工具 和 HTTP API 兩種交互方法。etcdctl命令行工具用 go 語言編寫,也是對 HTTP API 的封裝,日常使用起來也更容易。所以這里我們主要使用 etcdctl 命令行工具演示。

(1)注冊中心ZooKeeper、Eureka、Consul 、Nacos對比
https://zhuanlan.hu.com/p/165217227?utm_source=wechat_session
(2)常用的服務發現對比(Consul、zookeeper、etcd、eureka)
https://blog.csdn.net/gaohe7091/article/details/101197107

Ⅸ 在Ubuntu的環境下怎麼交叉編譯grpc到cortex-a9架構

1、 解壓工具鏈壓縮包
$ cd ~
$ mkdir toolchain
$ cd toolchain
gcc-4.6.4.tar.xz拷貝到toolchain目錄下並解壓
$ tar xvf gcc-4.6.4.tar.xz

2、 環境變數的添加
修改文件/etc/bash.bashrc添加如下內容
export PATH=$PATH:/home/linux/toolchain/gcc-4.6.4/bin
重啟配置文件
$ source /etc/bash.bashrc

Ⅹ 北大青鳥設計培訓:linux編程應該掌握哪些編程開發工具

隨著對linux系統的不斷普及和應用,我們在linux編程方面也取得了很大的進展,今天我們就一起來了解一下,在linux編程開發領域都有哪些開發工具值得我們學習和掌握。
但大多數人使用Nginx都停留在這幾個級別:一:使用Nginx配置簡單的反向代理服務或者靜態資源服務,當擴展功能時發現新增的指令Nginx不支持,但又不懂如何增加Nginx模塊,如何分析access日誌。
二:可以根據源碼定製安裝Nginx,對網上流傳的大眾配置做一些個性化的修改,但遇到修改proxy_pass後的URL上游服務不正常等問題時就束手無策,不清楚Nginx各個目錄的意義,也不清楚Nginx的進程結構。
三:能夠順暢地使用Nginx的常用功能,但不清楚三方模塊發生沖突時的解決方案、stale過期緩存的用法、Nginx諸多變數是如何被賦值的、聽說if指令是邪惡的卻不知道它的設計理念及正確用法等等。
四:可以正確地使用Nginx的功能及三方模塊,並按照網路上常見的優化參數優化性能,但對如何系統化地優化性能沒有頭緒,對於Nginx、Linux提供的內存緩沖區、網路類等諸多指令和參數的優化沒有頭緒。
五:可以熟練使用Nginx,但對OpenResty的Lua模塊如何與Nginx結合使用以及對Nginx性能影響不太清楚,對Nginx源碼的理解沒有達到由點到面的程度。
六、提高Nginx能力需要從以下方面開始1、深入理解Nginx架構了解事件驅動機制是深入優化Nginx性能、判定三方模塊性能的基礎。
而了解Nginx的進程結構,則是我們對Nginx做日常維護的必要條件,也是我們優化Nginx性能的理論基礎。
另外,變數是Nginx實現模塊間解耦合的關鍵。
這些知識都需要我們牢固掌握,為後面的進階學習打下堅實基礎。
2、對HTTP模塊要了如指掌HTTP請求處理過程中分為11個階段。
理解每個HTTP模塊所處的階段,並清楚該模塊在這一階段中的位置順序,有助於我們定位指令不生效或者與預期功能不符等問題,提高定位各種Bug的效率,也可以幫我們熟悉缺乏文檔的三方模塊。
3、反向代理與負載均衡反向代理有一套通用的處理流程,鄭州IT培訓http://www.kmbdqn.cn/認為需要掌握反向代理處理請求的完整流程,能讓我們熟練使用HTTP協議反向代理,以及熟悉如memcached、gRPC等同類的反向代理,在優化性能時,也能對相關緩存、超時等指令更有針對性的做個性化配置。

閱讀全文

與linuxgrpc相關的資料

熱點內容
dvd光碟存儲漢子演算法 瀏覽:757
蘋果郵件無法連接伺服器地址 瀏覽:963
phpffmpeg轉碼 瀏覽:671
長沙好玩的解壓項目 瀏覽:145
專屬學情分析報告是什麼app 瀏覽:564
php工程部署 瀏覽:833
android全屏透明 瀏覽:737
阿里雲伺服器已開通怎麼辦 瀏覽:803
光遇為什麼登錄時伺服器已滿 瀏覽:302
PDF分析 瀏覽:485
h3c光纖全工半全工設置命令 瀏覽:143
公司法pdf下載 瀏覽:382
linuxmarkdown 瀏覽:350
華為手機怎麼多選文件夾 瀏覽:683
如何取消命令方塊指令 瀏覽:350
風翼app為什麼進不去了 瀏覽:778
im4java壓縮圖片 瀏覽:362
數據查詢網站源碼 瀏覽:150
伊克塞爾文檔怎麼進行加密 瀏覽:892
app轉賬是什麼 瀏覽:163