Java案例如何实现Spring Cloud?

wen python案例 4

本文目录导读:

Java案例如何实现Spring Cloud?

  1. 方案一:经典 Netflix 版 (Eureka + OpenFeign + Gateway)
  2. 方案二:Spring Cloud Alibaba 版 (Nacos + OpenFeign + Gateway)
  3. 关键组件说明
  4. 注意事项

这是一个非常实用的技术问题,Spring Cloud 是一个用于构建分布式系统(微服务)的工具集,它基于 Spring Boot。

要在一个 Java 案例中实现 Spring Cloud,通常需要搭建一套包含服务注册与发现配置中心远程调用网关等核心组件的环境。

下面是一个从零开始、最简化的案例实现步骤,使用目前企业中最主流的组件组合(Spring Cloud Alibaba 或 Netflix 的 Spring Cloud 标准版)。

经典 Netflix 版 (Eureka + OpenFeign + Gateway)

这个案例假设你使用 Spring Boot 2.x 和 Spring Cloud Hoxton.SR12 版本。

创建父 Maven 工程 (SpringCloudDemo)

  • pom.xml 关键配置:声明依赖管理和版本。
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.12.RELEASE</version>
    <relativePath/>
</parent>
<properties>
    <spring-cloud.version>Hoxton.SR12</spring-cloud.version>
</properties>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

创建服务注册中心 (Eureka Server)

  • 模块名: eureka-server
  • pom.xml 关键依赖:
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
  • application.yml:
    server:
    port: 8761
    spring:
    application:
      name: eureka-server
    eureka:
    client:
      register-with-eureka: false  # 自己是注册中心,不注册自己
      fetch-registry: false         # 不拉取服务列表
  • 启动类 (Application.java):
    @SpringBootApplication
    @EnableEurekaServer   // 开启注册中心服务
    public class EurekaServerApplication {
      public static void main(String[] args) {
          SpringApplication.run(EurekaServerApplication.class, args);
      }
    }
  • 验证: 启动后访问 http://localhost:8761

创建一个生产者服务 (Provider)

  • 模块名: user-service
  • pom.xml 关键依赖:
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
  • application.yml:
    server:
    port: 8081
    spring:
    application:
      name: user-service   # 服务名称,注册中心根据这个名字识别
    eureka:
    client:
      service-url:
        defaultZone: http://localhost:8761/eureka/   # 注册到哪个Eureka
  • 控制器 (UserController.java):
    @RestController
    @RequestMapping("/user")
    public class UserController {
      @GetMapping("/info/{id}")
      public String getUser(@PathVariable Long id) {
          return "User info: ID = " + id + ", from port: " + 8081;
      }
    }
  • 启动类: 添加 @EnableEurekaClient@EnableDiscoveryClient

创建消费者服务 + 远程调用 + 网关 (Consumer & Gateway)

  • 模块名: order-service

  • pom.xml 关键依赖:

    <!-- 服务发现 -->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <!-- 远程调用: OpenFeign -->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    <!-- 网关: Spring Cloud Gateway (替代Zuul) -->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
  • application.yml:

    server:
    port: 8082
    spring:
    application:
      name: order-service
    cloud:
      gateway:
        routes:
          - id: user_route
            uri: lb://user-service    # 负载均衡到user-service
            predicates:
              - Path=/user/**
    eureka:
    client:
      service-url:
        defaultZone: http://localhost:8761/eureka/
  • 创建 Feign 客户端 (UserClient.java):

    @FeignClient(name = "user-service")   // 调用user-service服务
    public interface UserClient {
      @GetMapping("/user/info/{id}")
      String getUser(@PathVariable("id") Long id);
    }
  • 控制器 (OrderController.java):

    @RestController
    @RequestMapping("/order")
    public class OrderController {
      @Autowired
      private UserClient userClient;
      @GetMapping("/create/{userId}")
      public String createOrder(@PathVariable Long userId) {
          // 内部通过Feign调用user-service
          String userInfo = userClient.getUser(userId);
          return "Order created, user detail: " + userInfo;
      }
    }
  • 启动类: 添加 @EnableFeignClients@EnableDiscoveryClient

测试整个链路

  1. 启动 EurekaServer (端口8761)。
  2. 启动 UserService (端口8081)。
  3. 启动 OrderService (端口8082,它会充当网关)。
  4. 访问网关地址: http://localhost:8082/user/info/1 (网关路由到 user-service)。
  5. 访问: http://localhost:8082/order/create/1 (order-service通过Feign调用user-service)。

Spring Cloud Alibaba 版 (Nacos + OpenFeign + Gateway)

如果你的项目是在国内或追求更流行的方案,Nacos 是首选(同时做注册中心和配置中心)。

修改依赖 (替换第一步的父pom)

<properties>
    <spring-cloud-alibaba.version>2.2.7.RELEASE</spring-cloud-alibaba.version>
    <spring-cloud.version>Hoxton.SR12</spring-cloud.version>
</properties>
<dependencyManagement>
    <dependencies>
        <!-- Spring Cloud 依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!-- Spring Cloud Alibaba 依赖 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${spring-cloud-alibaba.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

修改配置 (以 user-service 为例)

  • pom.xml 依赖替换:

    <!-- 将 eureka-client 替换为 Nacos discovery -->
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
  • application.yml 配置修改:

    spring:
    application:
      name: user-service
    cloud:
      nacos:
        discovery:
          server-addr: 127.0.0.1:8848  # Nacos 服务地址 (默认启动在8848)
    server:
    port: 8081
  • 启动 Nacos Server: 下载 Nacos,解压后运行 startup.cmd -m standalone (Windows) 或 sh startup.sh -m standalone (Linux/Mac)。

  • 其余步骤: 网关、Feign、Controller 等代码与方案一完全一致,无需改动。 启动后,在 Nacos 控制台 (http://localhost:8848/nacos) 即可看到服务列表。


关键组件说明

组件 作用 旧版本/替代方案
Eureka / Nacos 服务注册与发现 Eureka (已经停更维护) / Nacos (推荐) / Consul
OpenFeign 声明式远程HTTP调用 RestTemplate + LoadBalancer
Spring Cloud Gateway API网关:路由、鉴权、限流 Zuul 1.x (已淘汰,非阻塞IO差)
Spring Cloud Config / Nacos 配置中心 (本案例未涉及) Apollo (携程) / Nacos Config

注意事项

  1. 版本兼容性:Spring Cloud 版本必须严格对应 Spring Boot 版本,官方文档有版本对应表(如:Hoxton.SR12 对应 2.3.x,2021.0.x 对应 2.6.x 或 2.7.x)。
  2. 启动顺序:先启动注册中心(Eureka/Nacos),再启动其他微服务。
  3. 依赖冲突:若同时引入 spring-cloud-starter-netflix-eureka-client 和 Ribbon(默认已内置),要注意负载均衡策略。
  4. Gateway 与 Feign 的区别:Gateway 是入口网关(路由、过滤外部请求),Feign 是服务间内部调用(内部HTTP RPC)。

通过上述步骤,你就完成了一个最基础的 Spring Cloud 微服务案例,实际工作中还会加入 Sentinel (熔断限流)、Sleuth (链路追踪) 等组件,但核心架构逻辑一致。

抱歉,评论功能暂时关闭!