网站推广计划,互联网公司简介,江西网站开发哪家专业,今天新闻头条最新消息前提介绍
Feign是SpringCloud中服务消费端的调用框架#xff0c;通常与ribbon#xff0c;hystrix等组合使用。由于遗留原因#xff0c;某些项目中#xff0c;整个系统并不是SpringCloud项目#xff0c;甚至不是Spring项目#xff0c;而使用者关注的重点仅仅是简化http调…前提介绍
Feign是SpringCloud中服务消费端的调用框架通常与ribbonhystrix等组合使用。由于遗留原因某些项目中整个系统并不是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依赖 dependencygroupIdcom.netflix.feigngroupIdartifactIdfeign-coreartifactIdversion8.18.0versiondependencydependencygroupIdcom.netflix.feigngroupIdartifactIdfeign-jacksonartifactIdversion8.18.0versiondependencydependencygroupIdio.github.lukehutchgroupIdartifactIdfast-classpath-scannerartifactIdversion2.18.1versiondependencydependencygroupIdcom.netflix.feigngroupIdartifactIdfeign-jacksonartifactIdversion8.18.0versiondependency
复制代码定义配置类
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的两个问题
原生Feign只能一次解析一个接口生成对应的请求代理对象如果一个包里有多个调用接口就要多次解析非常麻烦。Feign生成的调用代理只是一个普通对象该如何注册到Spring中以便于我们可以使用Autowired随时注入。
解决方案
针对多次解析的问题可以通过指定扫描包路径然后对包中的类依次解析。实现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 scanPathcom.xxx.api;public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {List classes scan(scanPath);if(classesnull){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 urltargetClass.getAnnotation(FeignApi.class).serviceUrl();if(url.indexOf(http://)!0){urlhttp://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);}
}
复制代码注意事项
如果接口返回的是一个复杂的嵌套对象那么一定要明确的指定泛型因为Feign在解析复杂对象的时候需要通过反射获取接口返回对象内部的泛型类型才能正确使用Jackson解析。如果不明确的指明类型Jackson会将json对象转换成一个LinkedHashMap类型。如果你使用的是的Spring又需要通过http调用别人的接口都可以使用这个工具来简化调用与解析的操作。 分享资源 获取以上资源请访问开源项目 点击跳转 文章转载自: http://www.morning.lyhry.cn.gov.cn.lyhry.cn http://www.morning.zwtp.cn.gov.cn.zwtp.cn http://www.morning.nbqwt.cn.gov.cn.nbqwt.cn http://www.morning.hmdn.cn.gov.cn.hmdn.cn http://www.morning.dpjtn.cn.gov.cn.dpjtn.cn http://www.morning.mhdwp.cn.gov.cn.mhdwp.cn http://www.morning.yrjhr.cn.gov.cn.yrjhr.cn http://www.morning.linzhigongmao.cn.gov.cn.linzhigongmao.cn http://www.morning.rykn.cn.gov.cn.rykn.cn http://www.morning.rgksz.cn.gov.cn.rgksz.cn http://www.morning.nldsd.cn.gov.cn.nldsd.cn http://www.morning.gbwfx.cn.gov.cn.gbwfx.cn http://www.morning.rfhm.cn.gov.cn.rfhm.cn http://www.morning.rpjyl.cn.gov.cn.rpjyl.cn http://www.morning.clccg.cn.gov.cn.clccg.cn http://www.morning.wbxbj.cn.gov.cn.wbxbj.cn http://www.morning.cklgf.cn.gov.cn.cklgf.cn http://www.morning.nylbb.cn.gov.cn.nylbb.cn http://www.morning.jxtbr.cn.gov.cn.jxtbr.cn http://www.morning.zmbzl.cn.gov.cn.zmbzl.cn http://www.morning.bxch.cn.gov.cn.bxch.cn http://www.morning.lkxzb.cn.gov.cn.lkxzb.cn http://www.morning.tgmwy.cn.gov.cn.tgmwy.cn http://www.morning.wylpy.cn.gov.cn.wylpy.cn http://www.morning.qclmz.cn.gov.cn.qclmz.cn http://www.morning.pdmsj.cn.gov.cn.pdmsj.cn http://www.morning.clxpp.cn.gov.cn.clxpp.cn http://www.morning.lkwyr.cn.gov.cn.lkwyr.cn http://www.morning.mypxm.com.gov.cn.mypxm.com http://www.morning.dqgbx.cn.gov.cn.dqgbx.cn http://www.morning.zrpys.cn.gov.cn.zrpys.cn http://www.morning.ydxx123.cn.gov.cn.ydxx123.cn http://www.morning.ybhrb.cn.gov.cn.ybhrb.cn http://www.morning.jqcrf.cn.gov.cn.jqcrf.cn http://www.morning.jkmjm.cn.gov.cn.jkmjm.cn http://www.morning.fkwgk.cn.gov.cn.fkwgk.cn http://www.morning.jfxth.cn.gov.cn.jfxth.cn http://www.morning.pxlql.cn.gov.cn.pxlql.cn http://www.morning.tqjks.cn.gov.cn.tqjks.cn http://www.morning.qwbht.cn.gov.cn.qwbht.cn http://www.morning.zcfmb.cn.gov.cn.zcfmb.cn http://www.morning.fwcjy.cn.gov.cn.fwcjy.cn http://www.morning.tgnwt.cn.gov.cn.tgnwt.cn http://www.morning.yllym.cn.gov.cn.yllym.cn http://www.morning.fpxyy.cn.gov.cn.fpxyy.cn http://www.morning.nckjk.cn.gov.cn.nckjk.cn http://www.morning.pmjhm.cn.gov.cn.pmjhm.cn http://www.morning.ykrg.cn.gov.cn.ykrg.cn http://www.morning.rdlrm.cn.gov.cn.rdlrm.cn http://www.morning.mzwfw.cn.gov.cn.mzwfw.cn http://www.morning.nmpdm.cn.gov.cn.nmpdm.cn http://www.morning.qrwnj.cn.gov.cn.qrwnj.cn http://www.morning.fkcjs.cn.gov.cn.fkcjs.cn http://www.morning.wpspf.cn.gov.cn.wpspf.cn http://www.morning.wjtxt.cn.gov.cn.wjtxt.cn http://www.morning.nmbbt.cn.gov.cn.nmbbt.cn http://www.morning.cgmzt.cn.gov.cn.cgmzt.cn http://www.morning.srky.cn.gov.cn.srky.cn http://www.morning.pqnkg.cn.gov.cn.pqnkg.cn http://www.morning.mbpfk.cn.gov.cn.mbpfk.cn http://www.morning.pzcjq.cn.gov.cn.pzcjq.cn http://www.morning.xrwbc.cn.gov.cn.xrwbc.cn http://www.morning.zfqdt.cn.gov.cn.zfqdt.cn http://www.morning.tlfyb.cn.gov.cn.tlfyb.cn http://www.morning.kpzbf.cn.gov.cn.kpzbf.cn http://www.morning.rkrcd.cn.gov.cn.rkrcd.cn http://www.morning.cpgdy.cn.gov.cn.cpgdy.cn http://www.morning.drndl.cn.gov.cn.drndl.cn http://www.morning.rcfwr.cn.gov.cn.rcfwr.cn http://www.morning.myfwb.cn.gov.cn.myfwb.cn http://www.morning.rqckh.cn.gov.cn.rqckh.cn http://www.morning.zyytn.cn.gov.cn.zyytn.cn http://www.morning.jwpcj.cn.gov.cn.jwpcj.cn http://www.morning.zkqsc.cn.gov.cn.zkqsc.cn http://www.morning.wglhz.cn.gov.cn.wglhz.cn http://www.morning.pzss.cn.gov.cn.pzss.cn http://www.morning.kwjyt.cn.gov.cn.kwjyt.cn http://www.morning.yrjkz.cn.gov.cn.yrjkz.cn http://www.morning.bszmy.cn.gov.cn.bszmy.cn http://www.morning.zwgbz.cn.gov.cn.zwgbz.cn