1、添加依赖
首先,在项目中的pom.xml中添加feign和springCloud相关依赖:<dependencies>
<!-- Spring Cloud OpenFeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- Spring Boot Web (可选,如果项目需要 HTTP 支持) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Cloud LoadBalancer (可选,如果使用负载均衡) -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
</dependencies>
2、启用Feign客户端
在springBoot启动类上添加@EnableFeignClients注解,启用Feign客户端功能:import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableFeignClients // 启用 Feign 客户端
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
3、定义feign客户端接口
通过定义一个接口,使用feign的注解来声明远程调用的方法import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient(name = "user-service") // 指定服务名称
public interface UserServiceClient {
@GetMapping("/users/{id}") // 定义 HTTP 请求
User getUserById(@PathVariable("id") Long id); // 方法签名
}
说明:
- @FeignClient(name = "user-service"):指定要调用的服务名称(在注册中心注册的服务名)。
- @GetMapping:定义 HTTP 请求方法和路径。
- @PathVariable:绑定路径参数。
4、配置Feign
在application.xml或application.properties中配置Feign的相关属性(feign有默认的配置) 默认配置:- 超时时间:默认连接超时和读取超时时间较长(通常为几秒)
- 日志级别:默认不记录日志(Logger.Level.NONE)
- 负载均衡:默认集成Ribbon或Spring Cloud LoadBalancer,支持负载均衡
- 编码/解码:默认使用Spring的HttpMessageConverter进行请求和响应的序列化与反序列化
feign:
client:
config:
default: # 全局配置
connectTimeout: 5000 # 连接超时时间
readTimeout: 5000 # 读取超时时间
loggerLevel: basic # 日志级别(NONE, BASIC, HEADERS, FULL)
也可以通过配置类配置feign的日志输出
import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FeignConfig {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL; // 设置日志级别为 FULL
}
}
配置日志输出(在application.xml或application.properties中配置)
application.xml:
logging:
level:
com.example.demo.client.UserClient: DEBUG # 将 Feign 客户端接口的日志级别设置为 DEBUG
application.properties:
logging.level.com.example.demo.client.UserClient=DEBUG
5、降级逻辑:
1、如果需要使用 Hystrix 实现降级逻辑(Spring Cloud 2020 之前版本),还需要添加 Hystrix 依赖:<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
注意:Spring Cloud 2020 及之后版本默认移除了 Hystrix 支持,推荐使用
Resilience4j
或
Sentinel
作为替代方案
2、
在 Spring Boot 启动类上添加 @EnableFeignClients
和 @EnableHystrix
注解
3、定义Feign客户端接口
在Feign客户端接口上 使用@FeignClient注解,并指定fallback或fallbackFActory属性
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
@FeignClient(name = "user-service", fallback = UserServiceFallback.class)
public interface UserServiceClient {
@GetMapping("/users/{id}")
String getUserById(Long id);
}
4、使用fallbackFactory,获取异常信息,
然后在 @FeignClient
中指定 fallbackFactory
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
@Component
public class UserServiceFallbackFactory implements FallbackFactory<UserServiceClient> {
@Override
public UserServiceClient create(Throwable cause) {
return new UserServiceClient() {
@Override
public String getUserById(Long id) {
return "Fallback: User not available due to " + cause.getMessage(); // 降级逻辑
}
};
}
}
补充知识:
Ribbon
Feign默认集成了Ribbon,Ribbon自动生效。 Ribbon是Netflix开源的一个客户端负载均衡器,主要用于在分布式系统中实现服务调用的负载均衡 是Spring Cloud生态中的重要组件之一,通常与Eureka(服务注册与发现)和feign(声明式HTTP客户端)配合使用 负载均衡策略: RoundRobinRule—轮询策略 RandomRule—随机策略 WeightedResponseTimeRule—权重策略 RetryRule—重试策略 BestAvailableRule—选择并发请求数量最小的实例Spring Cloud LoadBalancer
是spring Cloud官方提供的负载均衡器,支持响应式编程,能够和spring Cloud Gateway和Spring WebFlux更好的集成 添加依赖 org.springframework.cloud spring-cloud-starter-loadbalancer配置spring cloud loadBanlancer
spring: cloud: loadbalancer: retry: enabled: true # 启用重试机制