首页 > 其他分享 >OpenFeign框架相关

OpenFeign框架相关

时间:2024-02-05 20:45:27浏览次数:32  
标签:feign OpenFeign 框架 private class static import 相关 public

OpenFeign是什么?

OpenFeign是一个声明式的WebService客户端。使用OpenFeign能让编写Web Service客户端更加简单。使用时只需定义服务接口,然后在上面添加注解。OpenFeign也支持可拔插式的编码和解码器。spring cloud对feign进行了封装,使其支持MVC注解和HttpMessageConverts。和 eureka(服务注册中心)及 ribbon 组合可以实现负载均衡。在Spring Cloud中使用OpenFeign,可以做到使用HTTP请求访问远程服务,就像调用本地方法一样简单,开发者完全感知不到这是在调用远程方法,更感知不到在访问HTTP请求,非常的方便。

OpenFeign能干啥?

  1. OpenFeign的设计宗旨是简化Java Http客户端的开发。Feign 在 RestTemplate 的基础上做了进一步的封装,由其来帮助我们定义和实现依赖服务接口。在OpenFeign的协助下,我们只需创建一个接口并使用注解的方式进行配置(类似于Dao接口上面的Mapper注解)即可完成对服务提供方的接口绑定,大大简化了调用客户端的开发量。
  2. OpenFeign集成了Ribbon,利用ribbon维护了服务列表,并且通过ribbon实现了客户端的负载均衡。与ribbon不同的是,通过OpenFeign只需要定义服务绑定接口,且以声明式的方法,优雅而简单的实现了服务调用。

客户端使用

添加 maven 依赖

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-openfeign-core</artifactId>
  <version>2.2.10.RELEASE</version>
</dependency>

代码示例

import com.fasterxml.jackson.databind.ObjectMapper;
import feign.Feign;
import feign.FeignException;
import feign.RequestLine;
import feign.Response;
import feign.codec.DecodeException;
import feign.codec.Decoder;
import lombok.Data;
import org.springframework.core.ResolvableType;

import java.io.IOException;
import java.lang.reflect.Type;

/**
 * 测试Feign发送HTTP请求
 */
public class TestFeignClient {
    public static void main(String[] args) {
        DujitangClient client = Feign.builder()
                .decoder(new MyDecoder())
                .target(DujitangClient.class, "https://api.nextrt.com");
        TauntResponse response = client.queryDujitang();
        System.out.println(response);
    }

    static class MyDecoder implements Decoder {

        @Override
        public Object decode(Response response, Type type) throws IOException, DecodeException, FeignException {
            return new ObjectMapper().readValue(response.body().asInputStream(), ResolvableType.forType(type).getRawClass());
        }
    }

    interface DujitangClient {
        @RequestLine("GET /api/dutang")
        TauntResponse queryDujitang();
    }

    @Data
    public static class TauntResponse {

        private String status;
        private String msg;
        private TauntInfo data;
        private Long timestamp;
    }

    @Data
    public static class TauntInfo {

        private Integer id;
        private String content;
    }
}

默认使用 feign.Client.Default 客户端,底层为 java 中的 HttpURLConnection。

整合SpringMVC

import com.fasterxml.jackson.databind.ObjectMapper;
import feign.Feign;
import feign.FeignException;
import feign.Response;
import feign.codec.DecodeException;
import feign.codec.Decoder;
import lombok.Data;
import org.springframework.cloud.openfeign.support.SpringMvcContract;
import org.springframework.core.ResolvableType;
import org.springframework.web.bind.annotation.RequestMapping;

import java.io.IOException;
import java.lang.reflect.Type;

/**
 * 测试Feign发送HTTP请求
 */
public class TestSpringFeignClient {
    public static void main(String[] args) {
        DujitangClient client = Feign.builder()
                .decoder(new MyDecoder())
                .contract(new SpringMvcContract())
                .target(DujitangClient.class, "https://api.nextrt.com");
        TauntResponse response = client.queryDujitang();
        System.out.println(response);
    }

