1. 引言
Fegin组件的用处,是为了替换掉之前使用RestTemplate
方式对nacos服务进行调用的方式。
通过Fegin,我们定义一些接口和接口内的方法,在方法中提前指定好访问的路径、请求方式、请求参数等信息,在需要调用服务的时候,就直接调用接口即可。
2. Feign入门
feign入门使用方式有如下步骤:
- 引入依赖
- 编写配置,修改日志级别
- 启动类上添加注解 @EnableFeignClients
- 编写Feign客户端接口
2.1. 引入依赖
我们在order-service服务的pom文件中引入feign的依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.2. 编写配置文件
我们一般会修改feign的日志配置。其中又分为 单独 给某个服务设置,或给 所有 服务设置
日志级别:尽量使用BASIC
- 给所有服务配置fegin日志
feign:
client:
config:
default: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
loggerLevel: BASIC # 日志级别
- 给指定的服务配置fegin日志(此处以服务名为userservice为例)
feign:
client:
config:
userservice: # 针对某个微服务的配置
loggerLevel: FULL # 日志级别
2.3. 启动类上添加注解
在启动类上添加@EnableFeignClients
注解,启动Feign
2.4. 编写Feign的客户端
创建client包,在包内创建接口,编写抽象方法,指定请求方式、请求路径、请求参数
(可以直接copy调用的controller代码)
- 下面是一个 根据用户id查询用户信息接口 的例子
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient("userservice")// 指定服务名
public interface UserClient {
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}
3. 优化 - 使用HTTP连接池
由于Fegin的底层是发起Http请求,而重复建立请求会消耗大量时间,所以我们通过使用Http连接池
的方式来优化Fegin
3.1. 引入HttpClient依赖
<!--httpClient的依赖 -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
3.2. 配置连接池
feign:
client:
config:
default: # default全局的配置
loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息
httpclient:
enabled: true # 开启feign对HttpClient的支持
max-connections: 200 # 最大的连接数
max-connections-per-route: 50 # 每个路径的最大连接数
4. 优化 - client抽取
4.1. 引言
由于feign接口可能在多个模块中都要使用,为了避免代码重复,我们可以将所有feign的接口都抽取到一个项目中,其他项目再引用这项目。
同时,由于是各个模块都要引用,也可以将pojo抽取到feign模块中。
4.2. 实现步骤
4.2.1. feign模块 - 引入依赖
创建feign模块后,需要引入feign的起步依赖
<!--feign起步依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
4.2.2. 其他模块 - 添加对feign模块的引用
其他模块应该在pom文件中增加对feign模块的引用。
(下面是一个例子,实际应该配置具体的feign模块信息)
<!--其他模块引入feign模块-->
<dependency>
<groupId>link.xiaomo.demo</groupId>
<artifactId>feign-api</artifactId>
<version>1.0</version>
</dependency>
4.2.3. 其他模块 - 添加包扫描
其次,其他模块应该手动设置对feignClient的包扫描,才能使用feign接口
- 方式一:
指定Feign应该扫描的包:(加载包内所有接口)
@EnableFeignClients(basePackages = "link.xiaomo.feign.clients")
- 方式二:
具体指定需要加载的Client接口:(加载具体的接口)
@EnableFeignClients(clients = {UserClient.class, OrderClient.class})
Comments NOTHING