itnelo/reactphp-foundation

一些船体部件和废料,用ReactPHP启动一个优雅的太空船

0.3.0 2020-08-17 17:43 UTC

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实例,在集群中的固定节点上,并且只有该节点会发布其端口

how it works schema

步骤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_NAMEAPP_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)应可访问一个包含后端统计信息的渲染页面

haproxy stats

为了在节点之间重新平衡应用副本,在添加或删除一个节点后,使用

# 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 中。