前言:OpenFeign
是一个声明式的 HTTP 客户端,它使得我们可以更加方便地调用 REST 服务。通过简单的注解配置,OpenFeign
可以让我们像调用本地方法一样调用远程的 HTTP 接口。在 Spring Cloud 生态系统中,OpenFeign
被广泛用于服务之间的通信。
主要特性
- 声明式 HTTP 客户端:通过注解定义接口,不需要编写大量的 HTTP 客户端代码。
- 与 Spring Cloud 集成:无缝集成 Ribbon、Eureka 等 Spring Cloud 组件,实现负载均衡和服务发现。
- 支持多种编码器和解码器:可以自定义请求和响应的编码解码方式。
- 支持熔断器:与 Hystrix、Sentinel 等熔断器集成,增强服务的容错能力。
- 支持日志记录:提供详细的请求和响应日志,便于调试和监控。
OpenFeign 远程调用
引入依赖
1 2 3 4 5 6 7 8 9 10
| <!--openFeign--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!--负载均衡器--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency>
|
启用OpenFeign
启动类添加@EnableFeignClients(basePackages = "com.hmall.api.client")
1 2 3 4 5 6 7 8 9 10
| @EnableFeignClients(basePackages = "com.hmall.api.client") @MapperScan("com.mall.item.mapper") @SpringBootApplication public class ItemServiceApplication {
public static void main(String[] args) { SpringApplication.run(ItemServiceApplication.class, args); }
}
|
编写OpenFeign客户端
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable;
@FeignClient(value = "pay-service", fallbackFactory = PayClientFallback.class) public interface PayClient {
@GetMapping("/pay-orders/biz/{id}") PayOrderDTO queryPayOrderByBizOrderNo(@PathVariable("id") Long id); }
|
PayClientFallback
接口调用失败时的,返回结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| import com.listen.api.client.PayClient; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.openfeign.FallbackFactory;
@Slf4j public class PayClientFallback implements FallbackFactory<PayClient> { @Override public PayClient create(Throwable cause) { return new PayClient() { @Override public PayOrderDTO queryPayOrderByBizOrderNo(Long id) { return null; } }; } }
|
使用FeignClient
引入
1 2
| @Autowired PayClient payClient;
|
使用
1
| PayOrderDTO payOrder = payClient.queryPayOrderByBizOrderNo(orderId);
|
连接池
引入依赖
1 2 3 4 5
| <!--OK http 的依赖 --> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-okhttp</artifactId> </dependency>
|
使用 yml添加如下配置
1 2 3
| feign: okhttp: enabled: true
|
日志配置
编写config配置类
1 2 3 4 5 6 7 8 9
| import feign.Logger; import org.springframework.context.annotation.Bean;
public class DefaultFeignConfig { @Bean public Logger.Level feignLogLevel() { return Logger.Level.FULL; } }
|
启动类添加defaultConfiguration = DefaultFeignConfig.class
1 2 3 4 5 6 7 8 9
| @EnableFeignClients(basePackages = "com.listen.api.client",defaultConfiguration = DefaultFeignConfig.class) @SpringBootApplication public class UserServiceApplication {
public static void main(String[] args) { SpringApplication.run(UserServiceApplication.class, args); }
}
|