自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

淺談PHP微服務(wù)集群搭建

開發(fā) 后端
近些年微服務(wù)架構(gòu)大行其道,趁著最近有時間,來搗鼓搗鼓微服務(wù)是怎么一回事。微服務(wù)架構(gòu)是一種架構(gòu)模式,它提倡將單一應(yīng)用程序劃分成一組小的服務(wù),服務(wù)之間相互協(xié)調(diào)、互相配合,為用戶提供最終價值。

 近些年微服務(wù)架構(gòu)大行其道,趁著最近有時間,來搗鼓搗鼓微服務(wù)是怎么一回事。

[[277122]]

微服務(wù)架構(gòu)

微服務(wù)的概念由 Martin Fowler 于2014年3月提出:

微服務(wù)架構(gòu)是一種架構(gòu)模式,它提倡將單一應(yīng)用程序劃分成一組小的服務(wù),服務(wù)之間相互協(xié)調(diào)、互相配合,為用戶提供最終價值。每個服務(wù)運行在其獨立的進程中,服務(wù)和服務(wù)之間采用輕量級的通信機制相互溝通。每個服務(wù)都圍繞著具體的業(yè)務(wù)進行構(gòu)建,并且能夠被獨立的部署到生產(chǎn)環(huán)境、類生產(chǎn)環(huán)境等。另外,應(yīng)盡量避免統(tǒng)一的、集中的服務(wù)管理機制,對具體的一個服務(wù)而言,應(yīng)根據(jù)業(yè)務(wù)上下文,選擇合適的語言、工具對其進行構(gòu)建。

下圖是一個電商系統(tǒng)的微服務(wù)架構(gòu)圖: 

微服務(wù)架構(gòu)與單體應(yīng)用相比,具有以下優(yōu)點:

  1. 每個服務(wù)都比較簡單,只關(guān)注于一個業(yè)務(wù)功能;
  2. 微服務(wù)架構(gòu)方式是松耦合的,每個服務(wù)可以獨立測試、部署、升級、發(fā)布;
  3. 每個微服務(wù)可由不同團隊獨立開發(fā),可以各自選擇優(yōu)秀及最合適的不同的編程語言與工具;
  4. 每個服務(wù)可以根據(jù)需要進行水平擴展,提高系統(tǒng)并發(fā)能力。

沒有銀彈,微服務(wù)架構(gòu)在帶來諸多優(yōu)點的同時,也會有如下缺點:

  1. 微服務(wù)架構(gòu)提高了系統(tǒng)的復(fù)雜度,增加了運維開銷及成本。如單體應(yīng)用可能只需部署至一小片應(yīng)用服務(wù)集群,而微服務(wù)架構(gòu)可能變成需要構(gòu)建/測試/部署/運行數(shù)十個獨立的服務(wù),并可能需要支持多種語言和環(huán)境;
  2. 作為一種分布式系統(tǒng),微服務(wù)架構(gòu)引入了其他若干問題,例如消息序列化、網(wǎng)絡(luò)延遲、異步機制、容錯處理、服務(wù)雪崩等;
  3. 服務(wù)管理的復(fù)雜性,如服務(wù)的注冊、發(fā)現(xiàn)、降級、熔斷等問題;
  4. 服務(wù)與服務(wù)之間存在相互調(diào)用的情況,為排查系統(tǒng)故障帶來巨大挑戰(zhàn)。

可以說,正是傳統(tǒng)應(yīng)用架構(gòu)的系統(tǒng)變得日益臃腫,面臨難以維護、擴展的問題,同時容器化技術(shù)(Docker)的蓬勃發(fā)展和 DevOps 思想的日漸成熟,催生了新的架構(gòu)設(shè)計風(fēng)格 – 微服務(wù)架構(gòu)的出現(xiàn)。

RPC 框架

微服務(wù)架構(gòu)中的各個服務(wù)通常不在同一個機器上,甚至不會在同一個網(wǎng)絡(luò)環(huán)境里,因此微服務(wù)之間如何調(diào)用是一個亟待解決的問題,我們通常使用 RPC 協(xié)議來解決:

