当前位置:   article > 正文

Springcloud OpenFeign 的实现(二)

Springcloud OpenFeign 的实现(二)

Springcloud OpenFeign 的实现(一)

一、Feign request/response 压缩

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

  1. feign.compression.request.enabled=true
  2. feign.compression.response.enabled=true

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

  1. spring.cloud.openfeign.compression.request.enabled=true
  2. spring.cloud.openfeign.compression.request.mime-types=text/xml,application/xml,application/json
  3. spring.cloud.openfeign.compression.request.min-request-size=2048

这些属性允许您选择压缩介质类型和最小请求阈值长度。
对于OkHttpClient之外的http客户端,可以启用默认gzip解码器以UTF-8编码解码gzip响应:

  1. feign.compression.response.enabled=true
  2. feign.compression.response.useGzipDecoder=true

二、Spring @MatrixVariable 的支持

Spring Cloud OpenFeign支持Spring@MatrixVariable注释。
如果将映射作为方法参数传递,则通过使用=连接映射中的键值对来创建@MatrixVariable路径段。
如果传递了不同的对象,则使用=将@MatrixVariable注释中提供的名称(如果已定义)或带注释的变量名称与提供的方法参数联接。

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

例如: 

  1. @GetMapping("/objects/links/{matrixVars}")
  2. Map<String, List<String>> getObjects(@MatrixVariable Map<String, List<String>> matrixVars);

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

  1. @FeignClient("demo")
  2. public interface DemoTemplate {
  3. @GetMapping(path = "/stores")
  4. CollectionModel<Store> getStores();
  5. }

三、Feign Spring Cloud CircuitBreaker 的支持

如果Spring Cloud CircuitBreaker位于类路径上,并且feign.CircuitBreaker.enabled=true,则feign将用断路器包装所有方法。
要在每个客户端的基础上禁用Spring Cloud CircuitBreaker支持,请创建一个香草外观。具有“原型”范围的建造商,例如:

  1. @Configuration
  2. public class FooConfiguration {
  3. @Bean
  4. @Scope("prototype")
  5. public Feign.Builder feignBuilder() {
  6. return Feign.builder();
  7. }
  8. }

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

四、在配置文件中配置CircuitBreaker

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

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

  1. @FeignClient(url = "http://localhost:8080")
  2. public interface TestClient {
  3. @GetMapping("Test")
  4. String getTest();
  5. }

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

  1. spring:
  2. cloud:
  3. openfeign:
  4. circuitbreaker:
  5. enabled: true
  6. alphanumeric-ids:
  7. enabled: true
  8. resilience4j:
  9. circuitbreaker:
  10. instances:
  11. DemoClientgetDemo:
  12. minimumNumberOfCalls: 60
  13. timelimiter:
  14. instances:
  15. DemoClientgetDemo:
  16. timeoutDuration: 10s

五、Feign Spring Cloud CircuitBreaker Fallback

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

  1. @FeignClient(name = "test", url = "http://localhost:${server.port}/", fallback = Fallback.class)
  2. protected interface TestClient {
  3. @RequestMapping(method = RequestMethod.GET, value = "/hello")
  4. Hello getHello();
  5. @RequestMapping(method = RequestMethod.GET, value = "/hellonotfound")
  6. String getException();
  7. }
  8. @Component
  9. static class Fallback implements TestClient {
  10. @Override
  11. public Hello getHello() {
  12. throw new NoFallbackAvailableException("Boom!", new RuntimeException());
  13. }
  14. @Override
  15. public String getException() {
  16. return "Fixed response";
  17. }
  18. }

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

  1. @FeignClient(name = "testClientWithFactory", url = "http://localhost:${server.port}/",
  2. fallbackFactory = TestFallbackFactory.class)
  3. protected interface TestClientWithFactory {
  4. @RequestMapping(method = RequestMethod.GET, value = "/hello")
  5. Hello getHello();
  6. @RequestMapping(method = RequestMethod.GET, value = "/hellonotfound")
  7. String getException();
  8. }
  9. @Component
  10. static class TestFallbackFactory implements FallbackFactory<FallbackWithFactory> {
  11. @Override
  12. public FallbackWithFactory create(Throwable cause) {
  13. return new FallbackWithFactory();
  14. }
  15. }
  16. static class FallbackWithFactory implements TestClientWithFactory {
  17. @Override
  18. public Hello getHello() {
  19. throw new NoFallbackAvailableException("Boom!", new RuntimeException());
  20. }
  21. @Override
  22. public String getException() {
  23. return "Fixed response";
  24. }
  25. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/129867
推荐阅读
相关标签
  

闽ICP备14008679号