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` 提供的服务 。
推荐阅读
- 如何正确设置Google Play的收款账号?
- Linux中如何启用对MySQL数据库服务器的远程访问
- 如何利用ARP命令解决网络故障
- php闭包有什么用?
- 基于ThinkPHP5.1.34 LTS开发的快速开发框架DolphinPHP
- 如何搭建合适的Web框架?
- mysql优化实战:千万级数据表如何进行分页查询?
- phpstudy中apache无法启动怎么解决?
- Java 类在 Tomcat 中是如何加载的?
- 你如何看待生活中的茶文化