itnelo / reactphp-foundation
一些船体部件和废料,用ReactPHP启动一个优雅的太空船
Requires
- php: >=7.4
- ext-pcntl: >=7.4
- psr/container: ^1.0
- psr/http-message: ^1.0
- psr/log: ^1.1
- react/event-loop: ^1.1
- react/http: ^0.8.6
- react/stream: ^1.1
- symfony/config: ^5.1
- symfony/dependency-injection: ^5.1
- symfony/dotenv: ^5.1
- symfony/yaml: ^5.1
- wyrihaximus/react-psr-3-stdio: ^2.1
Requires (Dev)
- phpunit/phpunit: ^9.2
This package is auto-updated.
Last update: 2024-09-15 03:19:00 UTC
README
里面有什么?
这个自给自足、异步微服务的骨架包含
- 接口
psr/log
— PSR-3 (Logger)psr/http-message
— PSR-7 (HTTP Message)psr/container
— PSR-11 (Container)
- 通过Symfony的容器解耦代码
symfony/dependency-injection
- 确保使用ReactPHP组件的非阻塞I/O
react/event-loop
react/http
react/stream
- 管理环境和配置
symfony/dotenv
symfony/config
symfony/yaml
它遵循强SOLID设计,完全符合PSR兼容性,考虑到PHP 7.4+的特性(从类型属性开始)构建。
它也是相对轻量级的,并从Symfony组件和ReactPHP中受益,而不需要设置重型装备。
有几个部署配置(Docker Compose项目和栈用于Docker Swarm,包括HAProxy作为你的代码的负载均衡器)。
安装
Docker Swarm
此设置提供了使用Swarm模式的基本服务可伸缩性。为了测试目的,假设我们有以下服务器
192.169.56.1 # our pc, manager node; haproxy
192.169.56.10 # vm, worker node; app instance
192.169.56.20 # vm, worker node; app instance
192.169.56.30 # vm, worker node; app instance
先决条件。确保每台机器上所有必要的端口都是可访问的,否则可能导致节点间通信过程中出现隐性问题。一个常见的症状是在overlay中对所有副本进行成功的nslookup
,但对其中一些进行失败的ping
。以下是一个快速列表
$ sudo ufw status
Status: active
To Action From
-- ------ ----
22/tcp ALLOW 192.169.56.0/24
2376/tcp ALLOW 192.169.56.0/24
2377/tcp ALLOW 192.169.56.0/24
4789/udp ALLOW 192.169.56.0/24
7946/tcp ALLOW 192.169.56.0/24
7946/udp ALLOW 192.169.56.0/24
局限性。此设置假设您正在使用单个haproxy实例,在集群中的固定节点上,并且只有该节点会发布其端口
步骤1。创建一个管理节点(用于具有暴露端口的haproxy)
# our pc
$ docker swarm init --advertise-addr 192.169.56.1
以及一些工作节点
# vm
$ docker swarm join --token JOIN_TOKEN --advertise-addr 192.169.56.10 192.169.56.1
其中JOIN_TOKEN
是在管理节点上通过docker swarm join-token worker
获得的参数。重复此操作,使用您的集群中所有其他工作服务器的自己的广告地址。
步骤2。分配地理标签,以便在所有可用服务器之间均匀分配容器
# our pc
$ docker node update --label-add provider_location_machine=do.fra1.d1 HOSTNAME
其中HOSTNAME
是服务器标识符,请参阅管理节点上的docker node ls
。
步骤3。克隆存储库并调整环境变量
# our pc
$ git clone git@github.com:itnelo/reactphp-foundation.git my-service && cd "$_"
$ cp .env.dev.dist .env
将APP_STACK_IMAGE_NAME
和APP_STACK_IMAGE_VERSION
填充为您从所需注册表中获得的镜像元数据。
步骤4。应用堆栈配置
# our pc
$ set -a; . .env; set +a && envsubst < docker-compose.stack.yml.dist > docker-compose.stack.yml
您还应根据步骤2调整放置约束,以确保Swarm调度程序能够将任务分配给配置的节点。如果您更改了某些端口,请检查docker
目录中的haproxy.stack.cfg
,或者也可以使用自定义haproxy镜像。
步骤5。部署服务
# our pc
$ docker stack deploy --orchestrator swarm --compose-file docker-compose.stack.yml my-service
通过访问192.169.56.1:6637/stats
(如果您坚持默认配置;使用您的管理节点IP)应可访问一个包含后端统计信息的渲染页面
为了在节点之间重新平衡应用副本,在添加或删除一个节点后,使用
# our pc
$ docker service update --force my-service_app
测试
应用测试套件配置并运行 PHPUnit
$ cp phpunit.xml.dist phpunit.xml
# for docker-compose installation
$ docker-compose run --rm app bin/phpunit
另请参阅
- driftphp/driftphp — 如果你正在寻找更深入的Symfony集成,包括对异步环境的Kernel适配。
- thesecretlivesofdata.com/raft — 一个有助于理解Docker Swarm使用的分布式一致性算法工作原理的辅助可视化。
变更日志
本项目所有显著的更改都将记录在 CHANGELOG.md 中。