在前面的学习中,我们使用了Ribbon的负载均衡功能,大大简化了远程调用时的代码:
String baseUrl = "http://user-service/user/";
User user = this.restTemplate.getForObject(baseUrl + id, User.class)
如果就学到这里,你可能以后需要编写类似的大量重复代码,格式基本相同,无非参数不一样。有没有更优雅的方式,来对这些代码再次优化呢?
(这里时通过设置访问路径来访问服务,而这些服务名,以及服务里的方法名都是写死了的,在企业中,每个服务往往是分人管理,那万一更改了又要去问?或者查文档等等,这里的依赖就很强,而且每次写方法都要调用访问路径也很麻烦(就像访问数据库,如果每次都要写访问路径岂不是累死,所以一般就配置一次在配置文件中),所以这两行代码我们也可以通过Feign实现简化)
这就是我们接下来要学的Feign的功能了。
Feign可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller一样。你不用再自己拼接url,拼接参数等等操作,一切都交给Feign去做。
(解释:原方法要通过Feign去远程调用服务方法,需要告知它四个属性:1请求方式、2方法参数、3方法路径、4返回类型,就很麻烦,而这四个属性在哪都有?骑士在服务方法里(服务中的controller层就有这些),所以Feign会自动去扫描这些信息,再帮你调用(伪装成了user里controller层的内鬼))
项目主页:https://github.com/OpenFeign/feign
org.springframework.cloud
spring-cloud-starter-openfeign
Feign就不用在配置文件配置任何属性了,因为属性都是扫描user的controller里面的属性(所以我们在配置这个接口的目的也是为了拿那几个属性)
Feign通过配置的这几个和user中Controller一样的方法可以扫描到这四个信息,但还不够因为路径中还有一个服务id(user-service)那么就还要在接口上配置@FeignClient注解,它会通过这个注解先给负载均衡得到对应的实例id,然后再去用这四个属性去调用服务
我们在启动类上,添加注解,开启Feign功能
你会发现RestTemplate的注册被我删除了。Feign中已经自动集成了Ribbon负载均衡,因此我们不需要自己定义RestTemplate了.(上面解释了,已经通过@FeignClient()负载均衡后以及四个属性去调用了user里的服务方法并返回了对应的User,这里的queryById是接口那个方法吧也就连接着远程user那个方法)
2.2.4.启动测试:
访问接口:
正常获取到了结果。
2.3.负载均衡
Feign中本身已经集成了Ribbon依赖和熔断依赖和自动配置:
因此我们可以不需要额外引入Ribbon和熔断依赖。(注意这里的熔断是Feign自己写的熔断,如果把之前的熔断依赖删去,那么我们之前写的熔断就无法使用Feign提供的熔断依赖)
在之前说Feign的属性主要是那四个属性会通过接口的形式获得,所以不用在配置文件里配置些什么,但上面所示,我们用Feign内置的熔断和负载均衡,那么就有几个属性需要配置:(不用记 以后搜)
1.开启负载均衡
2.配置获取链接超时时长(默认1000ms):如果超过这个时间没有获取到服务的连接,就抛出异常
配置读取超时时长(默认1000ms):超过这个时间没有读取数据就抛出异常
在注解上加上fallback参数,是一个类的数据类型
那么这个类就是实现熔断的类(里面返回服务失败后的友好提示)
最后这个类一定要实现Feign这个接口,用接口的这个方法去写熔断
但这时候就没办法返回String类型了
所以说还是用Spring提供的熔断比较合适,也没那么繁琐
启动Feign熔断
Spring Cloud Feign 支持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗。通过下面的参数即可开启请求与响应的压缩功能:
feign:
compression:
request:
enabled: true # 开启请求压缩
response:
enabled: true # 开启响应压缩
同时,我们也可以对请求的数据类型,以及触发压缩的大小下限进行设置:
feign:
compression:
request:
enabled: true # 开启请求压缩
mime-types: text/html,application/xml,application/json # 设置压缩的数据类型
min-request-size: 2048 # 设置触发压缩的大小下限
注:上面的数据类型、压缩大小下限均为默认值。
前面讲过,通过logging.level.xx=debug来设置日志级别。然而这个对Fegin客户端而言不会产生效果。因为@FeignClient注解修改的客户端在被代理时,都会创建一个新的Fegin.Logger实例。我们需要额外指定这个日志的级别才可以。
1)设置com.leyou包下的日志级别都为debug
logging:
level:
com.leyou: debug
2)编写配置类,定义日志级别
@Configuration
public class FeignConfig {
@Bean
Logger.Level feignLoggerLevel(){
return Logger.Level.FULL;
}
}
这里指定的Level级别是FULL,Feign支持4种级别:
? 1525674373507
NONE:不记录任何日志信息,这是默认值。
BASIC:仅记录请求的方法,URL以及响应状态码和执行时间
HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息
FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。
3)在FeignClient中指定配置类:
@FeignClient(value = "user-service", fallback = UserFeignClientFallback.class, configuration = FeignConfig.class)
public interface UserFeignClient {
@GetMapping("/user/{id}")
User queryUserById(@PathVariable("id") Long id);
}