一、微服务架构设计基础

1.1 微服务架构概述

微服务架构是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常为HTTP RESTful API)。这些服务围绕业务能力构建,可通过全自动部署机制独立部署。

微服务架构核心特征:

  • 每个服务独立运行在自己的进程中

  • 服务间通过轻量级机制通信

  • 围绕业务能力组织服务

  • 可独立部署和扩展

1.2 单体架构 vs 微服务架构对比

因素 单体架构 微服务架构 说明
交付速度 较慢 较快 服务拆分后,各服务可独立并行开发、测试、部署
故障隔离 线程级 进程级 服务独立运行,通过进程隔离,故障范围有效控制
整体可用性 较低 更高 故障范围得到有效隔离,降低单点故障对整体的影响
架构持续演进 困难 简单 微服务粒度更小,架构演进影响面更小
沟通效率 按业务构建全功能团队,降低沟通规模
技术栈选择 受限 灵活 不同服务可采用不同技术栈实现
可扩展性 受限 灵活 可根据服务资源需求以服务为粒度扩展
可重用性 以服务为粒度通过接口共享实现重用
业务复杂性分解 困难 容易 业务边界更清晰,复杂问题分解为简单小问题
产品创新 困难 容易 服务独立演进,团队有更多自主决策权
一致性实现成本 单体架构单库事务变为分布式事务问题

1.3 微服务拆分通用原则

1. 高内聚低耦合原则

每个服务只完成自己职责内的任务,非职责功能交给其他服务完成。

2. 闭包原则(CCP)

当需要改变一个微服务时,所有依赖都在该微服务组件内,无需修改其他微服务。

3. 服务自治、接口隔离原则

消除对其他服务的强依赖,降低沟通成本,提升服务稳定性。通过标准接口隔离,隐藏内部实现细节。

4. 持续演进原则

拆分初期难以确定最终形态,应逐步划分、持续演进,避免服务数量爆炸性增长。

5. 渐进式拆分策略

拆分过程尽量避免影响产品日常功能迭代,优先剥离独立边界服务(如短信服务),从非核心服务出发。

6. 接口可扩展性原则

服务接口参数类型推荐使用封装类,增加参数时不必变更接口签名。

7. 避免环形依赖

尽量避免服务间环形依赖或双向依赖,这表明功能边界未划分清楚或通用功能未下沉。

8. 阶段性合并

随着业务理解深入或业务逻辑变化,可能需要重新梳理领域边界,合并或重新划分服务。

9. 自动化驱动

服务增多会带来部署和运维成本指数级增长,需构建自动化工具环境,简化重复性工作。


二、微服务拆分策略详解

2.1 功能维度拆分策略

基于数据驱动拆分(自下而上)

适用于业务复杂度较低的场景,通过分析需求确定数据结构,根据表关系拆分服务。

拆分步骤:

  1. 需求分析

  2. 抽象数据结构

  3. 划分服务

  4. 确定调用关系

  5. 业务流程验证

基于领域驱动拆分(自上而下)

适用于业务复杂度高的场景,通过与领域专家建立统一语言,确定关键业务场景和限界上下文。

拆分步骤:

  1. 建立统一语言

  2. 业务分析

  3. 寻找聚合

  4. 确定服务调用关系

  5. 业务流程验证和持续优化

![电商领域驱动设计示例](文档中图片位置:Page 4)

从单体架构逐步拆分

适用于已有单体系统的改造场景。

拆分步骤:

  1. 前后端分离

  2. 提取公共基础服务(授权、分布式ID等)

  3. 不断从老系统抽取服务

  4. 垂直划分优先,适当水平切分

2.2 非功能维度拆分策略

1. 扩展性

区分系统中变与不变的部分,将不变部分作为共用服务,变的部分独立满足个性化扩展需要。

2. 复用性

将重复功能(鉴权、限流、日志监控等)拆分出来形成独立服务。

3. 高性能
  • 将性能要求高或压力大的模块独立拆分

  • 基于读写分离拆分(如商品信息的读服务和写服务)

  • 考虑数据一致性:强一致性数据尽量放在同一服务,弱一致性可拆分

4. 高可用

将可靠性要求高的核心服务与可靠性要求低的非核心服务拆分,重点保证核心服务高可用。

5. 安全性

将需要高度安全的服务拆分,进行区别部署,如设置特定DMZ区域分区部署。

