首页 > 其他分享 >Spring Cloud 之OpenFeign

Spring Cloud 之OpenFeign

时间:2023-07-16 14:44:53浏览次数:42  
标签:Feign OpenFeign contributors Spring repo owner public Cloud String

Spring Cloud 之OpenFeign

一:简介

​ Feign是一个声明式(对比RestTemplate编程式)的服务客户端,即通过@FeignClient注解即可声明一个接口(interface)。还支持多种插拔式的配置如encoders/decoders(加解码),clients(不同的链接框架)...... 。Spring Cloud 集成了 Eureka、Spring Cloud Breaker 以及 Spring Cloud LoadBalancer,便可实现 Feign 负载平衡的 http 客户端。

二: 使用方式一(单独使用)

2.1:引入依赖
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-core</artifactId>
    <version>??feign.version??</version>
</dependency>
2.2:定义接口
interface GitHub {
  @RequestLine("GET /repos/{owner}/{repo}/contributors")
  List<Contributor> contributors(@Param("owner") String owner, @Param("repo") String repo);
}

public static class Contributor {
  String login;
  int contributions;
}
2.3 : 构造Feign的 http 客户端 示例
public class MyApp {
  public static void main(String... args) {
    GitHub github = Feign.builder()
                         .decoder(new GsonDecoder()) 
                         .target(GitHub.class, "https://api.github.com");

    List<Contributor> contributors = github.contributors("OpenFeign", "feign");
    for (Contributor contributor : contributors) {
      System.out.println(contributor.login + " (" + contributor.contributions + ")");
    }
  }
}

示例解释:

2.3.1 :接口地址‘ https://api.github.com/repos/OpenFeign/feign/contributors’是一个获取github上OpenFeign项目的贡献者名单信息。
2.3.2 :Feign.builder(构建者模式(23种设计模式之一)).decoder指定解析器(返回的是json数组).target指定指定目标对象(接口和url)
2.3.3 :自定义其他参数

.encoder(加析器),errorDecoder(异常解析器).client(指定使用的客户端)....再次不一一介绍。

小结: 通过简介以及一个简单的示例,我们已经明了了Feign用法和架构,下面就看springcloud如何集成Feign

三:springcloud集成Feign

3.1:启动类加@EnableFeignClients注解开启声明式Feign,
@SpringBootApplication
@EnableFeignClients
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
3.2: 通过interface定义接口地址(复用2.2:定义接口)
interface GitHub {
  @RequestLine("GET /repos/{owner}/{repo}/contributors")
  List<Contributor> contributors(@Param("owner") String owner, @Param("repo") String repo);
}
3.3:通过@FeignClient注解(相当于 Feign.builder()) 定义远程服务地址和其他组件
   @FeignClient(url = "服务名地址(https://api.github.com)" ,value = "服务名(springboot项目的项目名与url二选一)")
interface GitHub {
  @RequestLine("GET /repos/{owner}/{repo}/contributors")
  List<Contributor> contributors(@Param("owner") String owner, @Param("repo") String repo);
}

四:集成feign后的常见需求

4.1 Feign调用失败后的错误分析

fallbackFactory :错误后的返回信息 推荐使用相比fallback可辨知错误原因)

fallback:错误后的返回信息

#配置文件中需开启错误分析
feign:
  hystrix:  # 老版本
    enabled: true
  circuitbreaker: #新版本
    enabled: true
4.1.2 fallbackFactory 示例
@Component
public class FallbackFactoryGitHub implements FallbackFactory<GitHub> {
    private static final Logger logger = LoggerFactory.getLogger(GitHub.class);

    @Override
    public GitHub create(Throwable throwable) {
        return new GitHub() {
            @Override
            public String contributors( String owner, String  repo)  {
                logger.error("contributors", throwable);
                return throwable.getMessage();
            }
			.....
        };
    }
}

4.2 服务间通过Feign调用,会丢失请求头的信息

4.2.1 步骤一:定义RequestInterceptor传的请求头信息:
@Bean
public RequestInterceptor headerInterceptor() {
        return template -> {
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            if (null != attributes) {
                attributes.getRequest();
                HttpServletRequest request = attributes.getRequest();
                Enumeration<String> headerNames = request.getHeaderNames();
                if (headerNames != null) {
                    while (headerNames.hasMoreElements()) {
                        String name = headerNames.nextElement();
                        String values = request.getHeader(name);
                        // 跳过 content-length
                        if (name.equals("content-length")){
                            continue;
                        }
                        template.header(name, values);
                    }
                }
            }
        };
    }
