请写一篇关于【Spring Cloud从零开始:微服务入门指南】的技术文章

~梁红
2026-01-04 01:28
阅读 4806

去年十月,北京的秋天短得让人心慌。我坐在国贸三期楼下一家连锁咖啡馆里,手边放着一杯已经凉透的美式,笔记本屏幕亮着,正对着一个刚拉下来的 Spring Boot 项目模板发呆。那天是周五,晚上八点半,老婆在微信里发来消息:“今天能早点回吗?孩子发烧了。”

我回了个“马上”,但手指却迟迟没动。因为我知道,所谓的“马上”可能又是凌晨一点。而这样的“马上”,在过去三年里,已经变成了常态。

一、三十多岁的老码农,还在一线写代码

我是典型的“高龄”Java程序员——35岁,头发比五年前少了三分之一,腰椎间盘突出比KPI还稳定。目前在一家中型互联网公司做后端开发,月薪22k,房租3500(合租),每月给老家父母打2000,孩子上私立幼儿园学费4800。说不上富裕,但也算不上拮据。只是每次看到招聘网站上“35岁以下优先”的字样,心里总会咯噔一下。

最近,我和老婆认真聊了一次要不要回老家发展的事。她不是催我躺平,而是看我每天回家都像被掏空一样,连陪孩子搭积木的力气都没有。她说:“你在北京,除了工资高点,还有啥?空气差、节奏快、人情冷。” 我一时语塞。确实,除了“技术成长”,我好像也没剩下什么了。

可问题来了——如果回老家,我能做什么?小城市没有微服务架构,没有高并发场景,甚至很多公司还在用 Struts2。我引以为傲的 Spring Cloud 经验,在老家可能连面试官都听不懂。

二、为什么我要重新学一遍 Spring Cloud?

其实我对 Spring Cloud 并不陌生。早在2018年,我就参与过公司从单体架构向微服务拆分的项目。那时候 Eureka 还是主流注册中心,Zuul 做网关,Hystrix 处理熔断。但这些年技术迭代太快,Nacos 取代了 Eureka,Gateway 替代了 Zuul,Sentinel 也慢慢替代了 Hystrix。更别说 Spring Boot 3.x 对 Jakarta EE 的迁移,让我这个老 Javaer 一度怀疑自己是不是落伍了。

上周五晚上,孩子睡着后,我翻出尘封已久的 GitHub 账号,新建了一个 repo,名字就叫 spring-cloud-from-zero。我对自己说:既然不确定未来在哪,那就先把技术底座打牢。不管是在北京还是回老家,代码能力是我唯一能掌控的东西。

三、从零开始,不是从 Hello World 开始

很多人以为微服务入门就是跑通一个注册中心 + 两个服务调用。但真正的“从零开始”,是要理解背后的问题驱动。

场景还原:我们为什么要拆微服务?

2019年,我在上一家公司做电商后台。当时系统还是单体架构,订单、用户、商品全在一个 WAR 包里。大促时,哪怕只是商品模块有 Bug,整个系统都可能雪崩。有一次因为一个慢 SQL,导致数据库连接池耗尽,所有接口超时。老板在会议室拍桌子:“你们就不能把系统拆开?”

于是我们开始搞微服务。但初期踩了很多坑:

  • 服务之间怎么发现彼此?→ 引入 Eureka
  • 服务挂了怎么办?→ 加 Hystrix 熔断
  • 配置怎么统一管理?→ 上 Spring Cloud Config
  • 网关怎么路由?→ Zuul 拦截请求

现在回头看,这些组件不是为了“炫技”,而是为了解决真实业务痛点。

实战第一步:用 Nacos 替代 Eureka

我这次搭建的第一个服务是 user-service,用 Spring Boot 3.2 + Spring Cloud 2022.0.3。

// bootstrap.yml
spring:
  application:
    name: user-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

注意:Spring Boot 3.x 默认不再加载 bootstrap.yml,需要手动引入 spring-cloud-starter-bootstrap。这点坑了我半天,日志里一直报“Nacos is not enabled”。查文档才发现是版本兼容问题。

启动 Nacos(本地用 Docker):

docker run --name nacos -e MODE=standalone -p 8848:8848 nacos/nacos-server

然后访问 http://localhost:8848/nacos,用户名密码都是 nacos。看到 user-service 注册上来那一刻,我居然有点小激动——就像当年第一次用 System.out.println("Hello World") 一样。

