一、OpenFeign替代RestTemplate
1、需要引入的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>4.1.1</version>
</dependency>
在引入依赖不用加版本都行,会对应springcloud有对应版本,以上是我的版本信息。
2、在启动类添加注解开启OpenFeign的功能
@EnableFeignClients()//开启OpenFeign的功能
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
@EnableDiscoveryClient//通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能
// 使用@LoadBalanced注解赋予RestTemplate负载均衡的能力
//注入配置类,这个配置是我们自定义的策略--随机策略
@LoadBalancerClients(defaultConfiguration = {CustomLoadBalancerConfiguration.class})
//@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class)//开启Feign的功能
@EnableFeignClients()//开启OpenFeign的功能
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
/**
* 创建RestTemplate对象,并注入Spring容器中
*
* @return
*/
@Bean
@LoadBalanced//负载均衡
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
3、编写OpenFeign的客户端
@FeignClient("userservice")//服务名称:userservice
public interface UserClient {
//请求方式:GET,FeignClient还支持POST,PUT,DELETE等请求方式
//原本老版本的Feign只支持GET和POST请求,不支持其他请求,但是新版本已经升级到FeignClient
@GetMapping("/user/{id}")// 请求路径:/user/{id}
User findById(@PathVariable("id") Long id);//请求参数:Long id
}
通过OpenFeign替代RestTemplate发送http请求。
4、测试发送请求
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
@Autowired
private UserClient userClient;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
//2.用Feign来远程调用
User user = userClient.findById(order.getUserId());
//3.封装user到order
order.setUser(user);
// 4.返回
return order;
}
// @Autowired
// private RestTemplate restTemplate;
// public Order queryOrderById(Long orderId) {
// // 1.查询订单
// Order order = orderMapper.findById(orderId);
// //2.利用RestTemplate发起http请求,查询用户
// //2.1 url路径
String url="http://localhost:8081/user/"+order.getUserId();
// //用服务名代替ip端口
// String url="http://userservice/user/"+order.getUserId();
// //2.2 发起http请求,实现远程调用
// User user = restTemplate.getForObject(url, User.class);
// //3.封装user到order
// order.setUser(user);
// // 4.返回
// return order;
// }
}
成功!!!
二、日志输出配置
日志级别:
NONE: 不记录任何日志,是OpenFeign默认日志级别(性能最佳,适用于生产环境)。 BASIC: 仅记录请求方法、URL、响应状态码、执行时间(适用于生产环境追踪问题)。 HEADERS: 在记录BASIC级别的基础上,记录请求和响应的header头部信息。 FULL: 记录请求响应的header、body 和 元数据(适用于开发和测试环境定位问题
1、在yml配置文件中配置
我是4.1.1版本的OpenFeign,貌似配置的位置和其他教程不一样,是配置在spring下面
spring:
cloud:
openfeign:
client:
config:
default:
loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息
测试:
2、Java代码方式
自定义一个配置类DefaultFeignConfiguration。
注意导包是:import feign.Logger;
import feign.Logger;
import org.springframework.context.annotation.Bean;
public class DefaultFeignConfiguration {
@Bean
public Logger.Level logLevel(){
return Logger.Level.BASIC;// 请求和响应的日志
}
}
1、如果要全局生效,将其放到启动类的@EnableFeignClients这个注解中:
@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class)//开启Feign的功能
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
@EnableDiscoveryClient//通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能
// 使用@LoadBalanced注解赋予RestTemplate负载均衡的能力
//注入配置类,这个配置是我们自定义的策略--随机策略
@LoadBalancerClients(defaultConfiguration = {CustomLoadBalancerConfiguration.class})
@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class)//开启Feign的功能
//@EnableFeignClients()//开启OpenFeign的功能
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
/**
* 创建RestTemplate对象,并注入Spring容器中
*
* @return
*/
@Bean
@LoadBalanced//负载均衡
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
2、如果是局部生效,则把它放到对应的@FeignClient这个注解中:
@FeignClient(value = "userservice", configuration = DefaultFeignConfiguration .class)
//@FeignClient("userservice")//服务名称:userservice
@FeignClient(value = "userservice", configuration = DefaultFeignConfiguration.class)
public interface UserClient {
//请求方式:GET,FeignClient还支持POST,PUT,DELETE等请求方式
//原本老版本的Feign只支持GET和POST请求,不支持其他请求,但是新版本已经升级到FeignClient
@GetMapping("/user/{id}")// 请求路径:/user/{id}
User findById(@PathVariable("id") Long id);//请求参数:Long id
}
三、OpenFeign使用优化
OpenFeign底层发起http请求,依赖于其它的框架。其底层客户端实现包括:
URLConnection:默认实现,不支持连接池
Apache HttpClient :支持连接池
OKHttp:支持连接池
1、对于OKHttp
(1)引入依赖
<!-- https://mvnrepository.com/artifact/io.github.openfeign/feign-okhttp -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
</dependency>
<!--负载均衡-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
(2)配置连接池
spring:
cloud:
openfeign:
client:
config:
default:
loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息
okhttp:
enabled: true
2、对于Apache HttpClient
(1)引入依赖
<!-- https://mvnrepository.com/artifact/io.github.openfeign/feign-httpclient -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
<!--负载均衡-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
(2)配置连接池
spring:
cloud:
openfeign:
client:
config:
default:
loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息
#配置连接池
httpclient:
enabled: true # 开启openfeign对HttpClient的支持
max-connections: 200 # 最大的连接数
max-connections-per-route: 50 # 每个路径的最大连接数
# okhttp:
# enabled: true # 开启openfeign对HttpClient的支持
四、最佳实践
实现基于抽取的最佳实践
1、创建名为feign-api的module
2、引入feign客户端依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
完整如下:
<?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>cn.itcast.demo</groupId>
<artifactId>cloud-demo</artifactId>
<version>1.0</version>
</parent>
<groupId>cn.itcast</groupId>
<artifactId>feign-api</artifactId>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- feign客户端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
</project>
3、抽取
将order-service中编写的UserClient、User、DefaultFeignConfiguration都复制到feign-api项目中
feign-api项目结构如下:
4、在order-service的pom文件里面引入feign-api的依赖
<!-- 引入feign的统一Api-->
<dependency>
<groupId>cn.itcast</groupId>
<artifactId>feign-api</artifactId>
<version>1.0</version>
</dependency>
5、重新导包
将原本的order-service里面抽取的那些文件删掉,重新导包
6、在启动类上指定重新扫描包
@EnableFeignClients(clients = UserClient.class,defaultConfiguration = DefaultFeignConfiguration.class)//开启Feign的功能
不加上的话会报错,扫描不到对应的包报错。