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

Flask小酒馆
2025-06-20 10:59
阅读 477

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

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

如果你是一个刚开始学习后端开发的新手,你可能听说过“微服务”这个词,也可能对“Spring Boot”有所了解。那Spring Cloud是什么呢?

简单来说:

Spring Cloud 是一套用于构建分布式系统的工具集

你可以把它想象成一个“工具箱”,专门帮你更方便地管理多个小型的服务(也就是微服务),让这些服务之间能够互相发现、通信、容错、负载均衡等等。

它的典型用途包括:

  • 多个独立服务之间的注册与发现
  • 实现负载均衡
  • 服务之间的配置共享
  • 网关统一请求入口
  • 分布式链路追踪等等

这篇文章将带你在没有任何基础的前提下,一步步理解并使用Spring Cloud的基本功能,并完成一个小项目来加深印象。


环境准备:搭建你的开发环境

环境准备:搭建你的开发环境

在正式开始之前,我们需要准备好以下环境:

所需软件清单:

软件/工具 版本要求(推荐)
Java JDK 1.8 或以上
Maven 最新版本
IntelliJ IDEA 推荐社区版或Ultimate版
Spring Boot 2.7.x 或更高
Spring Cloud 2021.x.x

步骤一:安装JDK和Maven

  1. 下载并安装JDK 1.8或更高版本
    Oracle官网

  2. 配置Java环境变量

  3. 下载Maven
    地址: https://maven.apache.org/download.cgi

  4. 解压Maven并设置MAVEN_HOME系统变量,同时加入PATH环境变量

  5. 验证是否成功:命令行输入以下命令

    java -version
    mvn -v
    

步骤二:安装IDEA(IntelliJ IDEA)

  1. 下载安装包(建议使用IDEA Community免费版即可)
  2. 安装并打开
  3. 安装好插件:
    • Lombok
    • Spring Boot

现在,我们的开发环境就准备好了!


核心概念:用最通俗的语言解释关键术语

核心概念:用最通俗的语言解释关键术语

为了更好的理解Spring Cloud,我们先来认识几个核心的概念:


1. 微服务是什么?

传统单体应用就像一栋房子,所有功能都在一个程序中。而微服务是把这栋房子拆分成多个小房间,每个房间单独工作但又能协作

比如:

  • 用户服务
  • 订单服务
  • 支付服务

它们各自运行,通过网络相互调用。


2. Eureka Server:服务注册与发现中心

想象你有一张公司通讯录,每个人都知道彼此的名字和电话。Eureka 就像这张通讯录

  • 服务启动时会自动注册到Eureka
  • 其他服务可以通过名字找到对方的位置

这样就不需要记住IP地址了,非常灵活。


3. Feign Client:简化远程调用的客户端

Feign的作用就是让你写代码像调用本地方法一样去调用其他服务的方法。

例如:

@FeignClient("order-service")
interface OrderServiceClient {
    @GetMapping("/orders/{id}")
    String getOrderById(@PathVariable String id);
}

看起来是不是很熟悉?这就是本地接口的感觉,但它实际上在调用别的服务!


4. Ribbon:客户端负载均衡器

当你有多个“订单服务”的时候,怎么知道该访问哪一个呢?Ribbon能自动帮你在多个实例之间做负载均衡(轮询等)。


5. Gateway(网关):请求的统一入口

Gateway就像是前台接待员,所有请求都先经过它。它可以做鉴权、路由、限流等功能。


实战项目:一步一步创建第一个Spring Cloud项目

我们将创建一个简单的微服务场景,包含以下几个组件:

  • 用户服务(user-service)
  • 订单服务(order-service)
  • 注册中心Eureka Server
  • 网关gateway-service

第一步:新建父工程(parent project)

使用Maven创建一个空项目,pom.xml内容如下:

<!-- pom.xml -->
<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>springcloud-demo</artifactId>
    <version>1.0.0</version>
    <modules>
        <module>eureka-server</module>
        <module>order-service</module>
        <module>user-service</module>
        <module>gateway-service</module>
    </modules>
    <packaging>pom</packaging>
</project>

第二步:搭建Eureka注册中心

创建模块 eureka-server

1. 添加依赖(pom.xml):

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

2. 启动类添加注解:

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

3. 配置文件application.yml:

server:
  port: 8761

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

启动后访问:http://localhost:8761 查看注册中心界面。


第三步:创建两个微服务(user-service & order-service)

user-service 为例,步骤如下:

1. 添加依赖:

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

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

2. 启动类添加:

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

3. application.yml配置:

server:
  port: 8081

spring:
  application:
    name: user-service

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

同样方式创建 order-service,端口改为8082,名称为order-service


第四步:Feign服务间调用

我们要实现 user-service 调用 order-service

在 user-service 中添加 Feign 客户端

@FeignClient(name = "order-service")
public interface OrderServiceClient {
    @GetMapping("/orders/{id}")
    String getOrderByUserId(@PathVariable("id") String id);
}

控制器中调用:

@RestController
@RequestMapping("/users")
public class UserController {

    private final OrderServiceClient orderServiceClient;

    public UserController(OrderServiceClient orderServiceClient) {
        this.orderServiceClient = orderServiceClient;
    }

    @GetMapping("/{userId}/orders")
    public String getUserOrder(@PathVariable String userId) {
        return orderServiceClient.getOrderByUserId(userId);
    }
}

第五步:加上Ribbon负载均衡

Spring Cloud默认整合了Ribbon,只需确保Feign开启:

在 user-service 的配置类加上:

@Configuration
@EnableFeignClients
public class FeignConfig {
}

第六步:添加网关 gateway-service

1. 添加依赖:

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

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

2. 启动类启用网关:

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

3. application.yml配置:

server:
  port: 8090

spring:
  application:
    name: gateway-service
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/api/users/**
          filters:
            - StripPrefix=1

        - id: order-service
          uri: lb://order-service
          predicates:
            - Path=/api/orders/**
          filters:
            - StripPrefix=1

现在你已经完成了整个项目的搭建!你可以尝试访问:

  • 注册中心:http://localhost:8761
  • 用户服务订单查询(通过网关):
    GET http://localhost:8090/api/users/1/orders
    

常见问题解答

Q1:为什么我的服务没有注册到Eureka?

  • 检查端口是否冲突
  • 确认 @EnableEurekaClient 是否被正确启用
  • 确保 application.yml 中的 Eureka 地址正确无误

Q2:Feign调用时报错找不到服务?

  • 检查服务名拼写是否一致
  • 检查是否开启了 @EnableFeignClients
  • 确保服务已经注册成功后再进行调用

Q3:为什么访问网关的时候报404?

  • 网关路径是否配置正确
  • 是否使用了StripPrefix导致前缀失效
  • 是否开启了网关服务和对应的服务模块

学习建议:下一步可以学什么?

恭喜你完成了Spring Cloud的入门之旅!接下来你可以继续深入学习这些方向:

  • Spring Cloud Config:统一管理多服务的配置信息
  • Spring Cloud Sleuth + Zipkin:分布式请求链路追踪
  • Spring Cloud Alibaba:集成Nacos、Sentinel等国产优秀组件
  • Docker + Kubernetes:容器化部署微服务集群
  • 服务熔断与降级(Hystrix)

随着你的经验增加,你会发现自己不仅可以轻松应对企业级架构设计,还具备了搭建大型后端系统的能力!


希望这篇教程对你有所帮助,愿你在Spring Cloud的世界里一路高歌猛进!如果有什么问题,欢迎留言交流 😊

评论 0

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