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

赵志华_移动端
2025-06-26 14:17
阅读 593

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

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

在现代软件开发中,微服务架构(Microservices Architecture) 是一种非常流行的开发模式。简单来说,它就是把一个大系统拆分成多个小的、独立运行的服务模块,每个模块负责不同的功能。

比如,一个电商网站可以被拆分为商品服务、用户服务、订单服务等多个部分。它们各自独立运行,但又可以通过网络进行通信协作。这种设计方式让整个系统更加灵活、易于维护和扩展。

Spring Cloud,就是一套用来构建和管理这些“微服务”的工具集合。它是基于 Spring Boot 的,也就是说,你不需要重新学习新的语法,而是使用你已经熟悉的 Spring 来写程序,只不过现在你可以轻松地写出多个服务,并协调它们的工作。


环境准备:搭建你的第一个 Spring Cloud 开发环境

环境准备:搭建你的第一个 Spring Cloud 开发环境

所需工具清单:

  • Java JDK 1.8 或以上(推荐 17)
  • Maven 或 Gradle(本文使用 Maven)
  • IDE:IntelliJ IDEA(社区版即可)、Eclipse 或 VS Code 都可以
  • Spring Initializr(用于快速生成项目结构)

步骤 1:安装 Java 和配置环境变量

下载 Java SE Development Kit(JDK)并安装:

安装完成后,在命令行输入以下命令查看是否安装成功:

java -version
javac -version

确保输出类似如下内容:

java version "17.0.3" 2022-04-19 LTS
Java(TM) SE Runtime Environment (build 17.0.3+7-LTS-40)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.3+7-LTS-40, mixed mode, sharing)

步骤 2:安装 IntelliJ IDEA

前往官网 https://www.jetbrains.com/idea/download/ 下载并安装 IntelliJ IDEA Community 版本。

步骤 3:创建 Spring Boot 项目

打开浏览器,进入 https://start.spring.io/,这是一个官方提供的项目生成器。

填写如下信息:

填写内容
Project Maven
Language Java
Spring Boot Version 例如 3.1.x
Group com.example
Artifact microservice-demo
Name 微服务练习项目
Dependencies Spring Web、Spring Cloud Starter Config、Spring Cloud Starter Netflix Eureka Client

点击“Generate”按钮下载项目压缩包,解压后用 IntelliJ IDEA 打开该项目。


核心概念:理解 Spring Cloud 的几个关键词

对于初学者来说,以下几个核心概念是必须了解的。

1. 服务注册与发现(Service Registration & Discovery)

想象一下你有一群朋友在不同的地方工作,你想要联系他们时,得知道每个人的电话号码或位置。而在微服务世界里,“服务中心(Eureka Server)”就像是通讯录一样,所有服务启动后都会告诉 Eureka 自己的位置,其他服务要找它的时候就去问 Eureka。

2. 配置中心(Config Server)

很多服务可能共享同样的配置文件,比如数据库连接密码、日志级别等。Config Server 可以集中管理这些配置,并动态推送给各服务。

3. 负载均衡(Load Balancing)

当一个服务有多份实例运行时,如何决定将请求交给哪一个?Ribbon 或 LoadBalancer 工具就可以帮你实现这个分配逻辑。

4. 网关(API Gateway)

所有用户的请求都通过一个统一入口进来。Zuul 或 Gateway 可以作为访问入口,做身份验证、限流等功能。

接下来我们就先从最基础的“服务注册中心”讲起。


实战项目:从零开始搭建一个简单的微服务项目

服务器部署方案-1

目标:我们来做一个“图书管理系统”,包括两个微服务:

  1. book-service:提供图书列表数据
  2. user-service:模拟用户登录操作
  3. 使用 Eureka Server 作为注册中心,统一注册和发现这两个服务

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

创建一个新的 Spring Boot 项目(eureka-server)

再次访问 https://start.spring.io/,填入如下参数:

内容
Project Maven
Language Java
Spring Boot Version 同上(如 3.1.x)
Group com.example
Artifact eureka-server
Dependencies Spring Web、Spring Cloud Starter Netflix Eureka Server

