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

萧军_开发者
2025-06-20 03:43
阅读 340

开篇:什么是Spring Cloud?它能用来做什么?

开篇:什么是Spring Cloud?它能用来做什么?

Spring Cloud 是一套基于 Spring Boot 的分布式系统开发工具集。它的目标是简化微服务架构的搭建、部署和管理,帮助我们快速构建高可用、可扩展的服务。

简单来说,微服务就是把一个大的系统拆分成多个小的服务,每个服务独立运行、独立部署,并通过网络进行通信协作。比如,一个电商平台可能分为“用户中心”、“订单系统”、“库存服务”等多个微服务。

Spring Cloud 提供了包括服务发现、配置中心、负载均衡、断路器、网关等一整套解决方案,让你在开发微服务时不再需要自己造轮子。


环境准备:搭建你的第一个Spring Cloud项目环境

环境准备:搭建你的第一个Spring Cloud项目环境

步骤一:安装Java与Maven

  1. 安装 Java 17(推荐使用OpenJDK):

  2. 验证是否安装成功:

    java -version
    mvn -v
    
  3. 安装 Maven(如果未集成在IDE中):

步骤二:安装开发工具

推荐使用 IntelliJ IDEA 社区版或企业版:


核心概念:5个最基础的微服务概念你必须知道!

核心概念:5个最基础的微服务概念你必须知道!

以下是Spring Cloud中最常用的5个核心组件及其用途:

1. Eureka(服务注册与发现)

  • 功能:让不同微服务之间能够互相“找到”
  • 类比:就像电话本一样,每个服务启动后都去Eureka登记自己的名字和IP地址

2. RestTemplate + Ribbon(远程调用和客户端负载均衡)

  • 功能:A服务向B服务发起请求,Ribbon会自动选择一个合适的节点

3. Feign(声明式HTTP客户端)

  • 功能:像写本地方法一样调用其他服务接口

  • 示例代码:

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

4. Hystrix(断路器)

  • 功能:当某个服务出问题时,防止整个系统崩溃
  • 类比:像是电路中的保险丝——一旦故障超过阈值就熔断,返回备用数据

5. Gateway / Zuul(API网关)

  • 功能:统一入口,负责路由、权限控制、限流等
  • 示例URL规则:
请求路径 转发到服务
/api/user/** user-service
/api/order/** order-service

实战项目:一步步创建两个微服务并实现通信

实战项目:一步步创建两个微服务并实现通信

假设我们要做一个“订单系统”,其中“订单服务”需要访问“用户信息”。

第一步:创建Eureka Server(服务中心)

  1. 新建 Spring Boot 项目,添加依赖:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    
  2. 修改 application.yml

    server:
      port: 8761
    eureka:
      client:
        register-with-eureka: false
        fetch-registry: false
        service-url:
          defaultZone: http://localhost:8761/eureka/
    
  3. 启动类加注解:

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

系统架构设计图-1

第二步:创建 user-service(用户服务)

  1. 添加依赖:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    
  2. application.yml:

    spring:
      application:
        name: user-service
    server:
      port: 8081
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:8761/eureka/
    
  3. 编写 Controller 示例:

    @RestController
    @RequestMapping("/users")
    public class UserController {
        @GetMapping("/{id}")
        public User getUser(@PathVariable Long id) {
            return new User(id, "Tom");
        }
    }
    
    class User {
        private Long id;
        private String name;
    
        // Getter and Setter ...
    }
    

第三步:创建 order-service(订单服务),并通过Feign调用用户服务

  1. 添加 Feign 和 Eureka Client 依赖:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    
  2. application.yml:

    spring:
      application:
        name: order-service
    server:
      port: 8082
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:8761/eureka/
    
  3. 启动类加注解:

    @SpringBootApplication
    @EnableFeignClients
    public class OrderApplication {
        public static void main(String[] args) {
            SpringApplication.run(OrderApplication.class, args);
        }
    }
    
  4. 编写 Feign Client 接口:

    @FeignClient(name = "user-service")
    public interface UserServiceClient {
        @GetMapping("/users/{id}")
        User getUserById(@PathVariable("id") Long id);
    }
    
  5. 在 OrderController 中调用:

    @RestController
    @RequestMapping("/orders")
    public class OrderController {
    
        @Autowired
        private UserServiceClient userServiceClient;
    
        @GetMapping("/{orderId}")
        public String getOrderWithUser() {
            User user = userServiceClient.getUserById(1L);
            return "Order is placed by " + user.getName();
        }
    }
    

✅ 到这一步为止,你的两个微服务已经可以愉快地互相通信啦!


常见问题解答(FAQ)

Q1:为什么启动服务时报错 “Cannot connect to Eureka Server”?

A:确保Eureka先启动,再启动微服务;检查 eureka.client.service-url.defaultZone 地址是否正确。


Q2:为什么Feign无法调用另一个服务?

A:请确认以下几点:

  • Feign依赖是否引入?
  • Feign client是否被扫描(@EnableFeignClients)
  • 被调服务的路径是否拼写正确
  • 被调服务是否真的在运行

Q3:如何查看哪些服务注册到了Eureka?

A:访问 http://localhost:8761/,页面上就会列出当前已注册的所有服务。


Q4:服务名大小写影响吗?例如 user-service vs UserService?

A:不影响,Eureka内部对服务名称不区分大小写。


Q5:RestTemplate和Feign的区别是什么?

特点 RestTemplate Feign
使用方式 手动拼接URL 注解驱动,更简洁
可读性 较差 更好,面向接口
性能 相当 相当
推荐程度 早期做法 当前主流,推荐使用

学习建议:下一步该学什么?

恭喜你完成了第一个Spring Cloud微服务系统!下面是一些进阶学习方向:

✅ 加餐技能

  • Spring Cloud Config:统一管理多个服务的配置文件
  • Spring Cloud Sleuth + Zipkin:服务链路追踪
  • Nacos 或 Apollo:更高级的配置中心
  • RabbitMQ/Kafka:异步消息处理机制
  • Docker & Kubernetes:容器化部署

📚 推荐学习资源


写在最后

如果你是刚接触 Spring Cloud 的新手,建议按照这篇文章的结构一步步来实践。不要急于求成,每学一个模块就动手敲一次代码。你会发现——微服务并不是想象中那么神秘,它其实只是一种更好的软件设计方式罢了。

遇到问题别怕,多查文档、多看日志、多问社区。欢迎在评论区留言交流学习心得,一起进步 💪!


📌 文章总字数:约 2831 字

评论 0

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