SpringCloud微服务实践之六 Feign最佳实践(抽取)
创始人
2024-02-21 03:46:19

传统Feign面临的问题:
1、每个子项目都要写所要调用服务的pojo
2、每个子项目都要写所要调用服务的feign client客户端
优化思路:由提供服务服务的子项目统一归集代码,统一对外提供接口服务、Feign子项目统一管理服务远程调用、
将FeignClient抽取为独立的模块,并且把接口有关的POJO、默认Feign配置、Feign-client服务都放到这个模块中,提供给所有消费者使用。换言之,就是新建一个Feign子项目,将其他子项目的中feign相关代码(包括pojo、feign配置和feign-client)全部抽取剥离并集中于此,需要调用服务的子项目只需要依赖(引入)这个Feign子项目即可。
在这里插入图片描述

一、在父项目上点击鼠标右键选择new→Module:

过程同本专栏前述文章,略过不表,子项目的文件结构如下:
在这里插入图片描述

二、在pom.xml中引入依赖:

    org.springframework.cloudspring-cloud-starter-openfeign

三、创建feign配置类

package cn.it32.feign.config;import feign.Logger;
import org.springframework.context.annotation.Bean;public class DefaultFeignConfiguration {@Beanpublic Logger.Level logLevel(){return Logger.Level.BASIC;}
}

四、创建pojo及feign客户端,目前仅有userservice提供服务接口,因此只需创建user类的pojo 及相应feig客户端:

pojo:

package cn.it32.feign.pojo;public class User {private Long id;private String username;private String address;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}
}

feign client:

package cn.it32.feign.clients;import cn.it32.feign.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;@FeignClient("userservice")
public interface UserClient {@GetMapping("/user/{id}")User findById(@PathVariable("id") Long id);
}

五、最后一步,改造原order服务,具体包括:

(一)删除转移到feign-api类中的代码,包括:

1、pojo类User.java
2、feign配置类DefaultFeignConfiguration.java
3、feign客户端类 UserClient.java

(二)引入feign-api类,同时变更user类的导入路径

1、修改pom.xm文件,增加feign-api依赖:

        cn.it32feign-api1.0-SNAPSHOT

2、更新涉及到的user类、UserClient类、DefaultFeignConfiguration类的导入路径,具体包括:
(1)Order类
(2)OrderService类
(3)启动类OrderApplication.java
3、至此,完成改造。但此时重启测试,还会报错:找不到UserClient.
在这里插入图片描述
原因分析:这里就奇怪了,在启动类OrderApplication类中明明引入了feign-api子项目中的UserClient类,为何还会找不到呢?这是因为spring的特点所决定的:
从Order-service子项目编译没有报错,可以说明userclient这个类是确实可以被发现的;但无法注入成功,证明是这个类没有创建对象,也就是在Spring的容器里找不到它,所以注入失败。
那为什么这个接口没有对应的对象呢?改造前,之所以有这个对象,是因为UserClient接口中有这个注解:

@FeignClient(“userservice”)
public interface UserClient {

当Spring扫描到了这个注解,就会给这个接口创建对象,而改造后呢,现在它没有扫描到UserClient所在的这个包了,order-service默认的扫描包是启动类所在的包,启动类所在的包是:

package cn.it32.order;

而feign-api所在的包是:

package cn.it32.feign;

这是两个不同的包,所以扫描不到feign这个包,因此UserClient的对象就不会被创建,所以Spring的容器里就没有这个bean,就无法完成注入。这就是原因!我们就可以寻求相应的解决办法了。

当定义的FeignClient不在SpringBootApplication的扫描包范围时,这些FeignClient无法使用,有两种解决方式:
方式一:指定FeignClient所在包

@EnableFeignClients(basePackages = “cn.it32.feign”)

方式二:指定FeignClient字节码

@EnableFeignClients(clients = {UserClient.class})

第一种方式是对整个包进行扫描,第二种方式是精准扫描,这里我们一般使用第二种方式:
在order-service启动类OrderApplication.java的注解中添加:

……
@EnableFeignClients(clients = {UserClient.class},defaultConfiguration = DefaultFeignConfiguration.class)
public class OrderApplication {
……

改造完成,重启order-service测试:
在这里插入图片描述
没有报错,浏览器访问测试也正常:
在这里插入图片描述
至此,我们就完成了SpringCloud的Feign最佳实践的抽取方案了。

六、总结一下

这个最佳实践,我们是做了以下步骤:
第一步:新建了一个模块module(未来就是一个jar包),并在这个module中引入了feign相关的依赖;
第二步:我们把order-service原来自己写的feign客户端、实体类和配置都拿到了这个独立模块中,将来它就作为一个共享的jar包,任何需要userclient的服务,无需自己编写了,直接使用它就行;
第三步:在order-service的pom文件里引入feign-api依赖,这样就具备了上边这些功能,然后就可以把order-service里的这些代码删除了,原来的user相关的那些类就找不到了,就把order-service中相关的依赖包换成feign-api中的类;
第四步:最终重启时遇到一个问题:找不到UserClient了,原因是因为这个FeignClient所在的包是Feign的包,而我们现在默认的包是order包,这就导致它扫描不到了。基于两种解决方案,我们在@EnableFeignClient注解中指定所需Clent字节码文件。
结束。

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...