【Fegin技术专题】「原生态」打开Fegin之RPC技术的开端,你会使用原生态的Fegin吗?(上)

这篇具有很好参考价值的文章主要介绍了【Fegin技术专题】「原生态」打开Fegin之RPC技术的开端,你会使用原生态的Fegin吗?(上)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前提介绍

  • Feign是SpringCloud中服务消费端的调用框架,通常与ribbon,hystrix等组合使用。
  • 由于遗留原因,某些项目中,整个系统并不是SpringCloud项目,甚至不是Spring项目,而使用者关注的重点仅仅是简化http调用代码的编写。
  • *如果采用httpclient或者okhttp这样相对较重的框架,对初学者来说编码量与学习曲线都会是一个挑战,而使用spring中RestTemplate,又没有配置化的解决方案,由此想到是否可以脱离Spring cloud,独立使用Feign。

内容简介

Feign使得 Java HTTP 客户端编写更方便。Feign 灵感来源于Retrofit、JAXRS-2.0和WebSocket。Feign最初是为了降低统一绑定Denominator到HTTP API的复杂度,不区分是否支持Restful。Feign旨在通过最少的资源和代码来实现和HTTP API的连接。通过可定制的解码器和错误处理,可以编写任意的HTTP API。

maven依赖

  <dependency>
            <groupId>com.netflix.feigngroupId>
            <artifactId>feign-coreartifactId>
            <version>8.18.0version>
        dependency>
        <dependency>
            <groupId>com.netflix.feigngroupId>
            <artifactId>feign-jacksonartifactId>
            <version>8.18.0version>
        dependency>
        <dependency>
            <groupId>io.github.lukehutchgroupId>
            <artifactId>fast-classpath-scannerartifactId>
            <version>2.18.1version>
	   dependency>
	   <dependency>
    	<groupId>com.netflix.feigngroupId>
    	<artifactId>feign-jacksonartifactId>
        <version>8.18.0version>
    dependency>
复制代码

定义配置类

RemoteService service = Feign.builder()
            .options(new Options(1000, 3500))
            .retryer(new Retryer.Default(5000, 5000, 3))
			.encoder(new JacksonEncoder())
            .decoder(new JacksonDecoder())
            .target(RemoteService.class, "http://127.0.0.1:8085");
复制代码
  • options方法指定连接超时时长及响应超时时长
  • retryer方法指定重试策略
  • target方法绑定接口与服务端地址。
  • 返回类型为绑定的接口类型。

自定义接口

随机定义一个远程调用的服务接口,并且声明相关的接口参数和请求地址。

通过@RequestLine指定HTTP协议及URL地址


public class User{
   String userName;
}

public interface RemoteService {

    User getOwner(User user);

    public User getOwner( User user,
         String requestToken,
         Long userId,
         String userName);
}
复制代码

服务提供者

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

public class UserController {

    public User list( User user) throws InterruptedException{
        System.out.println(user.getUsername());
        user.setId(100L);
        user.setUsername(user.getUsername().toUpperCase());
        return user;
    }
}
复制代码

调用

与调用本地方法相同的方式调用feign包装的接口,直接获取远程服务提供的返回值。

String result = service.getOwner(new User("scott"));
复制代码

原生Feign的两个问题

  1. 原生Feign只能一次解析一个接口,生成对应的请求代理对象,如果一个包里有多个调用接口就要多次解析非常麻烦。
  2. Feign生成的调用代理只是一个普通对象,该如何注册到Spring中,以便于我们可以使用@Autowired随时注入。

解决方案:

  1. 针对多次解析的问题,可以通过指定扫描包路径,然后对包中的类依次解析。
  2. 实现BeanFactoryPostProcessor接口,扩展Spring容器功能。
定义一个注解类
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

public  FeignApi {

String serviceUrl();
}
复制代码
生成Feign代理并注册到Spring实现类:
import feign.Feign;
import feign.Request;
import feign.Retryer;
import feign.jackson.JacksonDecoder;
import feign.jackson.JacksonEncoder;
import io.github.lukehutch.fastclasspathscanner.FastClasspathScanner;
import io.github.lukehutch.fastclasspathscanner.scanner.ScanResult;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.stereotype.Component;
import java.util.List;

public class FeignClientRegister implements BeanFactoryPostProcessor{

    private String  scanPath="com.xxx.api";

    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
        List classes = scan(scanPath);
        if(classes==null){
            return ;
        }
        System.out.println(classes);
        Feign.Builder builder = getFeignBuilder();
        if(classes.size()>0){
            for (String claz : classes) {
                Class targetClass = null;
                try {
                    targetClass = Class.forName(claz);
                    String url=targetClass.getAnnotation(FeignApi.class).serviceUrl();
                    if(url.indexOf("http://")!=0){
                        url="http://"+url;
                    }
                    Object target = builder.target(targetClass, url);
                    beanFactory.registerSingleton(targetClass.getName(), target);
                } catch (Exception e) {
                    throw new RuntimeException(e.getMessage());
                }
            }
        }
    }

    public Feign.Builder getFeignBuilder(){
        Feign.Builder builder = Feign.builder()
                .encoder(new JacksonEncoder())
                .decoder(new JacksonDecoder())
                .options(new Request.Options(1000, 3500))
                .retryer(new Retryer.Default(5000, 5000, 3));
        return builder;
    }

    public List scan(String path){
        ScanResult result = new FastClasspathScanner(path).matchClassesWithAnnotation(FeignApi.class, (Class aClass) -> {
        }).scan();
        if(result!=null){
            return result.getNamesOfAllInterfaceClasses();
        }
        return  null;
    }
}
复制代码
调用接口编写示例:
import com.xiaokong.core.base.Result;
import com.xiaokong.domain.DO.DeptRoom;
import feign.Headers;
import feign.Param;
import feign.RequestLine;
import com.xiaokong.register.FeignApi;

