微服务架构设计:构建可扩展的分布式系统
微服务架构设计构建可扩展的分布式系统什么是微服务微服务是一种架构风格将应用程序拆分为一组小型、自治的服务每个服务运行在独立的进程中通过轻量级的通信机制相互协作。微服务 vs 单体应用特性单体应用微服务部署单一部署单元独立部署扩展整体扩展按需扩展技术栈统一技术栈灵活选择故障影响单点故障隔离故障微服务架构设计原则1. 单一职责原则每个微服务只负责一个业务功能。用户服务 ──────── 订单服务 ──────── 支付服务 │ │ │ ▼ ▼ ▼ 用户数据库 订单数据库 支付数据库2. 服务边界清晰通过 Bounded Context 定义服务边界。// 用户服务 class UserService { async getUser(id) { return await this.userRepository.findById(id); } async createUser(userData) { return await this.userRepository.create(userData); } }3. 独立部署每个服务可以独立部署不影响其他服务。version: 3.8 services: user-service: build: ./user-service ports: - 3001:3000 order-service: build: ./order-service ports: - 3002:3000服务间通信同步通信// 使用 REST API async function createOrder(orderData) { const userId orderData.userId; const user await fetch(http://user-service/users/${userId}) .then(res res.json()); if (!user) { throw new Error(User not found); } return await fetch(http://order-service/orders, { method: POST, body: JSON.stringify(orderData) }).then(res res.json()); }异步通信// 使用消息队列 const amqp require(amqplib); async function publishOrderCreated(order) { const connection await amqp.connect(amqp://localhost); const channel await connection.createChannel(); await channel.assertQueue(order.created); channel.sendToQueue(order.created, Buffer.from(JSON.stringify(order))); }API 网关模式API Gateway │ ┌───────────────┼───────────────┐ ▼ ▼ ▼ 用户服务 订单服务 支付服务// 网关路由配置 const routes [ { path: /api/users, service: user-service }, { path: /api/orders, service: order-service }, { path: /api/payments, service: payment-service } ];服务发现// 使用 Consul 进行服务发现 const consul require(consul)(); async function getServiceAddress(serviceName) { const result await consul.health.service({ service: serviceName, passing: true }); const service result[0]; return ${service.Address}:${service.Port}; }数据库设计策略策略一每个服务独立数据库用户服务 ──► 用户数据库 订单服务 ──► 订单数据库 支付服务 ──► 支付数据库策略二共享数据库不推荐用户服务 ──┐ 订单服务 ──┼──► 共享数据库 支付服务 ──┘微服务部署Docker 容器化FROM node:18-alpine WORKDIR /app COPY package*.json ./ RUN npm ci --onlyproduction COPY . . EXPOSE 3000 CMD [npm, start]Kubernetes 编排apiVersion: apps/v1 kind: Deployment metadata: name: user-service spec: replicas: 3 selector: matchLabels: app: user-service template: metadata: labels: app: user-service spec: containers: - name: user-service image: user-service:latest ports: - containerPort: 3000微服务监控日志聚合// 使用 Winston 记录日志 const winston require(winston); const logger winston.createLogger({ transports: [ new winston.transports.File({ filename: error.log, level: error }), new winston.transports.File({ filename: combined.log }) ] });指标监控// 使用 Prometheus const client require(prom-client); const httpRequests new client.Counter({ name: http_requests_total, help: Total HTTP requests }); app.use((req, res, next) { httpRequests.inc(); next(); });微服务的挑战挑战一分布式事务// 使用 Saga 模式处理分布式事务 class OrderSaga { async createOrder(orderData) { try { const order await this.orderService.create(orderData); await this.paymentService.charge(order); await this.inventoryService.reserve(order); return order; } catch (error) { await this.compensate(order); throw error; } } }挑战二网络延迟使用缓存减少网络调用const cache new Map(); async function getUser(id) { if (cache.has(id)) { return cache.get(id); } const user await fetch(http://user-service/users/${id}) .then(res res.json()); cache.set(id, user); return user; }总结微服务架构提供了高可扩展性按需扩展单个服务技术多样性每个服务可以使用最适合的技术独立部署快速发布新功能故障隔离单个服务故障不影响整体但也带来了额外的复杂性需要谨慎权衡。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2635249.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!