Spring Cloud从零开始:微服务入门实战指南

程序员Dev
2025-06-18 04:23
阅读 521

引言:为什么我要写这篇文章?

引言:为什么我要写这篇文章?

我是后端开发工程师,入行已经五年。前两年我一直在做单体架构的系统,维护一个庞大的Spring Boot项目。随着业务快速迭代、团队规模扩大,我们逐渐感受到了单体应用在部署效率、可维护性和扩展性方面的瓶颈。

直到公司决定将整个系统进行微服务化改造——那也是我第一次真正接触到Spring Cloud,从此彻底改变了我的技术认知和职业生涯。

在这篇文章里,我不打算堆砌理论,也不想照搬官方文档。我会用我在项目实践中的真实经历,带你一起从零搭建一套基于Spring Cloud的微服务系统,并分享我在过程中踩过的坑、解决的方法,以及一些生产环境下的经验教训。


问题描述:业务增长带来的挑战

问题描述:业务增长带来的挑战

我们当时的系统是一个电商平台,用户量和商品数迅速上升。原本的单体架构虽然功能完整,但在以下几个方面暴露出了严重问题:

  • 发布频率高但风险大:一个小改动可能导致全站故障。
  • 资源浪费严重:某些模块压力大时,其他模块却闲置。
  • 团队协作困难:不同功能模块耦合严重,多个小组在同一代码库中频繁冲突。

我们意识到再不拆分,系统迟早会成为“运维噩梦”。于是,我们决定使用Spring Cloud Alibaba(SCA)+ Nacos + Sentinel + Gateway来构建我们的微服务架构体系。


解决方案:选型与架构设计思路

技术栈选型

模块 技术选型
注册中心 Nacos
网关 Spring Cloud Gateway
负载均衡 LoadBalancer(Ribbon)
配置中心 Nacos Config
熔断降级 Sentinel
分布式事务 Seata (后续接入)
日志追踪链路 Sleuth + Zipkin

缓存策略对比-1

之所以选择Nacos和Sentinel,是因为当时公司在用阿里云,对这些组件有天然集成的优势。而且社区活跃度高,文档也相对完善。

微服务划分思路

我们并没有一开始就搞得很复杂,而是按照业务域进行了初步拆分:

  • 用户中心(user-service)
  • 商品中心(product-service)
  • 订单中心(order-service)
  • 支付中心(payment-service)
  • 网关(gateway-api)

每个服务独立部署,数据库也做了分库处理,采用读写分离+主从复制来提高性能。


代码实践:关键配置与核心实现

接下来我会以user-service为例,展示Spring Cloud项目的基本结构和关键配置项。

1. 引入依赖(pom.xml)

<dependencies>
    <!-- Spring Boot Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

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

    <!-- Sentinel 熔断限流 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    </dependency>

    <!-- Gateway 会在网关模块引入 -->
</dependencies>

2. 启动类(UserApplication.java)

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

3. 应用配置文件 application.yml

server:
  port: 8081

spring:
  application:
    name: user-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
    sentinel:
      transport:
        dashboard: localhost:8080 # Sentinel 控制台地址

启动这个服务之后,它就会自动注册到Nacos上。


踩坑经验:那些年我在Spring Cloud路上翻过的车

坑一:服务发现失败

一开始启动多个服务,但是它们互相之间无法发现彼此。后来排查发现是由于:

  • Nacos未正确启动
  • 防火墙策略没有放行8848端口
  • bootstrap.yml配置错误,应优先于application.yml加载

解决方案:确保nacos服务正常运行,并且所有微服务能访问其地址;检查防火墙设置;使用bootstrap.yml加载nacos server地址。

坑二:负载均衡失效

我们使用的是Ribbon + OpenFeign的方式调用接口,结果测试发现Feign调用一直报错“No instances available for service”。

原因分析:Spring Boot版本与Spring Cloud版本不兼容导致LoadBalancer未生效。

