open Feign虽然简化了远程调用,但是仍然存在着一些不太好的问题,这种问题并不是代码程序的问题,而是代码无法服用,无法构成一种编程的思维模式,如果一个服务需要多次被其他服务所引用并且服务数量很多的时候,代码程度就会很复杂,并且需要大量的重复编写同一个代码,这个时候就需要利用到maven的特性了,将服务提供统一封装到一个服务之中,然后再导入到其他需要的服务,这样就能实现代码的复用。
一般来说服务抽取有两种常用方式 :
1. 由微服务的开发商在编写的过程中就创建好两个子模块,分别暴露client接口和相关的类,这种方式也被称为防守型抽取
2.将所有的服务全部抽取到一个新的公共模块,在使用的时候就把这个模块导入进去,这种方式比第一张耦合度高一点
在这里实现一下第二种抽取方式,将client抽取到一个公共模块
在导入依赖方面只需要导入open Feign和loadbalancer依赖即可,如果有其他需求再导入就行了,比如swagger
1.创建一个公共的模块,可以不需要启动类,这个项目主要用于引入到maven,不会启动
2. 导入pom.xml依赖<dependencies><!--open feign--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!-- load balancer--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency><!-- swagger 注解依赖 --><dependency><groupId>io.swagger</groupId><artifactId>swagger-annotations</artifactId><version>1.6.6</version><scope>compile</scope></dependency></dependencies>
3.创建client包和DTO包,之所以要DTO是因为client需要
4. 将模块导入到其他需要调用的服务之中
<!-- api --><dependency><groupId>com.heima</groupId><artifactId>hm-api</artifactId><version>1.0.0</version></dependency>
这样子启动会出问题,springboot无法扫描到client的包,无法创建bean是,使用需要手动扫描client的包,有两种方式
方式一:
方式二:
如果报错找不到依赖和文件,切记看一下api模块是不是缺少了build插件
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions><execution><id>repackage</id><phase>none</phase> <!-- 或者 <goals><goal>repackage</goal></goals> --><configuration><skip>true</skip></configuration></execution></executions></plugin></plugins></build>