崇仁县 文昌市 出国 景东 尼木县 德庆县 灵宝市 赣榆县 留坝县 北海市 临泉县 岳普湖县 吉安市 盐津县 淳化县 灵石县

文章导航软件下载安卓资源苹果资源

pc软件新闻网络操作系统编程服务器软件评测

安卓新闻资讯应用教程安卓游戏攻略tv资讯深度阅读综合安卓评测

苹果ios资讯备份教程美化教程mac教程

单机游戏角色扮演即时战略动作射击棋牌游戏体育竞技模拟经营游戏工具

网游cf活动dnf活动lol周免英雄lol礼包

手游最新动态手游评测手游活动新游预告手游问答

您的位置:单机游戏角色扮演 → 怪物猎人世界新装备介绍 怪物猎人世界新装备新系统一览

九品芝麻官_不使用SpringBoot如何将原生Feign集成到Spring中来简化http调用

标签:心包炎 中国象棋167三级棋手

在微服务架构中,如果使用得是SpringCloud,那么只需要集成SpringFeign就可以了,SpringFeign可以很友好的帮我们进行服务请求,对象解析等工作。

然而SpingCloud是依赖于SpringBoot的。在老的Spring项目中通常是没有集成SpringBoot,那么我们又该如何使用Feign组件进行调用呢?

这种情况下就只能使用原生Feign了,Feign使用手册:https://www.cnblogs.com/chenkeyu/p/9017996.html

使用原生Feign的两个问题:

  一、原生Feign只能一次解析一个接口,生成对应的请求代理对象,如果一个包里有多个调用接口就要多次解析非常麻烦。

  二、Feign生成的调用代理只是一个普通对象,该如何注册到Spr笑看风云_2018年最新新闻网ing中,以便于我们可以使用@Autowired随时注入。

解决方案:

  一、针对多次解析的问题,可以通过指定扫描包路径,然后对包中的类依次解析。使用工具:https://github.com/lukehutch/fast-classpath-scanner

  二、实现BeanFactoryPostProcessor接口,扩展Spring容器功能。

具体代码:

  maven依赖:

<dependency>
            <groupId>com.netflix.feign</groupId>
            <artifactId>feign-core</artifactId>
            <version>8.18.0</version>
        </dependency>
        <dependency>
            <groupId>com.netflix.feign</groupId>
            <artifactId>feign-jackson</artifactId>
            <version>8.18.0</version>
        </dependency>
        <dependency>
            <groupId>io.github.lukehutch</groupId>
            <artifactId>fast-classpath-scanner</artifactId>
            <version>2.18.1</version>
        </dependency>

  自定义注解:在扫描接口的过程中,可以通过一个自定义注解,来区分Feign接口并且指定调用的服务Url

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface FeignApi {
/**
* 调用的服务地址
* @return
*/
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.BeanFactoryPostP婉君_2018年最新新闻网rocessor;
import org.springframework.beans.factory.config.Configur男女纠察队_2018年最新新闻网ableListableBeanFactory;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
public class FeignClientRegister implements BeanFactoryPostProcessor{
    //扫描的接口路径
    private String  scanPath="com.xxx.api";

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
        List<String> 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);
                重生之都市修仙_2018年最新新闻网} catch (Exception e) {
                    throw new RuntimeException(e.getMessage());
                }
            }
        仙侠世界_2018年最新新闻网}
    }

    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<String> scan(String path){
        ScanResult result = new FastClasspathScanner(path).matchClassesWithAnnotation(FeignApi.class, (Class<?> aClass) -> {
        }).scan();
        if(result!=null){
            return result.getNamesOfAllInterfaceClasses(我的黑道男友_2018年最新新闻网);
        }
        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;

@FeignApi(serviceUrl = "http://localhost:8085")
public interface RoomApi {
    @Headers({"Content-Type: application/json","Accept: application/json"})
    @RequestLine("GET /room/selectById?id={id}")
    Result<DeptRoom> selectById(@Param(value="http://www-tigongshi-com.tiaophotography.cn/id") String id);

    @Headers({"Content-Type: application/json","Accept: application/json"})
    @RequestLine("GET /room/test")
    Result<List<DeptRoom>> selectList();
}

接口使用示例:

@Service
public class ServiceImpl{
    //将接口注入要使用的bean中直接调用即可
    @Autowired
    private RoomApi roomApi;
    

    @Test
    public void demo(){
        Result<DeptRoom> result = roomApi.selectById("1");
        System.out.println(result);
    }
}

注意事项:

1.如果接口返回的是一个复杂的嵌套对象,那么一定要明确的指定泛型,因为Feign在解析复杂对象的时候,需要通过反射获取接口返回对象内部的泛型类型才能正确使用Jackson解析。

如果不明确的指明类型,Jackson会将json对象转换成一个LinkedHashMap类型。

2.如果你使用的是的Spring,又需要通过http调用别人的接口,都可以使用这个工具来简化调用与解析的操作。

当前文章:http://www-tigongshi-com.tiaophotography.cn/v7kskx4e8/ab782_152608.html

发布时间:2019-07-19 00:21:26

2288银河主站线路检测  银河优越会会员申请  澳门银河娱乐送彩金网站  银河娱乐手机版yh163am.com中国女留学生在西班牙被辱骂攻击,多次反抗无效  澳门银河官网yh163am.com  澳门银河娱乐送彩金网站小猪佩奇不差钱是什么梗 佩奇为何不差钱  澳门银河2949所有网址李易峰凌晨发文庆31岁生日 何炅魏大勋等送祝福  919银河优越会千斤小龙虾翻车 遭过往车辆碾压成  澳门银河www66356com  银河国际手机网址2949  

相关阅读 特殊需求:EF 6.x如何比较TimeSpan格式的字符串?EF Core实现方式是否和EF 6.x等同?联想Moto One Power真机曝光:刘海屏+竖排双摄美白牙齿/清新口气,高露洁劲白牙膏120g×6只29.9元三星Galaxy A9 Star黑白两款真机现身小米公交新增101城,京津冀互联互通卡限时6元开卡国考补录3日起报名 4127个名额可供“捡漏”粉丝自制哆啦A梦动画《大雄的喜马拉雅行进记》 小伙伴们一起逛遍中国

文章评论
发表评论

热门文章 国考三年来最大规模补录今起报名 九成空缺在基层甘肃岷县遭遇强对流天气:疏散300余人1人死亡

最新文章 国考三年来最大规模补录今起报名 九成空缺在基层5个国家和地区及港澳台来宾参加第三届丝绸之路国际博览会 最高人民法院顾雏军案再审合议庭召开庭前会议京东X事业部总裁肖军:今年8月将推智慧餐厅199元!小米手环3 NFC版发布

人气排行 海南将实行购车摇号 今日起暂停注册上牌西山居自研生存竞技网游 自由禁区不删档测试今日正式开启盒马高管称京东“无人餐厅”抄袭:别侮辱自己sql server I/O硬盘交互路透社:Uber要求出借方下调11.3亿美元贷款利率进店立减61.8元、送半年QQ绿钻,腾讯听听人工智能音箱京东637元新低