4.2.2 指定配置
@FeignClient(.... , configuration = XXX.class)

五:参考资料

5.1 https://docs.spring.io/spring-cloud-openfeign/docs/3.1.8/reference/html

5.2 https://github.com/OpenFeign/feign

最后期待负载均衡客户段是如何实现的

标签:Feign,OpenFeign,contributors,Spring,repo,owner,public,Cloud,String
From: https://www.cnblogs.com/jinliang374003909/p/17557847.html

相关文章

  • SpringBoot中通过自定义Jackson注解实现接口返回数据脱敏
    场景SpringBoot中整合ShardingSphere实现数据加解密/数据脱敏/数据库密文,查询明文:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/131742091上面讲的是数据库中存储密文,查询时使用明文的脱敏方式,如果是需要数据库中存储明文,而在查询时返回处理后的数据,比如身份......
  • springboot中解决redissonClien无法注入,封装工具雷
    引用:https://blog.csdn.net/feiying0canglang/article/details/120464693问题来源前几天遇到一个循环依赖问题,是RedissonClient这个bean引起的。RedissonClient是由一个配置类(@Configuration注解的类)提供的,这配置类在初始化时(@PostConstruct注解的方法中)去获取RedissonClient这......
  • spring完整笔记
    第一章初识Spring1.1Spring简介Spring是一个为简化企业级开发而生的开源框架。Spring是一个IOC(DI)和AOP容器框架。IOC全称:InversionOfControl【控制反转】将对象控制权由程序员自己反转交个SpringDI全称:DependencyInjection【依赖注入】Spring管理对象与对......
  • Springboot JPA 集成多租户
    背景:​ iot-kit项目用的是jpa,不是mybatis,项目中需要引入多租户参考文章:【讲解多租户的实现与原理】https://www.bilibili.com/video/BV1F84y1T7yf/?share_source=copy_web&vd_source=981718c4abc87423399e43793a5d3763https://callistaenterprise.se/blogg/teknik/2020/10/17......
  • SpringCloud 集成和使用 Dubbo
    SpringCloud是当前比较流行的微服务开发框架,因此很有必要介绍一下SpringCloud集成和使用Dubbo技术。本篇博客在上一篇博客的Demo基础上,对pom文件和yml配置文件进行了修改,就可以完成SpringCloud集成和使用Dubbo的Demo。是的,你没有看错,没有修改代码,只是修改了pom......
  • 每日一题:SpringBoot中支持的事务类型
    以下是每种事务类型的作用、代码示例和对代码的解释:PROPAGATION_REQUIRED(默认):作用:如果当前存在事务,则方法将在该事务中运行;如果不存在事务,则创建一个新的事务。适用于大多数业务场景,确保方法在事务中执行,如果没有事务,则创建一个新的事务。代码示例:@Transactional(propagatio......
  • springboot配置2
    核心自动配置原理        @condition条件判断注解 如果没配过就给你配 依赖底层的condition注解 里面参数是条件配置类  红色的就是不满足条件的类 ......
  • springboot 配置
    配置文件yam 名字是固定的,yaml后缀也可以比XML更适合 大量的标记被浪费yml语法把空格玩到极致   如何编写yaml文件并绑定  只有这个组件是容器中的组件才能使用容器的功能@COmponent如何在properties编写 value配置对比     ......
  • springboot3
    通过maven项目构建springboot项目创建maven项目导入springboot依赖编写一个主程序 必须加上springboot注解 主函数的快捷键psvm;两个参数一个是主类,一个是主函数参数部署测试 打包成一个jar文件包,可以在命令行运行直接场景启动器  COntroller表现层包......
  • SpringBoot中整合Sharding Sphere实现数据加解密/数据脱敏/数据库密文,查询明文
    场景为防止数据泄露,需要在插入等操作时将某表的字段在数据库中加密存储,在需要查询使用时明文显示。ShardingSphereShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这3款相互独立的产品组成。......