    static class MyDecoder implements Decoder {

        @Override
        public Object decode(Response response, Type type) throws IOException, DecodeException, FeignException {
            return new ObjectMapper().readValue(response.body().asInputStream(), ResolvableType.forType(type).getRawClass());
        }
    }

    interface DujitangClient {
        @RequestMapping("/api/dutang")
        TauntResponse queryDujitang();
    }

    @Data
    public static class TauntResponse {

        private String status;
        private String msg;
        private TauntInfo data;
        private Long timestamp;
    }

    @Data
    public static class TauntInfo {

        private Integer id;
        private String content;
    }
}

SpringMvcContract 可以支持 @RequestMapping,@PathVariable 等注解。

整合SpringBoot及OkHttp

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-openfeign</artifactId>
  <exclusions>
    <exclusion>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-netflix-ribbon</artifactId>
    </exclusion>
    <exclusion>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-loadbalancer</artifactId>
    </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>io.github.openfeign</groupId>
  <artifactId>feign-okhttp</artifactId>
</dependency>
<dependency>
  <groupId>com.squareup.okhttp3</groupId>
  <artifactId>okhttp</artifactId>
  <version>3.11.0</version>
</dependency>
@EnableFeignClients
@SpringBootApplication
public class CnblogsBackUpApplication {

  public static void main(String[] args) {
    SpringApplication.run(CnblogsBackUpApplication.class, args);
  }

}
public class FeignDefaultConfiguration {

  @Bean
  public Client feignClient() {
    return new OkHttpClient(OkHttpUtility.getOkHttpClientInstance());
  }

  private static class OkHttpUtility {

    private static final okhttp3.OkHttpClient okHttpClient;
    public static okhttp3.OkHttpClient getOkHttpClientInstance() {
      return okHttpClient;
    }

    static {
      okHttpClient = new okhttp3.OkHttpClient.Builder()
          .connectionPool(new ConnectionPool(50, 5L, TimeUnit.MINUTES))
          .connectTimeout(30L, TimeUnit.SECONDS).readTimeout(30L, TimeUnit.SECONDS)
          .build();
    }
  }
}
@FeignClient(url = "${baidu.url}", name = "baidu",
    configuration = FeignDefaultConfiguration.class)
public interface BaiduService {

  @GetMapping(value = "/s")
  String baiduSearch(@RequestParam String wd);
}

将 默认的客户端实现 feign.Client.Default 替换为了 okhttp3.OkHttpClient。

原理分析

  1. @EnableFeignClients导入FeignClientsRegistrar,扫描包含@FeignClient注解的类
  2. 接口底层实现类为FeignClientFactoryBean
  3. 最终的方法执行拦截器为SynchronousMethodHandler

Feign组件分析

整合负载均衡

  1. FeignClientFactoryBean的getTarget()方法获取到类型为LoadBalancerFeignClient的Client
  2. 进入LoadBalancerFeignClient的execute()方法
  3. 进入LoadBalancerFeignClient的lbClient(),根据clientName获取
  4. 进入CachingSpringLoadBalancerFactory的create()方法
  5. SpringClientFactory的getLoadBalancer()方法,获取到ZoneAwareLoadBalancer类型的ILoadBalancer
  6. ZoneAwareLoadBalancer的balancers字段中已经包含了该clientName在注册中心对应的多个实例地址
  7. PollingServerListUpdater每隔30秒都会从注册中心拉取最新的数据并更新到ILoadBalancer中
  8. 通过DiscoveryEnabledNIWSServerList的obtainServersViaDiscovery()方法来从注册中心获取实例列表

参考

Spring Cloud OpenFeign源码分析

标签:feign,OpenFeign,框架,private,class,static,import,相关,public
From: https://www.cnblogs.com/strongmore/p/17131294.html

