SpringCloud(七)远程调用组件之Feign

本文详细介绍了SpringCloud中Feign组件的使用,包括其作为轻量级HTTP客户端的角色,如何替代RestTemplate进行更优雅的服务调用。Feign通过接口注解实现了类似Dubbo的本地调用体验,并内置了Ribbon进行负载均衡。同时,文章还讲解了如何开启Hystrix熔断支持,以及自定义回退策略,确保系统的稳定性和容错性。此外,还提到了Feign对请求和响应压缩的配置选项,以提高效率。
摘要由CSDN通过智能技术生成

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必须设置,否则会抛出异常

    1. @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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值