解决办法:统一升级Spring Boot为2.6.x,Spring Cloud Alibaba版本为2021.0.5.0,并添加以下配置:

@Configuration
public class FeignConfig {
    
    @Bean
    public LoadBalancerFeignClient loadBalancerFeignClient() {
        return new LoadBalancerFeignClient(new OkHttpClient(), null, null);
    }
}

坑三:Sentinel熔断规则不生效

我们在本地测试Sentinel限流时,发现配置了流控规则却没有触发。

根本原因:缺少初始化请求,Sentinel的客户端需要先有流量进来才会激活规则匹配。

解决方式:手动发送一次请求,或者通过API或Nacos动态推送规则。


效果总结:从单体到微服务带来的提升

完成基础微服务架构搭建后,我们取得了以下成果:

指标 单体架构 微服务架构 提升幅度
发布效率 每周1次大版本 每天可以灰度发布 ⬆️ 5倍
系统可用性 平均97% 提升至99.3% ⬆️ 2.3%
错误影响范围 全站崩溃风险 局部失败不影响其他服务 显著降低
开发协作效率 多人冲突频繁 按模块拆分职责清晰 ⬆️ 40%以上

另外,借助Sentinel和Zipkin,我们实现了更细粒度的链路监控和性能调优能力,提升了线上排障效率。


经验分享:给新手的一些建议

如果你刚接触Spring Cloud,或者正在考虑微服务转型,以下是我根据多年实战总结的一些实用建议:

1. 不要一上来就追求完美架构

微服务不是银弹。刚开始不要追求大而全,比如:

  • 可以先拆出核心服务(如订单、支付)
  • 使用简单的服务注册(如Eureka or Nacos)
  • 暂时不介入复杂的分布式事务,先保证数据一致性在单服务内做好

等架构逐步稳定后再引入Seata、Sleuth、OAuth2认证机制等进阶组件。

2. 注意服务治理细节

  • 接口幂等性:尤其是订单提交、支付回调这类操作,一定要加上唯一ID去重。
  • 异步消息解耦:有些逻辑不需要强一致性的交互,可以用MQ解耦(如下单后发送邮件通知)。
  • 链路追踪必须接入:否则出了问题,查日志像在找宝藏。

3. 数据库也要拆得合理

我们拆库初期犯了个错误:把用户和订单表放在不同的库,结果联合查询成了难题。

后来我们采用了两种方式结合:

  • 对实时性要求高的,通过RPC调用获取数据
  • 对报表类场景,使用定时同步写入ES或ClickHouse做聚合分析

这样既保证了业务一致性,又避免了数据库跨服务JOIN的问题。

4. 尽量统一技术栈和开发规范

我们前期各个服务用的框架风格五花八门,比如有的用MyBatis,有的用JPA,甚至还有部分用了自己封装的SQL工具。

后期为了维护方便,我们统一迁移到了MyBatis Plus + Druid + PageHelper,大大降低了沟通成本。


总结:微服务是一场持久战

说实话,微服务从来都不是一件轻松的事,尤其是从零开始。很多同学觉得Spring Cloud就是加几个依赖、开个网关那么简单,其实不然。

它背后是一整套工程化思维、运维自动化、监控体系的综合体现。每一个小决策都可能在未来带来蝴蝶效应。

不过,一旦你迈过了学习曲线,微服务带来的灵活性、可维护性和持续交付能力会让你真正体会到“架构之美”。

如果你正站在微服务这条道路上,请相信自己,坚持走下去,每一步都会沉淀成宝贵的经验。

最后送一句我的座右铭:好的架构不是设计出来的,是踩坑踩出来的。

希望这篇带着温度的技术文章,能帮你少走些弯路,顺利开启你的Spring Cloud之旅。


📌 如果这篇文章对你有所帮助,欢迎点赞、收藏、转发!有问题也可以留言交流~

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