# (一)Feign概述 {#一-feign概述}
Feign是Netflix开发的声明式,模板化的Http客户端,Feign可以帮助我们更加便捷的调用HTTP API。SpringCLoud对Feign进行了增强,使得Feign支持SpringMVC注解,并整合Ribbon和Eureka,从而让Feign更加实用方便。
对feign的实战我们依旧用前面的用户管理员微服务,这个demo包含用户微服务,管理员微服务和Eureka注册中心,在上面一篇博客用ribbon调用用户微服务时,我们用到了下面这段代码:
User user= restTemplate.getForObject("http://userservice/user/1",User.class);
相比直接填写ip地址和端口号,ribbon使用微服务名称代替ip和端口号确实让代码更加容易维护,但是如果每个微服务都要通过url拼接还是显得不方便,Feign就帮我们解决了这个问题。
# (二)Feign的使用 {#二-feign的使用}
使用Feign主要需要以下四步骤:
1.导入依赖
2.配置调用接口
3.在启动类上激活feign
4.通过自动的接口调用远程微服务
# 2.1 导入依赖 {#_2-1-导入依赖}
在adminservice的pom.xml中导入依赖
<!--springcloud整个的openfeign--><dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
# 2.2 配置调用接口 {#_2-2-配置调用接口}
新建一个Feign包,在Feign包下新建接口,名字可以自己定义,我给它命名为UserFeignClient。这个接口主要配置两个内容,在类名前声明需要调用的微服务名称,在方法名之前声明需要调用的微服务接口:
/**
* 声明需要调用的微服务名称
*/@FeignClient(name = "userservice")public interface UserFeignClient {
/**
* 声明需要调用的微服务接口
*/
@RequestMapping(value = "/user/{id}",method = RequestMethod.GET)
public User findbyid(@PathVariable("id") int id);}
# 2.3 在启动类上激活feign {#_2-3-在启动类上激活feign}
在启动类上增加@EnableFeignClients注解:
@SpringBootApplication@EntityScan("com.sdxb.admin.entity")@EnableEurekaClient@EnableFeignClientspublic class AdminApplication {
public static void main(String[] args) {
SpringApplication.run(AdminApplication.class,args);
}}
# 2.4 通过自动的接口调用远程微服务 {#_2-4-通过自动的接口调用远程微服务}
修改adminController
@RestController@RequestMapping("/admin")public class adminController {
@Autowired
private UserFeignClient userFeignClient;
@RequestMapping(value = "/{id}",method = RequestMethod.GET)
public User getuser(@PathVariable int id){
//使用feign远程调用
User user= userFeignClient.findbyid(id);
return user;
}}
代码很简单,首先自动注入UserFeignClient ,然后调用接口返回User,这样就不用再自己去整合url地址了。
# (三)Feign的高级使用 {#三-feign的高级使用}
因为feign集合了ribbon依赖和自动配置,因此我们可以用ribbon的方式去配置feign,具体的配置方法见上一篇博客,同时也可以用feign自己的方法配
请求压缩:
Feign支持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗:
#请求压缩feign.compression.request.enabled=truefeign.compression.response.enabled=true
还可以对压缩的类型和上下限进行设置
feign.compression.request.mime-types=text/html,application/xml,application/jsonfeign.compression.request.min-request-size=2048
开启饥饿加载:
ribbon默认是懒加载,第一次获取服务会慢,因此开启饥饿加载:
ribbon.eager-load.enabled=true#为哪些客户端开启饥饿加载,多个客户端用逗号分割ribbon.eager-load.clients=
配置请求连接池:
feign的底层使用了apache的httpclient进行服务调用,因此可以配置连接信息
feign.httpclient.enabled=true#最大连接数feign.httpclient.max-connections=200#每个请求的最大连接数feign.httpclient.max-connections-per-route=50
日志输出:
feign提供对日志输出的设置,在配置文件中配置以下两条数据:
feign.client.config.userservice.logger-level=FULLlogging.level.com.sdxb.admin.Feign.UserFeignClient=debug
首先设置日志级别,使用:feign.client.config.微服务名称.logger-level=级别的方式
级别有以下四种:
NONE,不输出
BASIC,适用于生产环境问题追踪
HEADERS,在BASIC基础上增加请求和响应头信息
FULL,全部输出
接着设置需要输出哪个类的日志:logging.level.全限定类名=debug
可以看到运行后的控制台结果