Skip to content

综合实战:订单服务调用库存服务

9.1 实战目标

最终实现:

text
客户端请求 Gateway

Gateway 路由到 order-service

order-service 创建订单

order-service 使用 OpenFeign 调用 stock-service 扣减库存

Sentinel 对订单接口限流

stock-service 故障时 Feign fallback 降级

全链路 Header 透传

9.2 stock-service 完整 pom.xml

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
         https://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>com.demo</groupId>
        <artifactId>cloud-demo-2025</artifactId>
        <version>1.0.0</version>
    </parent>

    <artifactId>stock-service</artifactId>

    <dependencies>

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

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

    </dependencies>

</project>

9.3 order-service 完整 pom.xml

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
         https://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>com.demo</groupId>
        <artifactId>cloud-demo-2025</artifactId>
        <version>1.0.0</version>
    </parent>

    <artifactId>order-service</artifactId>

    <dependencies>

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

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

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

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

    </dependencies>

</project>

9.4 gateway-service 完整 pom.xml

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
         https://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>com.demo</groupId>
        <artifactId>cloud-demo-2025</artifactId>
        <version>1.0.0</version>
    </parent>

    <artifactId>gateway-service</artifactId>

    <dependencies>

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

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

    </dependencies>

</project>

9.5 order-service application.yml

yaml
server:
  port: 8081

spring:
  application:
    name: order-service

  profiles:
    active: dev

  config:
    import:
      - optional:nacos:${spring.application.name}-${spring.profiles.active}.yml

  cloud:
    nacos:
      server-addr: 127.0.0.1:8848

      discovery:
        namespace: public
        group: DEFAULT_GROUP

      config:
        namespace: public
        group: DEFAULT_GROUP
        file-extension: yml

    openfeign:
      sentinel:
        enabled: true
      client:
        config:
          default:
            connectTimeout: 3000
            readTimeout: 5000
            loggerLevel: BASIC

    sentinel:
      transport:
        dashboard: 127.0.0.1:8080

logging:
  level:
    com.demo.order.client: DEBUG

9.6 stock-service application.yml

yaml
server:
  port: 8082

spring:
  application:
    name: stock-service

  profiles:
    active: dev

  config:
    import:
      - optional:nacos:${spring.application.name}-${spring.profiles.active}.yml

  cloud:
    nacos:
      server-addr: 127.0.0.1:8848

      discovery:
        namespace: public
        group: DEFAULT_GROUP

      config:
        namespace: public
        group: DEFAULT_GROUP
        file-extension: yml

9.7 gateway-service application.yml

yaml
server:
  port: 9000

spring:
  application:
    name: gateway-service

  profiles:
    active: dev

  config:
    import:
      - optional:nacos:${spring.application.name}-${spring.profiles.active}.yml

  cloud:
    nacos:
      server-addr: 127.0.0.1:8848

      discovery:
        namespace: public
        group: DEFAULT_GROUP

      config:
        namespace: public
        group: DEFAULT_GROUP
        file-extension: yml

    gateway:
      server:
        webflux:
          routes:
            - id: order-route
              uri: lb://order-service
              predicates:
                - Path=/api/order/**
              filters:
                - StripPrefix=1

            - id: stock-route
              uri: lb://stock-service
              predicates:
                - Path=/api/stock/**
              filters:
                - StripPrefix=1

9.8 启动顺序

推荐启动顺序:

text
1. Nacos Server
2. Sentinel Dashboard
3. stock-service
4. order-service
5. gateway-service

9.9 测试服务注册

访问 Nacos:

text
http://localhost:8848/nacos

查看服务列表:

text
gateway-service
order-service
stock-service

9.10 测试 Gateway 路由

访问:

text
http://localhost:9000/api/stock/stock/info

期望:

text
stock-service is running

访问:

text
http://localhost:9000/api/order/order/create?productId=1001&count=2

期望:

text
创建订单成功,库存服务返回:扣减库存成功,productId=1001, count=2

9.11 测试 Sentinel 限流

先访问一次:

text
http://localhost:8081/order/create?productId=1001&count=2

打开 Sentinel:

text
http://localhost:8080

进入:

text
order-service -> 簇点链路

找到:

text
/order/create

添加流控规则:

text
QPS = 1

快速刷新接口。

期望:

text
Blocked by Sentinel (flow limiting)

或者自定义 JSON:

json
{
  "code": 429,
  "message": "请求过于频繁,请稍后再试"
}

9.12 测试 Feign 降级

停止 stock-service

访问:

text
http://localhost:8081/order/create?productId=1001&count=2

期望:

text
创建订单成功,库存服务返回:库存服务暂时不可用,扣减库存失败,已进入降级逻辑

或者你自己定义的 fallback 返回值。


9.13 测试上下文透传

访问:

text
http://localhost:9000/api/order/order/context/feign

期望 stock-service 收到:

text
X-Request-Id
X-User-Id
X-Tenant-Id

返回类似:

text
stock-service received: requestId=xxx, userId=10001, tenantId=tenant-a

Released under the MIT License.