从零搭建你的第一个微服务:Spring Cloud实战入门

React炼金术士
2025-12-28 14:22
阅读 264

大家好,我是工作五年的后端开发工程师。最近带了不少实习生,发现很多同学在学 Spring Cloud 时一头雾水——概念太多、文档太散、Demo 太复杂。我当初学的时候,也踩过无数坑,所以今天写这篇教程,用一个真实小项目带你一步步搞懂微服务的核心逻辑,不讲虚的,只写能跑起来的代码。

如果你正在准备求职,微服务几乎是中高级 Java 岗的必考项。面试官常问:“你们系统怎么拆服务的?”“注册中心挂了怎么办?”——这些问题的答案,就藏在这篇实战里。


一、微服务到底是什么?为什么用它?

简单说:把一个大应用拆成多个小服务,各自独立开发、部署、运行

比如你做一个电商系统:

  • 用户服务(管登录、注册)
  • 商品服务(管商品信息)
  • 订单服务(管下单)

每个服务都是一个独立的 Spring Boot 应用,通过网络互相调用。好处很明显:

  • 某个服务崩了,不影响其他功能
  • 团队可以并行开发不同服务
  • 技术栈可以灵活选择(甚至用 Go 写某个服务!)

💡 小知识:Spring Boot 是构建单个服务的基础框架,而 Spring Cloud 是让多个 Spring Boot 服务协同工作的“粘合剂”。


二、环境准备:5分钟搭好开发环境

你需要安装以下工具(版本建议):

工具 推荐版本 作用
JDK 17 或 21 Java 运行环境
Maven 3.8+ 项目依赖管理
IDEA 最新版 开发 IDE
Nacos 2.3+ 服务注册与发现中心

步骤:

  1. 下载 Nacos,解压后进入 bin 目录
  2. Windows 执行 startup.cmd -m standalone,Mac/Linux 执行 sh startup.sh -m standalone
  3. 浏览器访问 http://localhost:8848/nacos,账号密码都是 nacos

避坑提示:别用最新快照版!新手用稳定版(如 2.3.0)能少踩 80% 的坑。


三、核心概念:3个关键词搞定微服务通信

1. 服务注册与发现(Service Registry)

每个服务启动时,会把自己的 IP 和端口告诉 Nacos。其他服务想调用它,就去 Nacos 问:“用户服务在哪?”

2. 服务调用(Feign)

不用写 http://ip:port/api 这种硬编码!用 Feign 像调本地方法一样调远程服务。

3. 配置中心(可选,本次略)

统一管理所有服务的配置文件,改配置不用重启服务。


四、实战:动手写两个微服务

我们将创建:

  • user-service:提供用户信息
  • order-service:调用 user-service 获取用户数据

第一步:创建 user-service(Spring Boot 项目)

pom.xml 关键依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <version>2022.0.0.0</version>
    </dependency>
</dependencies>

application.yml

server:
  port: 8081
spring:
  application:
    name: user-service  # 服务名,必须唯一!
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

UserController.java

@RestController
public class UserController {
    @GetMapping("/user/{id}")
    public String getUser(@PathVariable Long id) {
        return "User-" + id;
    }
}

启动后,打开 Nacos 控制台,你会看到 user-service 已注册!


第二步:创建 order-service(调用 user-service)

pom.xml 添加 Feign 依赖:

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

application.yml

server:
  port: 8082
spring:
  application:
    name: order-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

启用 Feign(主类加注解):

@SpringBootApplication
@EnableFeignClients // 开启 Feign 客户端
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
}

定义 Feign 接口

@FeignClient(name = "user-service") // 对应 user-service 的 spring.application.name
public interface UserClient {
    @GetMapping("/user/{id}")
    String getUser(@PathVariable("id") Long id);
}

OrderController 调用

@RestController
public class OrderController {
    @Autowired
    private UserClient userClient;

    @GetMapping("/order/{userId}")
    public String createOrder(@PathVariable Long userId) {
        String user = userClient.getUser(userId);
        return "Created order for " + user;
    }
}

启动 order-service,访问 http://localhost:8082/order/123,你会看到:

Created order for User-123

🎉 成功!两个服务通过 Nacos 自动发现并通信!


五、新手常见问题 & 解决方案

❓ 问题1:启动报错 “No qualifying bean of type 'UserClient'”

原因:没加 @EnableFeignClients解决:检查主启动类是否添加该注解

❓ 问题2:调用时报 404 或连接拒绝

原因:user-service 没启动,或 Nacos 没连上 ✅ 解决

  • 确保 Nacos 先启动
  • 检查两个服务的 spring.cloud.nacos.discovery.server-addr 是否一致
  • 查看 Nacos 控制台是否有两个服务注册

❓ 问题3:能不能混用其他语言?比如用 Go 写订单服务?

完全可以! 微服务本质是 HTTP/REST 通信。只要 Go 服务也注册到 Nacos(可用 nacos-sdk-go),Java 服务就能通过服务名调用它。这也是微服务的优势之一!


六、求职 & 面试题挑战

掌握以上内容,你已经能应对不少初级面试题:

面试题 回答要点
Spring Boot 和 Spring Cloud 有什么区别? Boot 是单体应用框架,Cloud 是微服务治理工具集
服务注册中心的作用是什么? 实现服务自动发现,避免硬编码 IP
Feign 的底层原理? 基于 Ribbon 负载均衡 + 动态代理生成 HTTP 请求

🔥 进阶建议:面试官如果问“高可用怎么做?”,你可以答:“Nacos 集群部署 + 服务多实例 + Feign 超时重试”,这分就稳了。


七、下一步学习建议

  1. 加监控:集成 Spring Boot Admin 或 Prometheus
  2. 加网关:用 Spring Cloud Gateway 统一入口
  3. 加熔断:Hystrix 或 Sentinel 防止雪崩
  4. 读源码:看 Feign 和 Nacos Client 的实现逻辑

📌 我的经验:不要一开始就学全套!先搞懂“注册-发现-调用”这条主线,再逐步扩展。我见过太多人卡在配置中心或链路追踪上,结果连最基本的调用都没跑通。


微服务不是银弹,但它是现代后端开发的必备技能。你不需要一次学会所有,只要今天比昨天多跑通一行代码,就是进步。希望这篇教程能帮你迈出第一步。有问题欢迎留言,我会一一回复!

加油,未来的架构师!

评论 0

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