Feign如何使用?看看这篇文章吧

大家好 , 我是阿七 。
上一篇的文章《负载均衡Ribbon》已经带大家学习过了 , 但是代码还是存在一些问题的 , 那本篇我们通过学习feign , 来重构我们的代码 。
feign是什么?feign是Netflix开源的声明式的http客户端 。 另外 , 摘自官网的一句话:
Feignisadeclarative(声明式)webserviceclient.Itmakeswritingwebserviceclientseasier.TouseFeigncreateaninterfaceandannotateit.Ithaspluggable(可插拔)annotationsupportincludingFeignannotationsandJAX-RSannotations.Feignalsosupportspluggableencodersanddecoders.SpringCloudaddssupportforSpringMVCannotationsandforusingthesameHttpMessageConvertersusedbydefaultinSpringWeb.SpringCloudintegrates(集成)RibbonandEurekatoprovidealoadbalancedhttpclientwhenusingFeign.
让我们直接coding起来吧 。 阿七会带着大家一步一步深入了解feign 。
一、整合feign依然是我们的三步骤第一步加依赖:
org.springframework.cloudspring-cloud-starter-openfeign第二步加注解:启动类上加@EnableFeignClients注解
@MapperScan("com.seven")@SpringBootApplication@EnableFeignClientspublicclassContentCenterApplication{publicstaticvoidmain(String[]args){SpringApplication.run(ContentCenterApplication.class,args);}@Bean@LoadBalancedpublicRestTemplaterestTemplate(){returnnewRestTemplate();}}第三步写配置:暂时没有配置 。
第四步修改代码:接下来我们就开始修改代码 , 首先我们创建一个包feignclient , 编写一个接口UserCenterFeignClient , 代码如下:
//name="user-center"表示调用的服务名称@FeignClient(name="user-center")publicinterfaceUserCenterFeignClient{/***根据ID查询用户信息 , feign会自动帮我们转成*http://user-center/users/{id}**@paramid*@return*/@GetMapping("/users/{id}")UserDTOfindById(@PathVariable("id")Integerid);}另外 , 我们修改内容中心调取用户中心的代码 , 我把之前的方法也贴出来供大家比较:before–使用ribbon调用
@Service@Slf4jpublicclassShareService{@ResourceprivateShareMappershareMapper;@ResourceprivateRestTemplaterestTemplatepublicShareDTOfindById(Integerid){Shareshare=this.shareMapper.selectByPrimaryKey(id);IntegeruserId=share.getUserId();//ribbon方式:根据userId查询用户信息UserDTOuserDTO=this.restTemplate.getForObject("http://user-center/users/{userId}",UserDTO.class,userId);ShareDTOshareDTO=newShareDTO();BeanUtils.copyProperties(share,shareDTO);shareDTO.setWxNickname(userDTO.getWxNickname());returnshareDTO;}}now–使用feign调用
@Service@Slf4jpublicclassShareService{@ResourceprivateShareMappershareMapper;@ResourceprivateUserCenterFeignClientuserCenterFeignClient;publicShareDTOfindById(Integerid){Shareshare=this.shareMapper.selectByPrimaryKey(id);IntegeruserId=share.getUserId();//代码演进--feign方式:直接使用feignclient来调用UserDTOuserDTO=userCenterFeignClient.findById(userId);ShareDTOshareDTO=newShareDTO();BeanUtils.copyProperties(share,shareDTO);shareDTO.setWxNickname(userDTO.getWxNickname());returnshareDTO;}}这样一比较 , 是不是感觉我们的代码瞬间看着舒服了有木有 。 阿七觉得 , 经过一番修改 , 我们的代码具有以下好处:1、可读性强了;2、不用处理复杂的URL维护问题;3、多人协调编程体验统一了;
那我们赶紧就来测试一下吧 , 启动好内容中心和用户中心服务 , 测试接口 , 哎?怎么报错了[惊呆] , 报错信息如下:
二、feign组成上面我们已经掌握feign的基本使用 , 那feign是由什么组成的呢?贴心的阿七为大家准备好了 。 这些可以帮助我们定位深度的问题 , 也方便我们去阅读源码 。
首先 , 我们要知道feign日志级别有哪些 , 阿七又给大家整理好了 。 feign默认不记录任何日志 , 另外生产环境设置日志级别为BASIC比较好 。
feign:client:config:#想要调用的微服务的名称user-center:loggerLevel:fulllogging:level:#feign的日志级别必须建立在debug上 , 否则无效com.seven.contentcenter.feignclient.UserCenterFeignClient:debug【Feign如何使用?看看这篇文章吧】那有小伙伴肯定会问了 , 如果内容中心调用了好多其他的微服务怎么办 , 难道我还要复制好多份这样的配置吗?阿七告诉你不用的 , 只需要简单的修改一下配置即可 。 但是注意一点哈 , 细粒度配置生效的优先级是高于全局配置的 。
feign:client:config:#全局配置default:loggerLevel:fulllogging:level:#feign的日志级别必须建立在debug上 , 否则无效com.seven.contentcenter.feignclient.UserCenterFeignClient:debugfeign支持的配置项有很多 , 作为暖男的阿七又给大家整理好了 。 如果小伙伴在实际开发中遇到了 , 可以参考着使用 。
性能优化1----配置连接池配置连接池之后 , 性能大约能提升15%左右 。
(1)、使用Apache的HTTPClient为例 , 来为Feign配置连接池第一步:加依赖
io.github.openfeignfeign-httpclient第二步:写配置
feign:httpclient:#让feign使用ApacheHTTPClient做请求 , 而不是默认的urlConnectionenabled:true#feign最大连接数max-connections:200#feign单个路径的最大连接数max-connections-per-route:50(2)、使用okhttp为例 , 来为Feign配置连接池第一步:加依赖
io.github.openfeignfeign-okhttp10.1.0第二步:写配置
feign:httpclient:#feign最大连接数max-connections:200#feign单个路径的最大连接数max-connections-per-route:50okhttp:#让feign使用Apacheokhttp做请求 , 而不是默认的urlConnectionenabled:true性能优化2----设置合理的日志级别在生产环境 , 需要打印feign的日志 , 使用basic级别就ok了 , 强烈不建议使用full 。 打印日志太多 , 消耗feign的性能 。
好了 , feign的分享就到这里 , 最后 , 我画了一张微服务调用图献给大家 , 供小伙伴思考学习 。
我们下一篇将学习服务容错–sentinel , 欢迎各位小伙伴关注我 , 喜欢这篇文章记得点赞哦 。 [比心][比心][比心]


    推荐阅读