Springcloud OpenFeign 的实现(二)

Springcloud OpenFeign 的实现(一)

一、Feign request/response 压缩

您可以考虑为您的外部请求启用请求或响应GZIP压缩。您可以通过启用以下属性之一来完成此操作:

复制代码
feign.compression.request.enabled=true
feign.compression.response.enabled=true

Feign 请求压缩给你的设置与你可能为你的Web服务器设置的类似:

复制代码
spring.cloud.openfeign.compression.request.enabled=true
spring.cloud.openfeign.compression.request.mime-types=text/xml,application/xml,application/json
spring.cloud.openfeign.compression.request.min-request-size=2048

这些属性允许您选择压缩介质类型和最小请求阈值长度。

对于OkHttpClient之外的http客户端,可以启用默认gzip解码器以UTF-8编码解码gzip响应:

复制代码
feign.compression.response.enabled=true
feign.compression.response.useGzipDecoder=true

二、Spring @MatrixVariable 的支持

Spring Cloud OpenFeign支持Spring@MatrixVariable注释。

如果将映射作为方法参数传递,则通过使用=连接映射中的键值对来创建@MatrixVariable路径段。

如果传递了不同的对象,则使用=将@MatrixVariable注释中提供的名称(如果已定义)或带注释的变量名称与提供的方法参数联接。

重要信息:

即使在服务器端,Spring也不要求用户将路径段占位符命名为与矩阵变量名称相同的名称,因为在客户端它将过于模糊,Spring Cloud OpenFeign要求您添加一个路径段占位符,其名称匹配@MatrixVariable注释(如果定义)中提供的名称或带注释的变量名称。

例如:

复制代码
@GetMapping("/objects/links/{matrixVars}")
Map<String, List<String>> getObjects(@MatrixVariable Map<String, List<String>> matrixVars);

请注意,变量名和路径段占位符都称为矩阵变量。

复制代码
@FeignClient("demo")
public interface DemoTemplate {

    @GetMapping(path = "/stores")
    CollectionModel<Store> getStores();
}

三、Feign Spring Cloud CircuitBreaker 的支持

如果Spring Cloud CircuitBreaker位于类路径上,并且feign.CircuitBreaker.enabled=true,则feign将用断路器包装所有方法。

要在每个客户端的基础上禁用Spring Cloud CircuitBreaker支持,请创建一个香草外观。具有"原型"范围的建造商,例如:

复制代码
@Configuration
public class FooConfiguration {
        @Bean
    @Scope("prototype")
    public Feign.Builder feignBuilder() {
        return Feign.builder();
    }
}

断路器名称遵循这种模式<feignClientName>_<calledMethod>。当调用名为foo的@FeignClient且调用的接口方法为bar时,断路器名称将为foo_bar。

四、在配置文件中配置CircuitBreaker

你可以在application.yml中配置属性来配置 CircuitBreaker。

例如,如果你有这个 Feign 客户端

复制代码
@FeignClient(url = "http://localhost:8080")
public interface TestClient {

    @GetMapping("Test")
    String getTest();
}

你可以通过以下方式使用配置属性来配置它

复制代码
spring:
  cloud:
    openfeign:
      circuitbreaker:
        enabled: true
        alphanumeric-ids:
          enabled: true
resilience4j:
  circuitbreaker:
    instances:
      DemoClientgetDemo:
        minimumNumberOfCalls: 60
  timelimiter:
    instances:
      DemoClientgetDemo:
        timeoutDuration: 10s

五、Feign Spring Cloud CircuitBreaker Fallback

Spring Cloud CircuitBreaker支持回退的概念:当电路开路或出现错误时执行的默认代码路径。要为给定的@FeignClient启用回退,请将回退属性设置为实现回退的类名。您还需要将实现声明为SpringBean。

复制代码
@FeignClient(name = "test", url = "http://localhost:${server.port}/", fallback = Fallback.class)
protected interface TestClient {

    @RequestMapping(method = RequestMethod.GET, value = "/hello")
    Hello getHello();

    @RequestMapping(method = RequestMethod.GET, value = "/hellonotfound")
    String getException();

}

@Component
static class Fallback implements TestClient {

    @Override
    public Hello getHello() {
        throw new NoFallbackAvailableException("Boom!", new RuntimeException());
    }

    @Override
    public String getException() {
        return "Fixed response";
    }

}

如果需要访问导致回退触发器的原因,可以在@FeignClient中使用fallbackFactory属性。

复制代码
@FeignClient(name = "testClientWithFactory", url = "http://localhost:${server.port}/",
        fallbackFactory = TestFallbackFactory.class)
protected interface TestClientWithFactory {

    @RequestMapping(method = RequestMethod.GET, value = "/hello")
    Hello getHello();

    @RequestMapping(method = RequestMethod.GET, value = "/hellonotfound")
    String getException();

}

@Component
static class TestFallbackFactory implements FallbackFactory<FallbackWithFactory> {

    @Override
    public FallbackWithFactory create(Throwable cause) {
        return new FallbackWithFactory();
    }

}

static class FallbackWithFactory implements TestClientWithFactory {

    @Override
    public Hello getHello() {
        throw new NoFallbackAvailableException("Boom!", new RuntimeException());
    }

    @Override
    public String getException() {
        return "Fixed response";
    }

}
相关推荐
飞翔的佩奇6 分钟前
Java项目:基于SSM框架实现的劳务外包管理系统【ssm+B/S架构+源码+数据库+毕业论文】
java·mysql·spring·毕业设计·ssm·毕业论文·劳务外包
luckywuxn22 分钟前
EurekaServer 工作原理
java·eureka
壹米饭25 分钟前
Java程序员学Python学习笔记一:学习python的动机与思考
java·后端·python
java金融27 分钟前
Java 锁升级机制详解
java
Young556630 分钟前
还不了解工作流吗(基础篇)?
java·workflow·工作流引擎
让我上个超影吧32 分钟前
黑马点评【缓存】
java·redis·缓存
ajassi200040 分钟前
开源 java android app 开发(十一)调试、发布
android·java·linux·开源
YuTaoShao1 小时前
Java八股文——MySQL「存储引擎篇」
java·开发语言·mysql
crud1 小时前
Java 中的 synchronized 与 Lock:深度对比、使用场景及高级用法
java
王德博客1 小时前
【Java课堂笔记】Java 入门基础语法与面向对象三大特性详解
java·开发语言