相关文章

  • PowerShell是一种跨平台的任务自动化解决方案,包括命令行shell、脚本语言和配置管理框
    PowerShell是一种跨平台的任务自动化解决方案,包括命令行shell、脚本语言和配置管理框架。PowerShell提供了丰富的命令(称为cmdlet),可以用来执行许多Windows管理任务,包括但不限于用户和组管理、文件系统操作、进程和服务管理等。下面列举一些常见的net命令以及它们在PowerShell中的对......
  • 【驱动】块设备驱动(一)-驱动框架
    块设备的定义块设备是针对存储设备的,比如SD卡、EMMC、NANDFlash、NorFlash、SPIFlash、机械硬盘、固态硬盘等。因此块设备驱动其实就是这些存储设备驱动,块设备驱动相比字符设备相比,块设备有以下几个特殊之处:块设备可以从数据的任何位置进行访问块数据总是以固定长度进行......
  • 一款后台管理框架的年终总结
    这是一篇关于Fantastic-admin这款后台管理框架的年终总结。不过与其说是年终总结,更像是一场回顾,看看这一年Fantastic-admin都做了哪些与众不同的功能,也给大家提供一些创造思路。或许有些功能,你可以在自己的项目里实现。以下按commit时间顺序汇总:可阅读时间这是一个将......
  • 【揭秘OAuth协议 — Java安全认证框架的核心基石】 从初识到精通,带你领略OAuth协议的
    背景介绍在现代的网站中,我们经常会遇到需要用户登录的情况。然而,直接要求用户注册可能会显得繁琐,导致用户的流失。为了解决这个问题,网站可以采用OAuth授权机制。通过与像GitHub或其他第三方网站的认证授权合作,网站可以获取用户的相关信息,避免了繁琐的注册过程。在从第三方网站授权......
  • SpringCloud工程添加openfeign使用服务之间调用
    SpringCloud服务之间的调用可以采用openfeign,今天这里就简单记录下需要做的步骤。前置条件就是微服务都建好了,并且两个服务都注册到nacos上,这里用两个微服务模块。简单描述:请求A模块,然后去调用B模块数据,最后从A模块接口返回。需要在A模块添加openfeign的依赖和service写好接口,B......
  • PowerShell 中使用相关命令管理 FFU(Full Flash Update)映像
    PowerShell中使用相关命令管理FFU(FullFlashUpdate)映像的示例:获取系统中的Windows映像信息:powershellCopyCodeGet-WindowsImage挂载指定的Windows映像:powershellCopyCodeMount-WindowsImage-ImagePath"C:\path\to\image.ffu"-Index1-Path"C:\mount"......
  • Ubuntu权限相关命令
    目录文件夹/文件带锁(图标)解锁无密码访问文件/目录其他后记命令参考:https://www.cnblogs.com/alongdidi/p/linux_ownership_permission.html文件夹/文件带锁(图标)解锁递归解锁当前路径下的所有文件夹以及文件(包括子文件)sudochmod-R777.无密码访问文件/目录......
  • 四、SpringCloud alibaba 之 OpenFeign
    4.1、调用过程的演化JAVA项目中如何实现接口调用?远程调用工具描述HttpClientHttpClient是ApacheJakartaCommon下的子项目,用来提供高效的、最新的、功能丰富的支持Http协议的客户端编程工具包,并且它支持HTTP协议最新版本和建议。HttpClient相比传统JDK自......
  • 大模型推理框架 vLLM 源码解析(一)
    1.QuickStart创建如下代码,命名为run.pyfromvllmimportLLM,SamplingParamsprompts=[ "HaveyoufollowedmarsggboinZhihu?", "你一键三连了吗?"]#输入promptssampling_params=SamplingParams(temperature=0.8,top_k=50)#采样策略llm=LLM(model=&q......
  • PMP-6.12 监督相关方参与
    一、监督相关方参与基础内容0.涉及领域:(1)资源管理计划资源管理计划确定了对团队成员的管理方法。(2)沟通管理计划沟通管理计划描述了适用于项目相关方的沟通计划和策略。(3)相关方参与计划定义了管理相关方需求和期望的计划。1.监督相关方参与阶段需参照文档(1)问题......