OpenFeign的理解和使用

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

一、概述

openFeign是要声明式的web服务客户端或叫做声明式REST客户端它让编写web服务客户端变得简单。
使用它的步骤创建一个接口并注解它。它支持spring MVC的注解spring cloud openFeign整合了hystrix同时可以和Eureka和ribbon配合使用可以实现负载均衡的http客户端。
可以理解为是请求转发RPC调度的入口。本章讲述的是2.2.10.RELEASE版本。

二、使用步骤

1、引入spring-cloud-starter-openfeign 依赖。

2、启动类上加上@EnableFeignClients开启Feign的客户端服务

3、定义一个接口并加上@FeignClient注解同时使用REST风格的接口请求服务。
例如

@FeignClient(value = "provider")
public interface OpenFeignService {
        @RequestMapping("/open")
        public String getName();

@FeignClient(“provider”)中的value值表示的是这个Feign客户端需要请求的微服务名称。这个名称代表了一个微服务或一个微服务组其实就是spring.application.name的值。Feign客户端通过这个别名去EurekaServer服务端去找到这个别名对应的微服务。

如果你在项目中还使用了ribbon做负载均衡且结合了Eureka那么ribbon将去Eureka的服务注册中心拉取注册表并缓存到本地并结合负载均衡算法选取一个物理主机作为服务端。

三、openFeign的使用

1、如果你不喜欢Feign默认的配置可以使用FeignClientsConfiguration 这个类能够让我们全面的控制Feign客户端。步骤如下
a、定义一个类继承FeignClientsConfiguration 。

b、重写方法。

c、在@FeignClient 中通过configuration属性引入自定义类。
注意这个配置类不能注册进spring容器即不需要使用@Component注解。当然如果重写Feign的配置不想用自定义类也可以使用配置文件。如果你既使用了配置类又使用了配置文件则配置文件生效。

2、如果你想定义多个Feign客户端想区分他们可以使用contextId属性。

@FeignClientname = 'provider',contextId = "AClient",configuration = "FeignConfig.class"

3、熔断机制
OpenFeign 整合了hystrix做熔断处理包括超时和异常熔断。其中对于超时OpenFeign提供了两个参数connectTimeout和readTimeout
connectTimeout防止由于服务器处理时间过长而阻塞调用者
readTimeout从建立连接时开始应用并在返回响应时间过长时触发。
处理方式为返回错误信息或fallback 其实就是hystrix的那一套机制。
实现步骤
a、设置开启feign的熔断feign.hystrix.enable=true
b、创建一个实现feign客户端类的fallback类并重写方法重写的方法其实就是针对这个方法的一个fallback处理。
c、在feign客户端类上的@FeignClient注解中用fallback属性引用

上面步骤仅仅针对学习或项目比较小如果项目比较大单独为每个feign客户端配置一个fallback类不合理我们可以将微服务调用方法集中进行统一的fallback控制这就涉及到工厂模式使用工厂类。步骤如下
a、创建工厂类需要实现FallbackFactory
b、在feign客户端类上的@FeignClient注解中用fallbackFactory属性引用

4、创建客户端
创建客户端有两种方式注解和编码
通常我们一般使用注解的方式即@FeignClient。我们也可以使用编码的方式手动创建Feign的客户端。这涉及到Feign的builder的使用属于建造者模式。例如

@Import(FeignClientsConfiguration.class)
class FooController {

    private FooClient fooClient;

    private FooClient adminClient;

    @Autowired
    public FooController(Client client, Encoder encoder, Decoder decoder, Contract contract, MicrometerCapability micrometerCapability) {
        this.fooClient = Feign.builder().client(client)
                .encoder(encoder)
                .decoder(decoder)
                .contract(contract)
                .addCapability(micrometerCapability)
                .requestInterceptor(new BasicAuthRequestInterceptor("user", "user"))
                .target(FooClient.class, "https://PROD-SVC");

        this.adminClient = Feign.builder().client(client)
                .encoder(encoder)
                .decoder(decoder)
                .contract(contract)
                .addCapability(micrometerCapability)
                .requestInterceptor(new BasicAuthRequestInterceptor("admin", "admin"))
                .target(FooClient.class, "https://PROD-SVC");
    }
}

5、刷新配置@RefreshScope
在项目中我们的配置信息一般放在配置中心中常见的配置中心有Apollo、nacos和spring cloud config
如果由于某些原因导致配置中心中的配置修改了但是我们项目不想重启这时候就需要动态配置刷新的功能。在openFeign中我们可以在配置文件中开启刷新功能feign.client.refresh-enabled: true

四、使用-截取重要代码

openFeign的配置文件


eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
  instance:
    hostname: openfeign0-cheng
    lease-expiration-duration-in-seconds: 20  #租赁维持时间 存活时间发送心跳刷新
    lease-renewal-interval-in-seconds: 10  #租赁续订间隔发送心跳间隔

ribbon:
  eureka:
    enabled: true

feign:
  hystrix:
    enabled: true
  client:
    refresh-enabled: true
  httpclient:
    connection-timeout: 500

openFeign的客户端

@Component
//@FeignClient(value = "provider",url = "http://provider:8002")
@FeignClient(value = "provider",fallbackFactory = TestFallbackFactory.class)
public interface OpenFeignService {

        @RequestMapping("/open")
        @LoadBalanced
        public String getName();
}

openFeign的启动类

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableFeignClients
@EnableEurekaClient
@EnableDiscoveryClient
public class OpenfeignApplication {
    public static void main(String[] args) {
        SpringApplication.run(OpenfeignApplication.class, args);
    }
}

五、总结

1、openFeign是一个HTTP客户端它融合了springmvc的注解使之可以用REST风格的映射来请求转发。

2、可以把openFegin理解为是controller层或是service层。可以取代springmvc控制层作为请求映射亦或是作为service层处理逻辑只不过这里openFeign只是做一个请求转发的逻辑操作。

3、openFeign整合了hystrix做熔断处理同时可以和ribbon客户端负载均衡、Eureka注册中心配合使用实现负载均衡的客户端。

4、openFeign有一个很重要的功能fallback其实它是hystrix的特性

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6