Spring Cloud Alibaba实战03|OpenFeign远程调用+LoadBalancer负载均衡

导语

整套SCA实战源码已开源到Gitee,直接克隆下载就能本地运行全部案例,不用额外改配置:

源码仓库地址:https://gitee.com/xiaoyuancode/sca-study-demo

本章对应 module-feign-demo 模块,基于第一篇Nacos注册中心案例,手把手教大家实现微服务之间远程接口调用。本地完整实测,少量代码就能搞定服务调用和负载均衡,不管日常开发还是面试刷题都能用得上。

技术版本

  • JDK 17
  • Spring Boot 3.5.0
  • Spring Cloud Alibaba 2025.0.0.0
  • Nacos 3.0.3

高频面试对比:OpenFeign vs RestTemplate

面试经常被问微服务远程调用该怎么选,这里整理好核心区别,直接背就行:

对比维度 RestTemplate OpenFeign
编码方式 手动拼接URL、参数,代码冗余 只用接口注解声明,写法和本地调用一模一样,代码极简
负载均衡 需要手动整合负载均衡组件 原生适配LoadBalancer,引入依赖自动生效
日志调试 需要自定义拦截器实现 一行配置开启完整调用日志,排错方便
工程适配 仅适合本地临时简单测试 企业微服务项目标准选型

面试小结:线上正式微服务项目统一用OpenFeign做远程调用,RestTemplate基本只用于本地临时测试。

模块核心功能

本模块上手就能跑,功能简单纯粹,没有多余内容:

  1. 当前服务自动注册到Nacos注册中心;

  2. 通过OpenFeign基于服务名远程调用 nacos-service-demo 服务接口;

  3. 结合LoadBalancer自带负载均衡,不用手动写死IP、端口。

当前服务端口:8082

运行前置条件:本地启动Nacos,提前跑通第一篇 module-nacos-demo(8081端口)。

一、完整 pom.xml 依赖

重点注意:新版本SCA必须手动加LoadBalancer依赖,少了直接启动报错。

<?xml version="1.0" encoding="UTF-8"?>
<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>
    <parent>
        <groupId>com.xiaoyuancode</groupId>
        <artifactId>sca-study-demo</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>module-feign-demo</artifactId>
    <name>module-feign-demo</name>
    <description>OpenFeign服务远程调用</description>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <!-- Web基础依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- 配置注解提示 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

        <!-- 新版必须手动引入负载均衡依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>

        <!-- Nacos服务注册 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!-- OpenFeign核心依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>
</project>

二、application.yml 核心配置

配置极简,只保留注册中心地址和Feign调试日志,够用不冗余。

server:
  port: 8082

spring:
  application:
    name: feign-service-demo
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

# 开启Feign请求日志,排错调试必备
logging:
  level:
    com.xiaoyuancode.sca.feign: debug

三、核心Java源码

1. 启动类 FeignApplication.java

两个核心注解缺一不可,分别负责服务注册和开启Feign调用。

package com.xiaoyuancode.sca.feign;

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

@SpringBootApplication
@EnableDiscoveryClient //注册到Nacos
@EnableFeignClients //开启Feign调用
public class FeignApplication {
    public static void main(String[] args) {
        SpringApplication.run(FeignApplication.class, args);
    }
}

2. Feign远程调用接口 NacosServiceFeignClient.java

核心关键点:@FeignClient 的name 要和被调用服务的应用名完全一致,接口路径、请求方式必须完全对齐。

package com.xiaoyuancode.sca.feign.feign;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient(name="nacos-service-demo")
public interface NacosServiceFeignClient {
    @GetMapping("/sca/nacos/register")
    String callNacosRegister();
}

3. 测试接口 Controller

package com.xiaoyuancode.sca.feign.controller;

import com.xiaoyuancode.sca.feign.feign.NacosServiceFeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/sca/feign")
public class FeignTestController {

    private final NacosServiceFeignClient feignClient;

    public FeignTestController(NacosServiceFeignClient feignClient) {
        this.feignClient = feignClient;
    }

    @GetMapping("/test")
    public String testFeign(){
        return "Feign 调用成功 ===>" + feignClient.callNacosRegister();
    }
}

四、本地启动步骤

  1. 启动本地Nacos,确保控制台正常访问;

  2. 先启动第一篇的 module-nacos-demo 服务,保证服务注册进Nacos;

  3. 运行当前模块启动类,服务启动端口8082;

  4. 执行curl命令测试远程调用效果。

五、接口测试命令

Windows10/Win11自带curl可直接复制命令;Win7 / 旧版Windows可直接浏览器访问对应地址查看结果。

curl http://localhost:8082/sca/feign/test

03_api_result

六、实操踩坑总结

  1. 启动报错缺失负载均衡:Spring Cloud 2025.0.0彻底取消了内置负载均衡依赖,不手动引入 spring-cloud-starter-loadbalancer,启动直接抛Feign负载均衡异常,这是新手最容易踩的坑。

  2. Feign调用404 :大概率两个问题,一是Feign接口路径、请求方式和目标服务不匹配,二是 @FeignClient 配置的服务名和Nacos注册的服务名不一致。

  3. 控制台看不到Feign请求日志 :yml中的日志包路径必须和自己的Feign代码包路径完全对应,级别设置为debug才能打印完整调用日志,方便排查接口问题。

小结

整篇都是落地实操,没有空洞理论,只用少量代码实现微服务核心的远程调用+负载均衡能力。OpenFeign注解化的写法大幅简化微服务调用代码,也是企业开发的标准写法,文中代码可以直接搬到自己项目中使用。

下一章预告:Spring Cloud Alibaba实战04|API网关Gateway:路由转发、统一跨域、请求拦截

posted @ 2026-06-26 15:48  XiaoYuanCode  阅读(0)  评论(0)    收藏  举报