Feign
Feign是Netfix开发的一个轻量级REstFul的HTTP服务客户端,是以java接口注解的方式调用HTTP请求,而不用像java中通过封装HTTP请求报文的方式直接调用,可以帮助我们更加便捷,优雅的调用HTTP API Feign = RestTemplate + Ribbon + Hystrix
本质:封装了HTTP调用流程,更符号面向接口化变成习惯,类似于Dubbo的服务调用
Feign的应用
1.在page微服务项目中导入feign的依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
2.在page启动类添加注解,并注释掉Hystrix,Raiibon,把page中对应的内容也注释掉
@EnableFeignClients//开始Feign支持
3.在page微服务项目下创建配置类ProductFeign
import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @FeignClient(name = "leq-service-product") public interface ProductFeign { @RequestMapping("/product/findById/{id}") Products queryProductById(@PathVariable Integer id); @RequestMapping("/server/getPort") String findServerPort(); }
4.在page的控制层类调用 ProductFeign
@Autowired private ProductFeign productFeign;
分别调用各个接口所需的方法
5.配置appllicaiton核心文件(负载均衡)
#通过远程服务的名称作为前缀的限定,表示针对该服务配置Ribbon的负载均衡 #请求连接的超时时间 leq-service-product.ribbon.ConnectTimeout=2000 #请求处理超时时间 leq-service-product.ribbon.ReadTimeout=10000 #对所有的操作都进行重试 leq-service-product.ribbon.OkToRetryOnAllOperations=true #对当前选中实例重试次数,不包括第一次调用 leq-service-product.ribbon.MaxAutoRetries=0 #切换实例的重试次数 leq-service-product.ribbon.MaxAutoRetriesNextServer=0 #负载策略调整 leq-service-product.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
6.重启page微服务项目,访问以前的接口,可以发现并没有报错,因为feign虽然集合了熔断,但是默认是关闭的,需要我们手动开启
,suor
7.配置appllicaiton核心文件(熔断)
#开启Feign中集成的Hystrix的熔断器功能 feign.hystrix.enabled=true
重启后看到熔断生效了,在超过默认1s的时长后就报这个错误了
8.异常调用类ProductFeignImpl
import org.springframework.stereotype.Component; @Component public class ProductFeignImpl implements ProductFeign { // 如果远程服务无法返回值数据,则将重写的方法返回 @Override public Products queryProductById(Integer id) { return null; } @Override public String findServerPort() { return "-1"; } }
需要在前面的注解加上一个属性
fallback表示如果远程的调用出现错误,则本地的回退方法在哪一个类中,手动指定
fallback = ProductFeignImpl.class
9.重启page微服务项目,可以看到我们配置的异常处理类生效了
我们也可以进行别的配置:
Feign对请求压缩和响应压缩的支持:
# 默认不开启 feign.compression.request.enabled=true # 设置压缩的数据类型,设置为默认值 feign.compression.request.min-request-size=2048 #设置触发压缩的大小下限,2048为默认值 feign.compression.request.mime-types=text/html,application/xml,application/json #默认不开启 feign.compression.response.enabled=true
配置熔断策略;
# 配置熔断策略 # 并发执行的最大线程数,默认10 hystrix.threadpool.default.coreSize= 10 #BlockingQueue的最大队列数,默认值-1 hystrix.threadpool.default.maxQueueSize=1500 # 即使maxQueueSize没有达到,达到queueSizeRejectionThreshold该值后,请求也会被拒绝,默认值5 hystrix.threadpool.default.queueSizeRejectionThreshold=1000 # 强制打开熔断器,如果该属性设置为true,强制断路器进?打开状态,将会拒绝所有的请求,默认false关闭的 hystrix.command.default.circuitBreaker.forceOpen= false # 触发熔断错误比例阈值,默认值50% hystrix.command.default.circuitBreaker.errorThresholdPercentage= 50 # 熔断后休眠时长,默认值5秒 hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds= 3000 # 熔断触发最小请求次数,默认值是20 hystrix.command.default.circuitBreaker.requestVolumeThreshold= 2 # 熔断超时设置,默认为1秒 hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds= 2000
在配置后重启该项目,只要我们之前写的接口正常访问就表明我们的配置没有问题