SpringCloud(七)远程调用组件之Feign
在之前的案例中,服务消费者调用服务提供者的时候使用RestTemplate技术。
@GetMapping("/getProduct/{id}")
public Products getProduct(@PathVariable Integer id){
//拼写URL地址
String url = "http://szx-service-product/product/selectProductById/" + id;
System.out.println("******************************************************************************");
System.out.println("url = " + url);
System.out.println("******************************************************************************");
//发送http请求给商品微服务,将id传递过去,获取id所对应的Product对象
Products products = restTemplate.getForObject(url, Products.class);
return products;
}
Feign简介
Feign是Netflix开发的一个轻量级RESTful的HTTP服务客户端(用它来发起请求,远程调用的),是以Java接口注解的方式调用Http请求,而不用像Java中通过封装HTTP请求报文的方式直接调用,Feign被广泛应用在Spring Cloud 的解决方案中。
类似于Dubbo,服务消费者拿到服务提供者的接口,然后像调用本地接口方法一样去调用,实际发出的是远程的请求。
- Feign可帮助我们更加便捷,优雅的调用HTTP API:不需要我们去拼接url然后呢调用restTemplate的api,在SpringCloud中,使用Feign非常简单,创建一个接口(在消费者–服务调用方这一端),并在接口上添加一些注解,代码就完成了
- SpringCloud对Feign进行了增强,使Feign支持了SpringMVC注解(OpenFeign)
本质:封装了Http调用流程,更符合面向接口化的编程习惯,类似于Dubbo的服务调用
Feign配置应用
在服务调用者工程(消费)创建接口(添加注解)
(效果)Feign = RestTemplate+Ribbon+Hystrix
-
服务消费者工程(页面静态化微服务)中引入Feign依赖(或者父类工程)
<!-- 远程服务调用OpenFeign --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> -
服务消费者工程(静态化微服务)启动类使用注解@EnableFeignClients添加Feign支持
@SpringBootApplication //@EnableEurekaClient //Eureka客户端,只能在Eureka环境中使用 @EnableDiscoveryClient //也是将当前项目表示为注册中心的客户端,像注册中心进行注册,可以在所有的服务注册中心环境中使用 //@EnableCircuitBreaker //开启服务熔断机制 @EnableFeignClients //开启Feign客户端功能 public class PageApplication { }注意:此时去掉Hystrix熔断的支持注解@EnableCircuitBreaker即可包括引入的依赖,因为Feign会自动引入
-
在消费者微服务中创建Feign接口
/** * @Program: springclouddemo * @Author: XiaoXing * @Create: 2021-02-08 15:11 * @Description: 远程调用服务提供方功能接口 **/ @FeignClient(name = "szx-service-product") //开启注解 public interface ProductFeign { /** * 通过商品id,查询商品对象 * @param id * @return */ @GetMapping("/product/selectProductById/{id}") //此 URL 必须和 product 服务提供者 URL 相同 public Products selectProductById(@PathVariable Integer id); /** * 获取商品服务端口 * @return */ @RequestMapping("/service/getPort") public String getPort(); }注意:
1)@FeignClient注解的name属性用于指定要调用的服务提供者名称,和服务提供者 application.properties 文件中spring.application.name保持一致2)接口中的接口方法,就好比是远程服务提供者Controller中的Hander方法(只不过如同本地调用了),那么在进行参数绑定的时,可以使用@PathVariable、@RequestParam、@RequestHeader等,这也是OpenFeign对SpringMVC注解的支持,但是需要注意value必须设置,否则会抛出异常
- @FeignClient(name = “szx-service-product”),name在消费者微服务中只能出现一次。(升级Spring Boot 2.1.0 Spring Cloud Greenwich.M1 版本后,在2个Feign接口类内定义相同的名字,@FeignClient(name = 相同的名字 就会出现报错,在之前的版本不会提示报错),所以最好将调用一个微服务的信息都定义在一个Feign接口中。
-
改造PageController中原有的调用方式
@RestController @RequestMapping("/page") public class PageController { @Autowired private ProductFeign productFeign; @GetMapping("/getProduct/{id}") public Products getProduct(@PathVariable Integer id){ return productFeign.selectProductById(id); } /** * 测试负载均衡调用端口 * @return */ @GetMapping("/getProductServerPort") public String getProductServerPort(){ return productFeign.getPort(); } }
Feign对负载均衡的支持
Feign 本身已经集成了Ribbon依赖和自动配置,因此我们不需要额外引入依赖,可以通过ribbon.xx 来进 行全局配置,也可以通过服务名.ribbon.xx 来对指定服务进行细节配置配置(参考之前,此处略)
Feign默认的请求处理超时时长1s,有时候我们的业务确实执行的需要一定时间,那么这个时候,我们就需要调整请求处理超时时长,Feign自己有超时设置,如果配置Ribbon的超时,则会以Ribbon的为准
#针对的被调用方微服务名称,不加就是全局生效
#请求连接超时时间
#szx-service-product.ribbon.ConnectTimeout:2000
#请求处理超时时间
#szx-service-product.ribbon.ReadTimeout:500
#对所有操作都进行重试
szx-service-product.ribbon.OkToRetryOnAllOperations:true
####根据如上配置,当访问到故障请求的时候,它会再尝试访问一次当前实例(次数由MaxAutoRetries配置),
####如果不行,就换一个实例进行访问,如果还不行,再换一次实例访问(更换次数由MaxAutoRetriesNextServer配置),
####如果依然不行,返回失败信息。
#对当前选中实例重试次数,不包括第一次调用
szx-service-product.ribbon.MaxAutoRetries:0
#切换实例的重试次数
szx-service-product.ribbon.MaxAutoRetriesNextServer:0
#负载策略调整
szx-service-product.ribbon.NFLoadBalancerRuleClassName:com.netflix.loadbalancer.RoundRobinRule
Feign对熔断器的支持
1)在Feign客户端工程配置文件(application.properties)中开启Feign对熔断器的支持
#开启Feign的熔断功能
feign.hystrix.enabled=true
Feign的超时时长设置那其实就上面Ribbon的超时时长设置
Hystrix超时设置(就按照之前Hystrix设置的方式就OK了)
注意:
-
开启Hystrix之后,Feign中的方法都会被进行一个管理了,一旦出现问题就进入对应的回退逻辑处理
-
针对超时这一点,当前有两个超时时间设置(Feign/hystrix),熔断的时候是根据这两个时间的最小值来进行的,即处理时长超过最短的那个超时时间了就熔断进入回退降级逻辑
#配置熔断策略
#强制打开熔断器,如果该属性设置为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:5000
2)自定义FallBack处理类(需要实现FeignClient接口)
/**
* @Program: springclouddemo
* @Author: XiaoXing
* @Create: 2021-02-08 15:11
* @Description: 远程调用服务提供方功能接口
**/
@FeignClient(name = "szx-service-product",fallback = ProductFeignFallBack.class) //开启注解,fallback:定义熔断后回调的方法
public interface ProductFeign {
/**
* 通过商品id,查询商品对象
* @param id
* @return
*/
@GetMapping("/product/selectProductById/{id}") //此 URL 必须和 product 服务提供者 URL 相同
public Products selectProductById(@PathVariable Integer id);
/**
* 获取商品服务端口
* @return
*/
@RequestMapping("/service/getPort")
public String getPort();
}
@Component
public class ProductFeignFallBack implements ProductFeign {
@Override
public Products selectProductById(Integer id) {
return null;
}
@Override
public String getPort() {
return "-1";
}
}
Feign对请求压缩和响应压缩的支持
若数据量相对较大,则启用压缩,数据量较小,则不需要
Feign 支持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗。通过下面的参数 即可开启请求与响应的压缩功能:
#开启请求和响应压缩
feign.hystrix.enabled=true
#默认不开启
feign.compression.request.enabled=true
#设置压缩的数据类型,此处也是默认值(可不设置)
feign.compression.request.mime-types=text/xml,application/xml,application/json
#设置触发压缩的大小下限,此处也是默认值
feign.compression.request.min-request-size=2048
#默认不开启
feign.compression.response.enabled=true
本文详细介绍了SpringCloud中Feign组件的使用,包括其作为轻量级HTTP客户端的角色,如何替代RestTemplate进行更优雅的服务调用。Feign通过接口注解实现了类似Dubbo的本地调用体验,并内置了Ribbon进行负载均衡。同时,文章还讲解了如何开启Hystrix熔断支持,以及自定义回退策略,确保系统的稳定性和容错性。此外,还提到了Feign对请求和响应压缩的配置选项,以提高效率。
2096

被折叠的 条评论
为什么被折叠?