import java.util.List;

public interface RoomApi {

    Result selectById( String id);

    Result> selectList();
}
复制代码
接口使用示例:

public class ServiceImpl{

    private RoomApi roomApi;

    public void demo(){
        Result result = roomApi.selectById("1");
        System.out.println(result);
    }
}
复制代码

注意事项:

  1. 如果接口返回的是一个复杂的嵌套对象,那么一定要明确的指定泛型,因为Feign在解析复杂对象的时候,需要通过反射获取接口返回对象内部的泛型类型才能正确使用Jackson解析。如果不明确的指明类型,Jackson会将json对象转换成一个LinkedHashMap类型。
  2. 如果你使用的是的Spring,又需要通过http调用别人的接口,都可以使用这个工具来简化调用与解析的操作。

分享资源

【Fegin技术专题】「原生态」打开Fegin之RPC技术的开端,你会使用原生态的Fegin吗?(上),分布式&amp;微服务技术体系,rpc,网络协议,网络
获取以上资源请访问开源项目 点击跳转文章来源地址https://www.toymoban.com/news/detail-642222.html

到了这里,关于【Fegin技术专题】「原生态」打开Fegin之RPC技术的开端,你会使用原生态的Fegin吗?(上)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 构建数字化金融生态系统:云原生的创新方法

    内容来自演讲:曾祥龙 | DaoCloud | 解决方案架构师 摘要 本文探讨了金融企业在实施云原生体系时面临的挑战,包括复杂性、安全、数据持久化、服务网格使用和高可用容灾架构等。针对网络管理复杂性,文章提出了Spiderpool开源项目,旨在优化传统网络方案,兼顾性能与自动

    2024年02月03日
    浏览(46)
  • 从传统云架构到云原生生态体系架构的演进

    随着科技的不断发展,云计算领域也经历了巨大的变革。这一演进的核心焦点是从传统云架构过渡到云原生生态体系架构,这个过程在过去的几年里已经发生了显著变化。本文将深入探讨这一演进过程,以及它对企业和技术生态系统的影响。 在云计算兴起之初,虚拟化技术是

    2024年02月08日
    浏览(40)
  • 百度智能云发布国内首个AI原生应用商店,构建全链路大模型生态体系

    面向企业客户启动文心大模型4.0 API调用服务测试申请, 服务超过17000家客户,在各行各业的近500个场景中进行大模型应用落地探索 ……自今年3月面世以来,百度智能云千帆大模型平台作为全球首个一站式企业级大模型平台,为业界交出了唯一一份“满分成绩单”。 10月17日

    2024年02月07日
    浏览(51)
  • 以大模型重构云计算,百度智能云为繁荣AI原生应用生态操碎了心

    临近2024年关,也到了2023年的总结时刻。 如果要问AI领域,2023年最不缺的是什么?“大模型”当仁不让。 那AI领域,2023年最缺的又是什么?一个答案可能是“卡”,但“卡”的问题,毕竟已有多种解决办法或者替代方案;另一个答案便是“应用”了,特别是基于大模型的AI原

    2024年02月04日
    浏览(52)
  • 探索容器化世界:开源容器生态系统概览 | 开源专题 No.61

    Stars: 15.7k License: Apache-2.0 ingress-nginx 是一个使用 NGINX 作为反向代理和负载均衡器的 Kubernetes Ingress 控制器。该项目具有以下核心优势: 使用 NGINX 作为反向代理和负载均衡器 支持多个版本,包括 1.9.1、1.8.2 等 提供详细的变更日志以及支持文档 Stars: 66.8k License: Apache-2.0 Moby 是一

    2024年01月20日
    浏览(55)
  • 集群部署专题之二:超高性能RPC框架Zeroc-ICE集群部署简易教程

    Zeroc ICE在简中互联网的资料十分匮乏,以至于大家线上使用时可能会有所顾虑。其实大家尽可放心,ZerocICE是一款性能和稳定性都非常优秀的RPC组件,这也是我当时选择ZerocICE作为XL-LightHouse的RPC组件的唯一原因。为便于大家快速了解ZerocICE,本文以v3.7版本为例介绍其部署和使

    2024年02月10日
    浏览(37)
  • 微信小程序生态4-扫普通二维码进入小程序、打开短链接进入小程序

    微信小程序生态1-初识小程序 微信小程序生态2-创建一个微信小程序 微信小程序生态3-微信小程序登录流程设计 微信小程序生态4-扫普通二维码进入小程序、打开短链接进入小程序 微信小程序生态5-微信公众号扫码登录PC端网页 微信小程序生态6-微信公众号授权登录(适用于H

    2024年02月02日
    浏览(56)
  • 【Dubbo3云原生微服务开发实战】「Dubbo前奏导学」 RPC服务的底层原理和实现

    Dubbo是一款高效而强大的RPC服务框架,它旨在解决微服务架构下的服务监控和通信问题。该框架提供了Java、Golang等多语言的SDK,使得使用者可以轻松构建和开发微服务。Dubbo具备远程地址发现和通信能力,可通过Dubbo独有的身临其境的服务治理特验为主导,以提高开发人员的功

    2024年02月05日
    浏览(49)
  • 大数据——技术生态体系

    随着大数据行业的发展,大数据生态圈中相关的技术也在一直迭代进步,希望能通过本文帮助大家快速构建大数据生态圈的完整知识体系。  Apache Hive是一个用于数据查询和分析的数据仓库工具。Hive构建在Hadoop之上,并提供了一种类似SQL的查询语言,被称为HiveQL(Hive Query L

    2024年02月07日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包