Day4:SpringCloud入门学习之使用Feign进行远程调用——传智播客学习笔记【微服务电商】

0.学习目标

1.学会配置Hystrix熔断
2.学会使用Feign进行远程调用
3.能独立搭建Zuul网关
4.能编写Zuul的拦截器

2.Feign

在前面的学习中,我们使用了Ribbon的负载均衡功能,大大简化了远程调用时的代码:

String baseUrl = "http://user-service/user/";
User user = this.restTemplate.getForObject(baseUrl + id, User.class)

如果就学到这里,你可能以后需要编写类似的大量重复代码,格式基本相同,无非参数不一样。有没有更优雅的方式,来对这些代码再次优化呢?
(这里时通过设置访问路径来访问服务,而这些服务名,以及服务里的方法名都是写死了的,在企业中,每个服务往往是分人管理,那万一更改了又要去问?或者查文档等等,这里的依赖就很强,而且每次写方法都要调用访问路径也很麻烦(就像访问数据库,如果每次都要写访问路径岂不是累死,所以一般就配置一次在配置文件中),所以这两行代码我们也可以通过Feign实现简化)

这就是我们接下来要学的Feign的功能了。

2.1.简介
有道词典的英文解释:
Day4:SpringCloud入门学习之使用Feign进行远程调用——传智播客学习笔记【微服务电商】_第1张图片
为什么叫伪装?

Feign可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller一样。你不用再自己拼接url,拼接参数等等操作,一切都交给Feign去做。
(解释:原方法要通过Feign去远程调用服务方法,需要告知它四个属性:1请求方式、2方法参数、3方法路径、4返回类型,就很麻烦,而这四个属性在哪都有?骑士在服务方法里(服务中的controller层就有这些),所以Feign会自动去扫描这些信息,再帮你调用(伪装成了user里controller层的内鬼))
Day4:SpringCloud入门学习之使用Feign进行远程调用——传智播客学习笔记【微服务电商】_第2张图片
项目主页:https://github.com/OpenFeign/feign

2.2.快速入门

2.2.1.导入依赖(再consumer中加)

Day4:SpringCloud入门学习之使用Feign进行远程调用——传智播客学习笔记【微服务电商】_第3张图片

org.springframework.cloud
spring-cloud-starter-openfeign

2.2.2 配置类中加入注解

Day4:SpringCloud入门学习之使用Feign进行远程调用——传智播客学习笔记【微服务电商】_第4张图片

2.2.3 编写Feign接口

Feign就不用在配置文件配置任何属性了,因为属性都是扫描user的controller里面的属性(所以我们在配置这个接口的目的也是为了拿那几个属性)
Day4:SpringCloud入门学习之使用Feign进行远程调用——传智播客学习笔记【微服务电商】_第5张图片Feign通过配置的这几个和user中Controller一样的方法可以扫描到这四个信息,但还不够因为路径中还有一个服务id(user-service)那么就还要在接口上配置@FeignClient注解,它会通过这个注解先给负载均衡得到对应的实例id,然后再去用这四个属性去调用服务

2.2.3.开启Feign功能

我们在启动类上,添加注解,开启Feign功能
Day4:SpringCloud入门学习之使用Feign进行远程调用——传智播客学习笔记【微服务电商】_第6张图片
你会发现RestTemplate的注册被我删除了。Feign中已经自动集成了Ribbon负载均衡,因此我们不需要自己定义RestTemplate了.(上面解释了,已经通过@FeignClient()负载均衡后以及四个属性去调用了user里的服务方法并返回了对应的User,这里的queryById是接口那个方法吧也就连接着远程user那个方法)

2.2.4.启动测试:
访问接口:

Day4:SpringCloud入门学习之使用Feign进行远程调用——传智播客学习笔记【微服务电商】_第7张图片

正常获取到了结果。

2.3.负载均衡
Feign中本身已经集成了Ribbon依赖和熔断依赖和自动配置:

Day4:SpringCloud入门学习之使用Feign进行远程调用——传智播客学习笔记【微服务电商】_第8张图片

因此我们可以不需要额外引入Ribbon和熔断依赖。(注意这里的熔断是Feign自己写的熔断,如果把之前的熔断依赖删去,那么我们之前写的熔断就无法使用Feign提供的熔断依赖)
Day4:SpringCloud入门学习之使用Feign进行远程调用——传智播客学习笔记【微服务电商】_第9张图片

注意事项

在之前说Feign的属性主要是那四个属性会通过接口的形式获得,所以不用在配置文件里配置些什么,但上面所示,我们用Feign内置的熔断和负载均衡,那么就有几个属性需要配置:(不用记 以后搜)
1.开启负载均衡
2.配置获取链接超时时长(默认1000ms):如果超过这个时间没有获取到服务的连接,就抛出异常
配置读取超时时长(默认1000ms):超过这个时间没有读取数据就抛出异常

Day4:SpringCloud入门学习之使用Feign进行远程调用——传智播客学习笔记【微服务电商】_第10张图片

2.2.4 Feign的熔断机制

Day4:SpringCloud入门学习之使用Feign进行远程调用——传智播客学习笔记【微服务电商】_第11张图片在注解上加上fallback参数,是一个类的数据类型
那么这个类就是实现熔断的类(里面返回服务失败后的友好提示)
最后这个类一定要实现Feign这个接口,用接口的这个方法去写熔断
但这时候就没办法返回String类型了
所以说还是用Spring提供的熔断比较合适,也没那么繁琐
Day4:SpringCloud入门学习之使用Feign进行远程调用——传智播客学习笔记【微服务电商】_第12张图片
启动Feign熔断
Day4:SpringCloud入门学习之使用Feign进行远程调用——传智播客学习笔记【微服务电商】_第13张图片

2.2.4 请求压缩(了解)

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 # 设置触发压缩的大小下限

注:上面的数据类型、压缩大小下限均为默认值。

2.2.5 日志级别(了解)

前面讲过,通过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);
}

4)重启项目,即可看到每次访问的日志:
Day4:SpringCloud入门学习之使用Feign进行远程调用——传智播客学习笔记【微服务电商】_第14张图片

你可能感兴趣的:(Spring,Cloud,Feign,Spring)