RPC(Remote Procedure Call),即遠程過程調(diào)用,是一個計算機通信協(xié)議。該協(xié)議允許運行于一臺計算機的程序調(diào)用另一臺計算機的子程序,而程序員無需額外地為這個交互作用編程。——維基百科

實現(xiàn)了 RPC 協(xié)議的框架,可以讓服務(wù)方和調(diào)用方屏蔽各種底層細節(jié),讓調(diào)用方像調(diào)用本地函數(shù)一樣調(diào)用遠端的函數(shù)(服務(wù))。RPC 框架一般為服務(wù)端和客戶端提供了序列化、反序列化、連接池管理、負載均衡、故障轉(zhuǎn)移、隊列管理、超時管理、異步管理等職能。在網(wǎng)上找到一個說明 RPC 框架工作原理圖: 

目前,根據(jù)序列化數(shù)據(jù)時采用的技術(shù)的不同,可分為 JSON-RPC 和 gRPC 兩種:

  • JSON-RPC 是一種基于 JSON 格式的輕量級的 RPC 協(xié)議標準,可基于 HTTP 協(xié)議來傳輸,或直接基于 TCP 協(xié)議來傳輸。 JSON-RPC 優(yōu)點是易于使用和閱讀。
  • gRPC 是一個高性能、通用的開源 RPC 框架,其由 Google 主要面向移動應(yīng)用開發(fā)并基于 HTTP/2 協(xié)議標準而設(shè)計,基于 ProtoBuf (Protocol Buffers) 序列化協(xié)議開發(fā),且支持眾多開發(fā)語言。 gRPC 具有低延遲、高效率、高擴展性、支持分布式等優(yōu)點。

Consul

現(xiàn)在有了 RPC 框架,我們就可以只考慮服務(wù)與服務(wù)之間的業(yè)務(wù)調(diào)用而不用考慮底層傳輸細節(jié)。此時,如果服務(wù) A 想調(diào)用服務(wù) B 時,我們可以在服務(wù) A 中配置服務(wù) B 的 IP 地址和端口,然后剩下的傳輸細節(jié)就交給 RPC 框架。這在微服務(wù)規(guī)模很小的情況下是沒有問題的,但是在服務(wù)規(guī)模很大、而且每個服務(wù)不止部署一個實例的情況下會面臨巨大挑戰(zhàn)。比如,服務(wù) B 部署了三個實例,這時候服務(wù) A 想調(diào)用服務(wù) B 該請求哪個實例的 IP ?假如服務(wù) B 部署的三個實例有兩個都掛掉了,服務(wù) A 可能會依舊去請求掛掉的實例,服務(wù)將不可用。將 IP 地址和端口寫成配置文件顯得很不靈活,微服務(wù)架構(gòu)往往要保證高可用及動態(tài)伸縮。

因此,我們需要一個服務(wù)注冊與服務(wù)發(fā)現(xiàn)的工具,能夠動態(tài)地變更服務(wù)信息,并且找到可用的服務(wù)的 IP 地址和端口。目前市面上服務(wù)發(fā)現(xiàn)的工具有很多,如 Consul、ZooKeeper 、Etcd、Doozerd 等,本文主要以 Consul 軟件為例。

Consul 是一個支持多數(shù)據(jù)中心、分布式高可用的服務(wù)發(fā)現(xiàn)和配置共享的服務(wù)軟件,由 HashiCorp 公司用 Go 語言開發(fā), 基于 Mozilla Public License 2.0 的協(xié)議進行開源。 Consul 支持健康檢查,并允許 HTTP 、gRPC 和 DNS 協(xié)議調(diào)用 API 存儲鍵值對。

下面是引入服務(wù)注冊與服務(wù)發(fā)現(xiàn)工具后的架構(gòu)圖: 

