核心原则:一套基础,N个变体
支撑50个平台的技术架构,核心只有一个词:复用。
让我从底层到上层,逐层拆解。
1. 数据库层
多租户设计
-- 每个平台一个 schema,共享同一个 PostgreSQL 实例
CREATE SCHEMA IF NOT EXISTS platform_mishimao;
CREATE SCHEMA IF NOT EXISTS platform_zhaofangtong;
-- 公共表(用户、支付、日志)放在 public schema
CREATE TABLE public.users (
id BIGSERIAL PRIMARY KEY,
phone VARCHAR(20) UNIQUE,
email VARCHAR(255),
password_hash VARCHAR(255),
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 每个平台的业务表放在各自 schema
CREATE TABLE platform_mishimao.restaurants (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT REFERENCES public.users(id),
name VARCHAR(255),
address TEXT,
rating NUMERIC(2,1),
created_at TIMESTAMPTZ DEFAULT NOW()
);
为什么不用 SaaS 多租户?
因为每个平台的业务模型差异太大。多租户适合同质化业务,微平台需要的是异构隔离。
2. 后端服务层
统一网关 + 微服务
┌─────────────┐
│ Nginx │
│ (反向代理) │
└──────┬──────┘
│
┌──────▼──────┐
│ API Gateway │
│ (路由分发) │
└──────┬──────┘
│
┌───────────────┼───────────────┐
│ │ │
┌──────▼──────┐ ┌──────▼──────┐ ┌──────▼──────┐
│ 基础服务 │ │ 业务服务 │ │ 运营服务 │
│ (用户/支付) │ │ (各平台独立) │ │ (统计/监控) │
└─────────────┘ └─────────────┘ └─────────────┘
基础服务(全平台复用)
// auth.service.ts - 统一认证
export class AuthService {
// 所有平台共享同一套用户系统
// 通过 platform_id 区分来源
async login(phone: string, code: string, platformId: string) {
const user = await this.userRepo.findByPhone(phone);
if (!user) throw new NotFoundError('用户不存在');
const token = this.jwt.sign({
userId: user.id,
platformId
});
return { token, user };
}
}
// payment.service.ts - 统一支付
export class PaymentService {
// 对接微信/支付宝,所有平台复用
// 通过 platformId 路由到不同的商户号
async createOrder(params: {
platformId: string;
userId: number;
amount: number;
subject: string;
}) {
const merchant = this.merchantConfig[params.platformId];
return this.wechatPay.createOrder({
...params,
mchId: merchant.mchId,
});
}
}
业务服务(每平台独立)
每个平台的业务服务继承自同一个基类:
// base.service.ts
export abstract class BaseService<T> {
constructor(
protected repo: BaseRepository<T>,
protected platformId: string,
) {}
async list(query: QueryDTO): Promise<PageResult<T>> {
return this.repo.list({ ...query, platformId: this.platformId });
}
async create(data: Partial<T>): Promise<T> {
return this.repo.create({ ...data, platformId: this.platformId } as any);
}
// 子类可以覆写
async afterCreate(entity: T): Promise<void> {}
}
// restaurant.service.ts (觅食猫)
export class RestaurantService extends BaseService<Restaurant> {
async searchNearby(lat: number, lng: number, radius: number) {
// 觅食猫特有逻辑
return this.repo.query(
'SELECT * FROM restaurants WHERE ST_DWithin(location, ST_MakePoint($1,$2)::geography, $3)',
[lng, lat, radius]
);
}
}
3. 前端架构
模板化 + 配置化
// platform.config.ts - 每个平台一份配置
export const platformConfig = {
mishimao: {
name: '觅食猫',
theme: { primary: '#FF6B35', secondary: '#FFA500' },
modules: ['list', 'detail', 'map', 'review', 'coupon'],
apiBase: '/api/mishimao',
domain: 'mishimao.com',
},
zhaofangtong: {
name: '找房通',
theme: { primary: '#2563EB', secondary: '#3B82F6' },
modules: ['list', 'detail', 'map', 'filter', 'agent'],
apiBase: '/api/zhaofangtong',
domain: 'zhaofangtong.com',
},
};
// App.tsx - 所有平台共用同一套前端
function App() {
const config = getPlatformConfig(); // 根据域名自动识别
return (
<ThemeProvider theme={config.theme}>
<ModuleRouter modules={config.modules} />
</ThemeProvider>
);
}
4. 部署与运维
Docker Compose 一键部署
# docker-compose.yml
version: '3.8'
services:
gateway:
build: ./gateway
ports: ['80:80', '443:443']
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
postgres:
image: postgres:16
volumes:
- pgdata:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
redis:
image: redis:7-alpine
# 基础服务
auth-service:
build: ./services/auth
environment:
- DATABASE_URL=postgresql://postgres:${DB_PASSWORD}@postgres:5432/platform
# 业务服务按需启动
mishimao-service:
build: ./services/mishimao
profiles: ['mishimao']
zhaofangtong-service:
build: ./services/zhaofangtong
profiles: ['zhaofangtong']
监控看板
我自己搭了一个 Grafana + Prometheus 的监控体系:
- 每个平台的 QPS、响应时间、错误率
- 数据库慢查询监控
- Redis 内存使用
- 服务器资源利用率
5. 成本控制
服务器:2台 4核8G 云主机(¥400/月)
数据库:RDS PostgreSQL 基础版(¥200/月)
Redis:自建(¥0)
CDN:CloudFlare 免费版
域名:50个 × ¥55/年(¥229/月)
SSL:Let's Encrypt 免费
─────────────────────
总成本:约 ¥829/月
50个平台,月成本不到1000元。 这就是微平台的魅力。
总结
| 层级 | 复用率 | 说明 |
|---|---|---|
| 基础设施 | 100% | 数据库、缓存、队列 |
| 基础服务 | 100% | 认证、支付、通知 |
| 前端框架 | 95% | 模板+配置化 |
| 业务逻辑 | 20% | 每平台独立 |
| 运维监控 | 100% | 统一面板 |
一个人做50个平台,不是做50倍的工作量,而是把1份工作做到能复用50次。
这才是独立开发者的核心竞争力。