6. 异构性

对于有特殊开发语言要求的业务场景,用不同语言独立实现服务。


三、电商项目微服务拆分实战

3.1 电商项目微服务架构图

电商项目基于Spring Cloud Alibaba技术栈,构建了完整的微服务架构体系:

3.2 服务模块拆分详解

项目模块结构:

text

wfmallV5/
├── wolfmall-admin/          # 后台管理系统
├── wolfmall-authcenter/     # 认证中心
├── wolfmall-canal/          # 数据同步程序
├── wolfmall-cart/           # 购物车服务
├── wolfmall-common/         # 通用模块(JAR包)
├── wolfmall-core/           # 核心模块(JAR包)
├── wolfmall-gateway/        # 网关服务
├── wolfmall-member/         # 用户管理服务
├── wolfmall-order-curr/     # 订单服务
├── wolfmall-order-history/  # 历史订单处理
├── wolfmall-portal/         # 商城首页入口
├── wolfmall-product/        # 商品管理服务
├── wolfmall-promotion/      # 促销管理服务
├── wolfmall-redis-comm/     # 缓存模块(JAR包)
├── wolfmall-redis-multi/    # 多源缓存模块(JAR包)
├── wolfmall-search/         # 商品搜索服务
├── wolfmall-security/       # 安全模块(JAR包)
├── wolfmall-sk-cart/        # 秒杀确认单处理
├── wolfmall-sk-order/       # 秒杀订单处理
└── wolfmall-unqid/          # 分布式ID生成服务

模块说明:

  • JAR包模块:被其他服务以依赖形式使用,如common、core、security等

  • 独立服务:可独立部署运行的微服务,如member、order、product等

  • 特殊场景服务:如秒杀相关服务(sk-cart、sk-order)

3.3 数据库拆分设计

数据库分库设计:

  • 商品库:wf_mall_goods

  • 促销库:wf_mall_promotion

  • 用户库:wf_mall_user

  • 其他库:wf_mall_normal

  • 订单库:wf_mall_order

  • 购物车库:wf_mall_cart

关键业务表:

数据库 表名 说明
用户库 ums_member 用户/会员表
商品库 pms_product 商品表(基本信息、促销、属性、关联)
商品库 pms_sku_stock 商品SKU库存表
订单库 oms_order 订单表
订单库 oms_order_item 订单详情表(一对多关系)
促销库 sms_home_brand 首页品牌推荐表
促销库 sms_home_new_product 首页新鲜好物信息
促销库 sms_home_recommend_product 首页人气推荐信息
促销库 sms_home_recommend_subject 首页专题精选信息
促销库 sms_home_advertise 首页轮播广告信息
促销库 sms_flash_promotion 秒杀/限时购活动信息
促销库 sms_flash_promotion_product_relation 秒杀商品及库存信息

3.4 Spring Cloud Alibaba技术栈选型

版本选择(官方推荐):

Spring Cloud Alibaba Spring Cloud Spring Boot
2.2.9.RELEASE Hoxton.SR12 2.3.12.RELEASE

选择Spring Cloud Alibaba的优势:

  1. 组件稳定性:阿里经过大规模生产环境验证

  2. 可视化界面:提供完善的可视化管理界面

  3. 学习曲线低:搭建简单,配置友好

  4. 生态完整:提供一站式微服务解决方案

依赖配置示例:

xml

<!-- Nacos服务注册与发现 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

3.5 接入Nacos注册中心

1. 引入依赖:

xml

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2. 配置注册中心:

yaml

spring:
  application:
    name: mall-order  # 微服务名称
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848  # Nacos地址
        namespace: 6cd8d896-4d19-4e33-9840-26e4bee9a618  # 命名空间

3.6 接入Nacos配置中心

1. 引入依赖:

xml

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

2. 创建bootstrap.yml:

yaml

spring:
  application:
    name: tulingmall-member  # 微服务名称
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848  # 配置中心地址
        namespace: 6cd8d896-4d19-4e33-9840-26e4bee9a618
        file-extension: yml  # 配置文件格式
        shared-configs[0]:  # 公共配置
          data-id: wolfmall-nacos.yml
          group: DEFAULT_GROUP
          refresh: true
        shared-configs[1]:
          data-id: wolfmall-redis.yml
          group: DEFAULT_GROUP
          refresh: true
  profiles:
    active: dev  # 环境配置

