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

赵建华
2025-06-12 00:07
阅读 368

开篇:Spring Cloud 是什么?为什么我们要学习它?

开篇:Spring Cloud 是什么?为什么我们要学习它?

如果你刚接触“微服务”这个概念,没关系。我们先来简单说一下:

微服务(Microservice) 就是将一个大的系统拆成多个小的服务,每个服务只做一件事,独立运行、独立部署。这种架构让大项目变得更灵活、更容易维护。

Spring Cloud 就是专门为这些微服务提供一套“工具包”的框架,帮助开发者更轻松地实现:

  • 服务注册与发现
  • 负载均衡
  • 配置中心
  • 网关路由
  • 断路器保护等

🌟 类比:你可以把 Spring Cloud 想象成“搭建乐高积木的说明书和辅助工具”,而不是直接帮你搭好一个房子。你还是得自己动手拼装,但有了这套工具,事情变得容易多了。


环境准备:开始前需要安装哪些东西?

环境准备:开始前需要安装哪些东西?

为了顺利跟着本教程操作,你需要在本地准备好以下开发环境:

✅ 1. Java 开发环境(JDK)

推荐使用 JDK 17 或更高版本。

java -version

输出类似如下即可:

openjdk version "17.0.3" 2022-04-19

✅ 2. Maven 构建工具

Spring Boot 和 Spring Cloud 项目通常使用 Maven 来管理依赖。

mvn --version

✅ 3. IntelliJ IDEA(或其他IDE)

IntelliJ IDEA 社区版完全免费,非常适合 Java 开发。当然,也可以使用 Eclipse、VS Code(配合插件)。

✅ 4. Node.js 和 Postman(可选)

Postman 用于测试接口很方便,Node.js 可以用来写一些简单的前后端示例。


核心概念:Spring Cloud 到底有哪些关键功能?

我们现在不需要一下子记住所有内容,只要有一个初步的印象就行。

功能模块 描述 工具类比
Eureka(服务中心) 所有服务都在这里注册自己,别的服务可以来找你 公司内部通讯录
Ribbon / LoadBalancer(负载均衡) 多个相同服务怎么选一个访问?它来帮忙选 前台分配客户到不同窗口
Feign / OpenFeign(远程调用) 让服务之间像调方法一样通信 直接打电话办事
Gateway(网关) 统一入口,控制请求流向哪个服务 公司的大门保安
Config(配置中心) 把各个服务的配置统一放在一个地方管理 云端记事本
Sleuth & Zipkin(链路追踪) 查看一个请求经过了哪些服务,耗时多久 记录快递运输路径
Sentinel / Hystrix(熔断降级) 服务挂了不能拖垮整个系统,要能“自我保护” 出现故障自动报警

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

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

我们来做一个最基础的例子:创建一个商品服务和一个订单服务,让它们互相通信。

第一步:创建父工程(统一管理多个子服务)

新建一个空目录,比如叫 springcloud-demo,在这个目录下创建一个 pom.xml 文件:

<!-- springcloud-demo/pom.xml -->
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                             http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>springcloud-demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <modules>
        <module>product-service</module>
        <module>order-service</module>
    </modules>
</project>

这个父工程本身不写代码,只是用来管理下面两个子模块。


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

1. 新建模块:eureka-server

创建目录 eureka-server 并添加如下 pom.xml

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

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

2. 添加启动类:

// EurekaServerApplication.java
package com.example.eurekaserver;

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);
    }
}

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,你会看到 Eureka 的管理页面。


第三步:创建商品服务(Product Service)

1. 新建模块 product-service,添加依赖:

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

2. 创建启动类:

// ProductServiceApplication.java
package com.example.productservice;

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

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

3. 添加控制器 ProductController:

@RestController
@RequestMapping("/products")
public class ProductController {

    @GetMapping("/{id}")
    public String getProduct(@PathVariable Long id) {
        return "Product ID: " + id + ", Name: iPhone 15";
    }
}

4. 配置 application.yml:

server:
  port: 8081

spring:
  application:
    name: product-service

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

启动后,在浏览器访问:http://localhost:8081/products/123,返回:

Product ID: 123, Name: iPhone 15

同时刷新 Eureka 页面,你能看到产品服务已经注册成功!


第四步:创建订单服务(Order Service),并调用产品服务

1. 新建 order-service 模块,添加依赖:

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

2. 启动类 OrderServiceApplication.java:

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

3. 创建远程调用接口 ProductClient:

@FeignClient(name = "product-service")
public interface ProductClient {
    @GetMapping("/products/{id}")
    String getProductById(@PathVariable("id") Long id);
}

4. 创建控制器 OrderController:

@RestController
@RequestMapping("/orders")
public class OrderController {

    @Autowired
    private ProductClient productClient;

    @GetMapping("/{orderId}/product/{productId}")
    public String getOrderDetail(
        @PathVariable Long orderId,
        @PathVariable Long productId) {

        String productInfo = productClient.getProductById(productId);
        return "Order ID: " + orderId + "\nProduct Info:\n" + productInfo;
    }
}

5. 配置 application.yml:

server:
  port: 8082

spring:
  application:
    name: order-service

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

启动后访问:

http://localhost:8082/orders/1/product/123

你应该看到类似输出:

Order ID: 1
Product Info:
Product ID: 123, Name: iPhone 15

🎉 恭喜!你已经完成了两个微服务之间的通信!


常见问题解答

❓Q1:我启动 Eureka 后看不到任何服务注册进来怎么办?

  • 确保 Eureka 正确启动;
  • 确保其他服务的 application.yml 中配置了正确的 Eureka 地址;
  • 检查是否启用了 @EnableEurekaClient 注解。

❓Q2:订单服务无法调用产品服务,提示“unknown host”?

可能原因:

  • 服务未正确注册到 Eureka;
  • FeignClient 中指定的服务名拼写错误;
  • 缺少负载均衡客户端支持(如 LoadBalancer)。

解决方案:

  • 加入依赖:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

❓Q3:FeignClient 无法注入?

确保启动类加上了 @EnableFeignClients 注解,并确认 FeignClient 接口所在的包被扫描到了。


❓Q4:启动多个服务后端口冲突怎么办?

  • 在各自的 application.yml 中设置不同的 server.port;
  • 使用 IDE 分开运行不同模块;
  • 使用命令行启动(推荐);

学习建议:下一步该学啥?

负载均衡配置-1

你现在已经掌握了一个基本的 Spring Cloud 微服务结构,并且实现了服务注册发现和远程调用。

接下来你可以继续探索以下几个方向:

主题 内容 推荐资源
API 网关 用 Spring Cloud Gateway 统一管理请求入口 官方文档 + 视频教学
配置中心 使用 Config Server 集中管理配置 GitHub 示例项目
链路追踪 用 Sleuth + Zipkin 追踪请求路径 Spring Cloud 文档
熔断限流 使用 Sentinel 或 Hystrix 防止雪崩 B站实战视频
Docker 部署 学会用容器化部署你的微服务 《Docker — 从入门到实践》电子书

结语

微服务不是魔法,它是一套解决问题的方法论。通过今天的学习,你已经迈出了第一步:理解它的运作原理,并亲手搭建了第一个微服务应用!

继续保持练习,不断尝试新功能,你会发现 Spring Cloud 的强大之处远不止这些。

如果你喜欢这篇教程,欢迎转发或收藏,也欢迎留言交流学习心得 😊。


🎯 学习不怕慢,怕不动手。一起加油吧,未来的后端高手!

评论 0

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