本文目录导读:

- 共享公共代码库(Composer包)
- 使用Monorepo(单仓库)管理共享内核
- 共享配置中心(如Consul/etcd + 配置客户端)
- 共享服务注册与发现
- 共享数据库抽象层
- 共享中间件/管道
- 共享消息协议(gRPC/Thrift)
- 最佳实践建议
- 常见陷阱
在微服务架构中,PHP通常不直接共享内核(像Java/JVM那样),结合你的问题,我理解你可能是在问 如何在微服务环境中共享PHP的公共代码、配置或运行时环境,下面给出几种常见且实用的方案:
共享公共代码库(Composer包)
这是最标准的方法,通过Composer管理通用代码:
// composer.json
{
"repositories": [
{
"type": "vcs",
"url": "https://github.com/your-org/common-core"
}
],
"require": {
"your-org/common-core": "^1.0"
}
}
适用场景:共享实体类、DTO、验证逻辑、工具函数、接口定义等。
使用Monorepo(单仓库)管理共享内核
将所有微服务和共享代码放在同一个仓库:
monorepo/
├── packages/
│ ├── core/ # 共享内核
│ ├── auth-service/
│ └── order-service/
├── composer.json # 使用本地路径引用
{
"repositories": [
{
"type": "path",
"url": "packages/core"
}
]
}
优势:开发阶段实时同步,无需发布包;版本控制更简单。
共享配置中心(如Consul/etcd + 配置客户端)
// 配置客户端示例
class ConfigClient
{
public function get(string $key): mixed
{
// 从Consul/etcd获取配置
$response = $this->httpClient->get("http://consul:8500/v1/kv/config/{$key}");
return json_decode($response->getBody(), true);
}
}
// 微服务中使用
$dbConfig = $configClient->get('database/mysql');
适用场景:数据库配置、API密钥、环境变量、功能开关等。
共享服务注册与发现
// 服务发现客户端
class ServiceDiscovery
{
public function getServiceUrl(string $serviceName): string
{
// 从Consul/etcd获取服务地址
$services = $this->consulClient->services();
return $services[$serviceName]['Address'] . ':' . $services[$serviceName]['Port'];
}
}
// 调用其他微服务
$orderService = new HttpClient();
$response = $orderService->get(
$serviceDiscovery->getServiceUrl('order-service') . '/api/orders'
);
共享数据库抽象层
创建统一的数据访问层,所有微服务共享对数据的操作:
// 共享的Repository基类
abstract class BaseRepository
{
protected DB $db;
public function __construct(DB $db)
{
$this->db = $db;
}
public function find(int $id): ?Entity
{
// 统一的数据查询逻辑
}
public function save(Entity $entity): bool
{
// 统一的数据持久化逻辑
}
}
// 具体微服务实现
class UserRepository extends BaseRepository
{
// 继承共享的逻辑
}
共享中间件/管道
// 共享的API网关中间件
class SharedMiddleware
{
public function handle(Request $request, callable $next): Response
{
// 统一身份验证
if (!$request->hasValidToken()) {
return response()->json(['error' => 'Unauthorized'], 401);
}
// 统一日志记录
$this->logger->info('Request received', [
'path' => $request->getPath(),
'method' => $request->getMethod()
]);
return $next($request);
}
}
共享消息协议(gRPC/Thrift)
定义共享的.proto文件,生成PHP客户端和服务端代码:
// shared.proto
service UserService {
rpc GetUser (UserRequest) returns (UserResponse);
}
message UserRequest {
int32 user_id = 1;
}
message UserResponse {
string name = 1;
string email = 2;
}
生成PHP代码后,所有微服务共享这些接口定义。
最佳实践建议
- 版本控制:共享包使用语义化版本控制,避免破坏性变更
- 依赖注入:通过容器管理共享服务实例
- 自动化测试:共享代码需要有完整的单元测试
- 兼容性:保持向后兼容,非必要时不引入破坏性变更
- 文档:为共享代码编写清晰的API文档
常见陷阱
- ❌ 直接共享数据库连接(会导致耦合)
- ❌ 在共享代码中使用具体的微服务实现
- ❌ 全局状态管理(如静态变量、单例)
- ❌ 同步调用链过长(容易导致级联故障)
选择哪种方式取决于你的具体需求:如果需要共享纯业务逻辑,推荐使用Composer包;如果需要共享运行时的服务实例,考虑依赖注入容器;如果需要共享配置,使用配置中心。