Hyperf (推薦學習:php視頻教程)
對于 JAVA 開發者來說,有技術相當成熟的微服務框架可供選擇:
[Dubbo](https://dubbo.Apache.org/zh-cn/)
[Spring Cloud](https://www.springcloud.cc/)
作為一名 PHPer,我用 google 查了一下「PHP + 微服務」,發現有用的相關內容少之又少 ,沒有什么實質性的參考價值,無限惆悵。
幸好,有大神在基于 Swoole 擴展的基礎上,實現了高性能、高靈活性的 PHP 協程框架 [Hyperf](https://www.hyperf.io/) ,并提供了微服務架構的相關組件。
Hyperf 是基于 `Swoole 4.3+` 實現的高性能、高靈活性的 PHP 協程框架,內置協程服務器及大量常用的組件,性能較傳統基于 `PHP-FPM` 的框架有質的提升,提供超高性能的同時,也保持著極其靈活的可擴展性,標準組件均基于 [PSR 標準](https://www.php-fig.org/psr) 實現,基于強大的依賴注入設計,保證了絕大部分組件或類都是 `可替換` 與 `可復用` 的。
于是,我在學習了微服務架構相關的基礎知識之后,使用 Hyperf 框架構建了一個基于 PHP 的微服務集群,這是項目源碼地址:
https://github.com/Jochen-z/php-microservice-demo
該項目使用 Dokcer 搭建,`Docker-compose.yml` 代碼如下:
version:"3"
services:
consul-server- leader:
image:consul:latest
container_name:consul-server-leader
command:"agent -server -bootstrap -ui -node=consul-server-leader -client=0.0.0.0"
environment:
- CONSUL_BIND_INTERFACE=eth 0
ports:
- "8500:8500"
networks:
- microservice
microservice- 1:
build:
context:.
container_name:"microservice-1"
command:"php bin/hyperf.php start"
depends_on:
- "consul-server-leader"
volumes:
- ./www/microservice- 1:/var/www
networks:
- microservice
tty:true
microservice- 2:
build:
context:.
container_name:"microservice-2"
command:"php bin/hyperf.php start"
depends_on:
- "consul-server-leader"
volumes:
- ./www/microservice- 2:/var/www
networks:
- microservice
tty:true
App:
build:
context:.
container_name:"app"
command:"php bin/hyperf.php start"
depends_on:
- "microservice-1"
volumes:
- ./www/ web:/var/www
ports:
- "9501:9501"
networks:
- microservice
tty:true
networks:
microservice:
driver:bridge
volumes:
microservice:
driver:local
這里啟動了一個 Consul 容器 `consul-server-leader` 作為服務注冊和服務發現的組件,容器 `microservice-1` 和 `microservice-2` 分別提供了加法運算和除法運算的服務。
容器 `app` 作為服務調用方,配置了 `consul-server-leader` 容器的 URL,通過訪問 `consul-server-leader` 獲取 `microservice-1` 和 `microservice-2` 服務的 IP 地址和端口,然后 `app` 通過 RPC 協議調用加法運算和除法運算的服務獲取結果并返回給用戶。
`app` 容器為 Web 應用,部署了一個 Hyperf 項目并對外提供 HTTP 服務。
例如,在 `AppControllerIndexController` 控制器里有 `add` 方法:
publicfunctionadd(AdditionService $addition)
{
$a = (int) $this->request->input( 'a', 1); # 接受前端用戶參數
$b = (int) $this->request->input( 'b', 2);
return[
'a'=> $a,
'b'=> $b,
'add'=> $addition->add($a, $b) # RPC調用
];
}
在 `AppJsonRpcAdditionService` 中 `add` 的實現:
classAdditionServiceextendsAbstractServiceClient
{
/**
* 定義對應服務提供者的服務名稱
* @varstring
*/
protected$serviceName = 'AdditionService';
/**
* 定義對應服務提供者的服務協議
* @varstring
*/
protected$protocol = 'jsonrpc-http';
publicfunctionadd(int $a, int $b): int
{
return$this->__request( __FUNCTION__, compact( 'a', 'b'));
}
}
繼承了 `AbstractServiceClient` 即可創建一個微服務客戶端請求類,Hyperf 在底層幫我們實現了與 Consul 和服務提供者交互的細節,我們只要 `AdditionService` 類里的 `add` 方法即可遠程調用 `microservice-1` 和 `microservice-2` 提供的服務。
至此,PHP 微服務集群搭建就完成了!
以上就是php如何搭建微服務的詳細內容,更多請關注其它相關文章!