在這個架構(gòu)中:

  • 首先 S-B 的實例啟動后將自身的服務(wù)信息(主要是服務(wù)所在的 IP 地址和端口號)注冊到 Consul 中。
  • Consul 會對所有注冊的服務(wù)做健康檢查,以此來確定哪些服務(wù)實例可用哪些不可用。
  • S-A 啟動后就可以通過訪問 Consul 來獲取到所有健康的 S-B 實例的 IP 和端口,并將這些信息放入自己的內(nèi)存中,S-A 就可用通過這些信息來調(diào)用 S-B。
  • S-A 可以通過監(jiān)聽 Consul 來更新存入內(nèi)存中的 S-B 的服務(wù)信息。比如 S-B-1 掛了,健康檢查機制就會將其標為不可用,這樣的信息變動就被 S-A 監(jiān)聽到了,S-A 就更新自己內(nèi)存中 S-B-1 的服務(wù)信息。

可見, Consul 軟件除了服務(wù)注冊和服務(wù)發(fā)現(xiàn)的功能之外,還提供了健康檢查和狀態(tài)變更通知的功能。

Hyperf

對于 Java 開發(fā)者來說,有技術(shù)相當(dāng)成熟的 Dubbo 和 Spring Cloud 微服務(wù)框架可供選擇。作為一名 PHPer,我用 Google 查了一下「PHP + 微服務(wù)」,發(fā)現(xiàn)有用的相關(guān)內(nèi)容少之又少 ,沒有什么實質(zhì)性的參考價值,無限惆悵。。。幸好,有大神在基于 Swoole 擴展的基礎(chǔ)上,實現(xiàn)了高性能、高靈活性的 PHP 協(xié)程框架 Hyperf ,并提供了微服務(wù)架構(gòu)的相關(guān)組件。

Hyperf 是基于 Swoole 4.3+ 實現(xiàn)的高性能、高靈活性的 PHP 協(xié)程框架,內(nèi)置協(xié)程服務(wù)器及大量常用的組件,性能較傳統(tǒng)基于 PHP-FPM 的框架有質(zhì)的提升,提供超高性能的同時,也保持著極其靈活的可擴展性,標準組件均基于 PSR 標準 實現(xiàn),基于強大的依賴注入設(shè)計,保證了絕大部分組件或類都是 可替換 與 可復(fù)用 的。

于是,我在學(xué)習(xí)了微服務(wù)架構(gòu)相關(guān)的基礎(chǔ)知識之后,使用 Hyperf 框架構(gòu)建了一個基于 PHP 的微服務(wù)集群,這是項目源碼地址:https://github.com/Jochen-z/p...。該項目使用 Dokcer 搭建,docker-compose.yml 代碼如下:

  1. version: "3" 
  2.  
  3. services: 
  4.   consul-server-leader: 
  5.     image: consul:latest 
  6.     container_name: consul-server-leader 
  7.     command: "agent -server -bootstrap -ui -node=consul-server-leader -client=0.0.0.0" 
  8.     environment: 
  9.       - CONSUL_BIND_INTERFACE=eth0 
  10.     ports: 
  11.       - "8500:8500" 
  12.     networks: 
  13.       - microservice 
  14.  
  15.   microservice-1: 
  16.     build: 
  17.       context: . 
  18.     container_name: "microservice-1" 
  19.     command: "php bin/hyperf.php start" 
  20.     depends_on: 
  21.       - "consul-server-leader" 
  22.     volumes: 
  23.       - ./www/microservice-1:/var/www 
  24.     networks: 
  25.       - microservice 
  26.     tty: true 
  27.  
  28.   microservice-2: 
  29.     build: 
  30.       context: . 
  31.     container_name: "microservice-2" 
  32.     command: "php bin/hyperf.php start" 
  33.     depends_on: 
  34.       - "consul-server-leader" 
  35.     volumes: 
  36.       - ./www/microservice-2:/var/www 
  37.     networks: 
  38.       - microservice 
  39.     tty: true 
  40.  
  41.   app: 
  42.     build: 
  43.       context: . 
  44.     container_name: "app" 
  45.     command: "php bin/hyperf.php start" 
  46.     depends_on: 
  47.       - "microservice-1" 
  48.     volumes: 
  49.       - ./www/web:/var/www 
  50.     ports: 
  51.       - "9501:9501" 
  52.     networks: 
  53.       - microservice 
  54.     tty: true 
  55.  
  56. networks: 
  57.   microservice: 
  58.     driver: bridge 
  59.  
  60. volumes: 
  61.   microservice: 
  62.     driver: local 