第二步:服务调用,别再用 RestTemplate 了!

早期我们都用 RestTemplate + @LoadBalanced 做服务调用:

@Autowired
private RestTemplate restTemplate;

public User getUser(Long id) {
    return restTemplate.getForObject("http://user-service/user/" + id, User.class);
}

但现在,官方推荐用 OpenFeign,声明式接口更简洁:

@FeignClient(name = "user-service")
public interface UserClient {
    @GetMapping("/user/{id}")
    User getUser(@PathVariable("id") Long id);
}

加上配置:

feign:
  client:
    config:
      default:
        connectTimeout: 5000
        readTimeout: 5000

这样调用方只需要注入 UserClient,像调本地方法一样调远程服务。这才是微服务该有的体验。

第三步:熔断降级,别等线上炸了才想起

去年我们有个支付服务,依赖第三方接口。某天第三方响应变慢,我们的线程全卡住,最后 Tomcat 线程池耗尽,整个服务不可用。

现在我会在 Feign Client 上加 Sentinel 注解:

@FeignClient(name = "payment-service", fallback = PaymentClientFallback.class)
public interface PaymentClient {
    @PostMapping("/pay")
    Result pay(@RequestBody PayRequest request);
}

@Component
public class PaymentClientFallback implements PaymentClient {
    @Override
    public Result pay(PayRequest request) {
        // 降级逻辑:返回“支付繁忙,请稍后再试”
        return Result.fail("支付服务暂时不可用");
    }
}

配合 Sentinel 控制台,还能动态设置熔断规则。技术不是摆设,是保命符。

四、回到现实:技术再强,也挡不住生活的重压

写到这里,已经是凌晨两点。窗外北京的夜很静,只有偶尔驶过的出租车声。我忽然想到,就算我把 Spring Cloud 吃得再透,回老家可能也用不上。小城市的 IT 公司,可能连 Docker 都没普及,更别说服务网格了。

但转念一想:技术的价值,不在于它能不能直接变现,而在于它塑造的思维方式。

微服务教会我的,不是怎么写代码,而是:

  • 如何拆解复杂问题(单一职责)
  • 如何设计容错机制(熔断、降级)
  • 如何做配置隔离(配置中心)
  • 如何监控系统健康(Metrics + Logging)

这些能力,哪怕我在老家开个小店做电商 SaaS,也能用上。技术是工具,更是思维模型。

五、给同样迷茫的同行几点建议

如果你也和我一样,30+,在一线写代码,考虑要不要换个活法,我想说:

  1. 别把技术当成枷锁。Spring Cloud 不是必须掌握的“神技”,它是解决特定规模问题的方案。小项目用单体完全 OK。
  2. 保持“可迁移能力”。与其死磕某个框架,不如深入理解分布式系统的核心概念:CAP、一致性、幂等性、最终一致性。
  3. 技术之外,要有 Plan B。我在 GitHub 上开源了一些脚手架项目,也在知乎写技术分享。万一哪天失业,这些积累或许能变成副业。
  4. 家庭比 KPI 重要。上周我跟老婆说,如果明年春招能找到老家合适的工作,我就回去。她说:“你开心就好。” 那一刻,我觉得值了。

六、代码人生,不止于代码

写这篇《Spring Cloud 从零开始》的初衷,不是教大家怎么配置 Nacos,而是想说:我们这代 Java 程序员,经历了从 SSH 到 Spring Boot 再到云原生的完整周期。我们不是被淘汰的一代,而是承前启后的一代。

无论你选择留在一线城市卷,还是回老家过慢生活,都别忘了:你的价值,从来不只是你写的那几行代码,而是你解决问题的能力、持续学习的韧性,以及对生活的热爱。

技术会过时,框架会淘汰,但“代码人生”四个字,值得我们用一辈子去书写。


最后的小彩蛋:
我把这次从零搭建的 Spring Cloud 项目开源了,地址在 GitHub 搜 spring-cloud-from-zero。里面有完整的 README 和避坑指南。如果你也在学微服务,欢迎 Star & Fork。说不定哪天,我们在老家的咖啡馆偶遇,还能一起聊聊 Nacos 和孩子的奶粉钱。

共勉。

评论 0

最热最新
暂无评论
~梁红Lv.1
0
影响力
0
文章
0
粉丝