3.7 基于OpenFeign实现微服务调用

业务场景: 用户查询优惠券

1. 引入依赖:

xml

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2. 定义Feign客户端接口:

java

@FeignClient(value = "tulingmall-coupons", path = "/coupon")
public interface CouponsFeignService {
    
    @RequestMapping(value = "/list", method = RequestMethod.GET)
    @ResponseBody
    CommonResult<List<SmsCouponHistory>> list(
        @RequestParam(value = "useStatus", required = false) Integer useStatus,
        @RequestHeader("memberId") Long memberId
    );
}

3. 启用Feign客户端:

java

@SpringBootApplication
@EnableFeignClients
public class TulingmallMemberApplication {
    public static void main(String[] args) {
        SpringApplication.run(TulingmallMemberApplication.class, args);
    }
}

4. 服务调用:

java

@Autowired
private CouponsFeignService couponsFeignService;

@RequestMapping(value = "/coupons", method = RequestMethod.GET)
public CommonResult getCoupons(
    @RequestParam(value = "useStatus", required = false) Integer useStatus,
    @RequestHeader("memberId") Long memberId) {
    
    // 通过OpenFeign从远程微服务获取优惠券信息
    return couponsFeignService.list(useStatus, memberId);
}

5. Feign配置(日志、拦截器等):

java

@Configuration
public class FeignConfig {
    
    @Bean
    public Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;  // NONE, BASIC, HEADERS, FULL
    }
    
    @Bean
    public RequestInterceptor requestInterceptor() {
        return new HeaderInterceptor();
    }
}

@Slf4j
public class HeaderInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate template) {
        ServletRequestAttributes attributes = 
            (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if (null != attributes) {
            HttpServletRequest request = attributes.getRequest();
            log.info("从Request中解析请求头");
            template.header("memberId", request.getHeader("memberId"));
        }
    }
}

3.8 网关服务搭建

1. 引入依赖:

xml

<!-- Gateway网关 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

<!-- Nacos服务注册与发现 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<!-- Nacos配置中心 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2. 网关路由配置:

yaml

server:
  port: 8888

spring:
  application:
    name: wolfmall-gateway
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: 6cd8d896-4d19-4e33-9840-26e4bee9a618
    gateway:
      routes:
        - id: wolfmall-member
          uri: lb://wolfmall-member
          predicates:
            - Path=/member/**/sso/**
        - id: wolfmall-promotion
          uri: lb://wolfmall-promotion
          predicates:
            - Path=/coupon/**

logging:
  level:
    org.springframework.cloud.gateway: debug

3. 网关配置中心配置(bootstrap.yml):

yaml

spring:
  application:
    name: wolfmall-gateway
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: 6cd8d896-4d19-4e33-9840-26e4bee9a618
        file-extension: yml
        shared-configs[0]:
          data-id: wolfmall-nacos.yml
          group: DEFAULT_GROUP
          refresh: true
  profiles:
    active: dev

四、微服务拆分实践总结

4.1 拆分关键要点

  1. 业务优先:基于业务领域和业务流程进行拆分

  2. 渐进式演进:避免一次性大规模重构,采用渐进式拆分策略

  3. 基础设施先行:先构建注册中心、配置中心、网关等基础设施

  4. 数据拆分策略:根据业务特性合理设计数据库分库分表

  5. 团队协作调整:微服务拆分需要团队组织结构的相应调整

4.2 常见问题与解决方案

问题 解决方案
服务边界不清晰 使用DDD领域驱动设计,明确限界上下文
分布式事务管理 采用Seata等分布式事务解决方案
服务间调用复杂 使用API网关统一入口,服务间采用Feign或Dubbo
配置管理困难 使用Nacos等配置中心统一管理
服务监控困难 集成SkyWalking、Prometheus等监控工具

4.3 最佳实践建议

  1. 从简单开始:优先拆分独立边界服务,积累经验

  2. 保持接口兼容性:服务接口设计要考虑向后兼容

  3. 自动化部署:建立CI/CD流水线,实现自动化部署

  4. 监控告警体系:建立完善的监控和告警机制

  5. 文档化:服务接口、部署流程、运维手册等要文档化

Logo

电商企业物流数字化转型必备!快递鸟 API 接口,72 小时快速完成物流系统集成。全流程实战1V1指导,营造开放的API技术生态圈。

更多推荐