這里啟動了一個 Consul 容器 consul-server-leader 作為服務(wù)注冊和服務(wù)發(fā)現(xiàn)的組件,容器 microservice-1 和 microservice-2 分別提供了加法運算和除法運算的服務(wù)。容器 app 作為服務(wù)調(diào)用方,配置了 consul-server-leader 容器的 URL,通過訪問 consul-server-leader 獲取 microservice-1 和 microservice-2 服務(wù)的 IP 地址和端口,然后 app通過 RPC 協(xié)議調(diào)用加法運算和除法運算的服務(wù)獲取結(jié)果并返回給用戶。

app 容器為 Web 應(yīng)用,部署了一個 Hyperf 項目并對外提供 HTTP 服務(wù)。例如,在 App\Controller\IndexController 控制器里有 add 方法:

  1. public function add(AdditionService $addition) 
  2.   $a = (int)$this->request->input('a', 1); # 接受前端用戶參數(shù) 
  3.   $b = (int)$this->request->input('b', 2); 
  4.  
  5.   return [ 
  6.     'a' => $a, 
  7.     'b' => $b, 
  8.     'add' => $addition->add($a, $b) # RPC調(diào)用 
  9.   ]; 

在 App\JsonRpc\AdditionService 中 add 的實現(xiàn):

  1. class AdditionService extends AbstractServiceClient 
  2.     /** 
  3.      * 定義對應(yīng)服務(wù)提供者的服務(wù)名稱 
  4.      * @var string 
  5.      */ 
  6.     protected $serviceName = 'AdditionService'
  7.  
  8.     /** 
  9.      * 定義對應(yīng)服務(wù)提供者的服務(wù)協(xié)議 
  10.      * @var string 
  11.      */ 
  12.     protected $protocol = 'jsonrpc-http'
  13.  
  14.     public function add(int $a, int $b): int 
  15.     { 
  16.         return $this->__request(__FUNCTION__, compact('a''b')); 
  17.     } 

繼承了 AbstractServiceClient 即可創(chuàng)建一個微服務(wù)客戶端請求類,Hyperf 在底層幫我們實現(xiàn)了與 Consul 和服務(wù)提供者交互的細節(jié),我們只要 AdditionService 類里的 add 方法即可遠程調(diào)用 microservice-1 和 microservice-2 提供的服務(wù)。

至此,PHP 微服務(wù)集群搭建就完成了!

 

責(zé)任編輯:華軒 來源: segmentfault
相關(guān)推薦

2019-05-24 14:45:17

分布式微服務(wù)運維

2017-11-22 15:00:34

微服務(wù)基建API

2021-04-06 09:43:41

微服務(wù)架構(gòu)數(shù)據(jù)

2009-07-07 11:20:12

php jsp

2018-01-10 14:22:05

2019-08-05 09:05:06

技術(shù)Docker軟件

2022-05-16 13:31:22

微服務(wù)架構(gòu)云原生微服務(wù)

2019-08-16 08:59:33

技術(shù)軟件HTML

2018-10-06 05:00:53

2022-06-27 07:33:19

微服務(wù)Loki

2023-01-12 08:00:00

SpringClou微服務(wù)框架

2013-06-03 15:15:51

2020-03-17 13:24:04

微服務(wù)架構(gòu)數(shù)據(jù)

2022-10-19 13:11:35

2019-03-01 09:10:33

Vue項目搭建核心庫

2012-09-21 10:36:54

PHPPHP搭建Web

2016-10-27 09:37:10

Hadoop集群配置

2011-12-07 16:11:50

Hadoop集群搭建

2009-10-15 15:33:53

服務(wù)器集群

2019-11-21 16:35:32

架構(gòu)運維技術(shù)
點贊
收藏

51CTO技術(shù)棧公眾號