修改 application.yml 文件:

server:
  port: 8761

eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

缓存策略对比-2

主类添加注解开启 Eureka 功能:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

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

启动后打开浏览器访问:http://localhost:8761 就能看到 Eureka 控制台界面了。


第二步:创建第一个微服务 —— 图书服务(book-service)

新建一个 Spring Boot 项目,还是去 start.spring.io 创建:

  • ArtifactId:book-service
  • Dependencies:Spring Web + Spring Cloud Starter Netflix Eureka Client

application.yml:

spring:
  application:
    name: book-service

server:
  port: 8081

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

启动类加入注解:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

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

编写一个简单的 API 接口:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/books")
public class BookController {

    @GetMapping
    public String getBooks() {
        return "[Book1, Book2, Book3]";
    }
}

启动后回到 Eureka 页面,可以看到注册成功的记录!


第三步:创建第二个微服务 —— 用户服务(user-service)

同样创建一个新的 Spring Boot 项目:

  • artifact:user-service
  • dependencies:Spring Web + Eureka Client

application.yml:

spring:
  application:
    name: user-service

server:
  port: 8082

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

主类加注解启用服务发现:

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

编写一个简单的 API 示例:

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

    @GetMapping("/login")
    public String login() {
        return "Login success for User!";
    }
}

启动后刷新 Eureka 页面,应该也能看到 user-service 成功注册进去。


进阶小尝试:让 User 服务调用 Book 服务

我们需要使用 RestTemplate + 负载均衡来进行服务间的通信。

修改 UserServiceApplication 加入 RestTemplate Bean:

import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;

@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

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

新建一个 Controller 来调用 Book 服务:

@RestController
@RequestMapping("/api")
public class ApiService {

    private final RestTemplate restTemplate;

    public ApiService(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    @GetMapping("/books")
    public String callBookService() {
        String url = "http://book-service/books";
        return restTemplate.getForObject(url, String.class);
    }
}

然后访问 http://localhost:8082/api/books,就能看到图书服务返回的结果啦!


常见问题解答

Q1:服务注册不上怎么办?

  • 检查 Eureka 服务是否正常运行。
  • 检查服务的 application.yml 中是否有拼写错误。
  • 查看控制台日志是否有异常提示。

Q2:RestTemplate 报错“No instances available for service”。

  • 表示没有可用的微服务实例。
  • 检查服务是否真的在运行、端口有没有冲突。
  • 等待几秒再试一次,有时候注册需要点时间同步。

Q3:IDE 中找不到 “@EnableDiscoveryClient” 这样的注解?

  • 检查依赖中是否引入了 spring-cloud-starter-netflix-eureka-client
  • Maven 中查看 pom.xml 是否有相关依赖。

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

恭喜你完成了第一个 Spring Cloud 微服务项目!以下是继续深入学习的方向建议:

🔹 深入微服务组件学习:

  • Hystrix(熔断器):当某个服务挂掉时自动切换备用方案,提高系统稳定性。
  • Gateway / Zuul(网关):为所有的微服务提供统一访问入口,集成权限认证。
  • Spring Cloud Config(配置中心):让所有服务读取远程配置,便于统一管理和更新。
  • Spring Cloud Sleuth(链路追踪):跟踪请求在多个服务之间的流转路径。

🔹 实践拓展建议:

  • 尝试给项目加上数据库层(如 MySQL)。
  • 给每个服务加上 Swagger 文档接口说明。
  • 部署到服务器或者 Docker 容器中。

🔹 推荐学习资料:


总结

Spring Cloud 是现代分布式系统的“利器”,虽然刚接触会有些复杂,但只要从最小的例子入手,边学边练,很快你就能掌握它的基本使用方法。

本文带你一步步搭建了一个简单的微服务系统,包含服务注册、调用等基本功能。接下来的学习重点,就是不断扩展你的知识边界,逐步掌握更多高级特性。

记住一句话:代码是最好的老师。动手实践,不要怕出错。祝你在学习 Spring Cloud 的路上越走越顺!🚀

评论 0

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