Service Mesh 与 PHP:微服务如何变得更智能

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

您的 PHP 微服务在低声细语?是时候开启免提通话了

\n\n

想象一下:您有 15 个 PHP 微服务。一个负责认证,另一个负责支付,第三个负责通知。它们通过 HTTP 通信,但每周都会出问题:超时、崩溃、请求丢失。您添加了重试、断路器、负载均衡——结果代码变成了网络交互逻辑的意大利面条。

\n\n

这时 Service Mesh 登场了——它是一个基础设施层,将所有的网络魔法从您的 PHP 代码中抽离出来。别担心:这不是魔法,而是经过深思熟虑的架构。是的,PHP 微服务可以(而且应该)使用 Service Mesh。

\n\n

什么是 Service Mesh,PHP 开发者为什么需要它?

\n\n

Service Mesh 是一个专门用于管理服务间通信的基础设施层。您无需在每个微服务中编写负载均衡、加密、链路追踪和超时逻辑,而是将这些任务委托给 sidecar 代理(通常是 Envoy 或 Linkerd)。

\n\n

这对 PHP 尤其重要,因为:

\n
    \n
  • PHP 应用通常通过 FastCGI 或 FPM 运行,在每个服务中添加网络逻辑会造成额外开销
  • \n
  • Service Mesh 提供 mTLS(双向认证)而无需修改代码
  • \n
  • 您将获得一个统一的仪表板来监控所有微服务
  • \n
  • 可以在代理层面直接实现 断路器 和 重试
  • \n
\n\n

最流行的技术栈是 Istio + Envoy。但我们将从 PHP 开发者的角度来探讨它。

\n\n

工作原理:PHP 服务 + sidecar

\n\n

假设您有一个基于 PHP 的微服务 user-service。它监听 9000 端口(FPM)。没有 Service Mesh 时,您直接访问它:

\n\n
GET http://user-service:9000/api/users/1
\n\n

有了 Service Mesh,您的 pod(容器)中会添加一个 Envoy 代理。现在所有进出流量都经过它:

\n\n
┌─────────────────┐       ┌──────────────┐\n│ PHP 应用        │ ──►   │ Envoy 代理   │\n│ (user-service)  │       │ (sidecar)    │\n└─────────────────┘       └──────┬───────┘\n                                  │\n                                  ▼\n                          ┌──────────────┐\n                          │ Envoy 代理   │\n                          │ (其他服务)   │\n                          └──────────────┘
\n\n

您的 PHP 代码 不知道 代理的存在。它只需向 localhost:80 或 localhost:9000 发送请求——Envoy 会拦截这些请求并根据 Istio 的规则进行路由。

\n\n

实践示例:基于 Istio 的 PHP 微服务与 Service Mesh

\n\n

步骤 1. 配置 PHP 服务(无需修改代码)

\n\n

假设您有一个简单的 PHP 脚本,返回用户数据:

\n\n
<?php\n// user-service/index.php\n$userId = $_GET['id'] ?? 0;\n$users = [\n    1 => ['name' => 'Alice', 'email' => 'alice@example.com'],\n    2 => ['name' => 'Bob', 'email' => 'bob@example.com'],\n];\n\nheader('Content-Type: application/json');\necho json_encode($users[$userId] ?? ['error' => 'User not found']);
\n\n

将其打包到 Docker 中:

\n\n
# Dockerfile\nFROM php:8.2-fpm\nCOPY index.php /var/www/html/index.php\nCMD ["php-fpm"]
\n\n

一切都很标准。无需为 Service Mesh 做任何修改。

\n\n

步骤 2. 在 Kubernetes 中部署 sidecar

\n\n

添加注解 sidecar.istio.io/inject: "true"——Istio 会自动注入 Envoy:

\n\n
apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: user-service\nspec:\n  replicas: 2\n  selector:\n    matchLabels:\n      app: user-service\n  template:\n    metadata:\n      labels:\n        app: user-service\n      annotations:\n        sidecar.istio.io/inject: "true"  # <-- 关键行\n    spec:\n      containers:\n      - name: php\n                

博客

书籍推荐