什么是fegin
fegin是一个声明式的模板化的http客户端,在SpringCloud中使用fegin,可以做到使用http请求访问远程服务,就像调用本地方法一样,开发者完全感知不到这是在调用本地方法,更感知不到在访问http请求。
- 支持可插拔的HTTP编码器和解码器
- 支持Ribbon的负载均衡
- 支持HTTP请求和响应的压缩
Fegin入门案例
导入maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Cloud OpenFeign的Starter的依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
启动类上添加 @EnableFeginClients 代表启动时将会扫描所有包下的@FeginClient注解的类 将其加载到IOC容器中
@SpringBootApplication
@EnableFeignClients
public class SpringCloudFeignApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudFeignApplication.class, args);
}
}
编辑FeginClient
@FeignClient(name="access-git",url ="https://api.github.com",configuration = WorldFeginServiceConfig.class)
public interface WorldFeginService {
@RequestMapping(value = "/search/repositories",method = RequestMethod.GET)
String queryRepo(@RequestParam("q") String queryStr);
}
url代表这个路径 拼接下面的具体路径可以从git上查找项目 可通过浏览器直接看
FeginClientConfig FULL 会将所有信息都打印出来可以看到 响应内容还是非常大的
@Configuration
public class WorldFeginServiceConfig {
/**
* Logger.Level 的具体级别如下:
* NONE:不记录任何信息
* BASIC:仅记录请求方法、URL以及响应状态码和执行时间
* HEADERS:除了记录 BASIC级别的信息外,还会记录请求和响应的头信息
* FULL:记录所有请求与响应的明细,包括头信息、请求体、元数据
* @return
*/
@Bean
Logger.Level feignLoggerLevel(){
return Logger.Level.FULL;
}
}
写个Controller层去调用刚才的Fegin 就如同调用一个方法一样
@RestController
public class WorldFeginController {
@Autowired
private WorldFeginService worldFeginService;
@RequestMapping(value = "/query/git",method = RequestMethod.GET)
public String queryRepo(@RequestParam("queryStr") String queryStr){
return worldFeginService.queryRepo(queryStr);
}
}
上面已经写了一个简单Fegin调用了。我们来看看其他的概念
Fegin调用的基本原理
当程序启动时,注意到启动类上有@EnableFeginClients,扫描包 发现@FeginClients的类后,将这些类会加载到IOC中,在调调用时,通过JDK方式动态生成requestTemplate,每个requestTemplate中携带了请求参数,请求名等信息都是在生成这个requestTemplate中确定的
然后由requestTemplate生成request交给client去,client可以是jdk原生的URLCollection ,Apache的HttpClient ,最后这个Clien封装到LoadBanlanceClient类,结合Ribbon负载均衡发起服务之间的调用。
@FeginClient注解
- name 指定feginClent的名称,项目启用Ribbon下,会作为微服务的名称用于服务发现
- url 一般用于调式,可以手动指定url地址
- configuration: FeginClient的配置类 可以Encoder Decoder LogLevel、Contract
- fallback: 容错类,当调用失败时会走到这个类 容错逻辑 , 这个类必须继承@FeginClients标记的接口
- fallbackFactory: 工厂类,用于生产fallback的示例类,通过这个属性可以进行容错通用的逻辑 减少重复代码
- path 定义当前feginClient统一前缀
fallback和fallbackFactory如果需要查看回退原因用fallbackFactory
配置Gzip压缩
添加配置文件
feign:
compression:
request:
enabled: true
mime-types: text/xml,application/xml,application/json # 配置压缩支持的MIME TYPE
min-request-size: 2048 # 配置压缩数据大小的下限
response:
enabled: true # 配置响应GZIP压缩
将 @FeginClients 类中的返回值改为 ResponseEntity 否则会导致服务之间的Fegin调用乱码
如下图 压缩后的响应