简介
feign
对微服务之间的http
调用做了一层封装,如果B项目想调用A项目的一个web服务,只需要编写对应的接口并标注FeignClient
注解。但如果接口发生了变更,对应的Feign
代码往往会忘记修改,而且问题往往在服务启动之后才能发现。
feign-maven-plugin
根据当前项目的jar
包,自动生成对应feign
部分的代码,并install
到本地仓库。使用时,只需要在pom.xml
中添加对应的依赖,在项目中继承自动生成的Feign
接口,添加FeignClient
注解即可。
如何使用
生成feign工程并添加依赖
在你需要生成对应feign
代码的项目pom.xml
文件中添加以下配置。我们暂且称其为feign
源工程,根据源工程生成feign
工程,我们会在feign
使用工程中调用feign
工程中的代码。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.github.dewxin</groupId>
<artifactId>feign-maven-plugin</artifactId>
<version>1.0.0</version><!-- 使用最新版本 -->
<executions>
<execution>
<goals>
<goal>feign</goal>
</goals>
<phase>package</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
注意:此处<plugin>
标签需要放置在spring-boot-maven-plugin
之后。
在项目根目录,使用mvn packge
对项目进行打包。控制台输出观察到以下日志则表示生成的feign
工程已经install
到本地仓库。
[INFO] [INFO] ------------------------------------------------------------------------
[INFO] [INFO] BUILD SUCCESS
[INFO] [INFO] ------------------------------------------------------------------------
[INFO] [INFO] Total time: 3.944 s
[INFO] [INFO] Finished at: 2020-12-08T20:09:55+08:00
[INFO] [INFO] ------------------------------------------------------------------------
[INFO] <<< <<< finish phase maven-install <<< <<<
假如feign
源工程的pom
部分配置如下:
<groupId>source-groupId</groupId>
<artifactId>source-artifactId</artifactId>
<version>1.0.2</version>
那么生成的feign
工程对应pom
配置会是这样:除了artifactId
根据原有的值添加-feign
后缀外,其余的部分不发生改变。
<groupId>source-groupId</groupId>
<artifactId>source-artifactId-feign</artifactId>
<version>1.0.2</version>
在feign
使用工程中 只需要添加如下的依赖即可以使用,需要注意的是生成的feign
工程会被install
到本地仓库。
<dependency>
<groupId>source-groupId</groupId>
<artifactId>source-artifactId-feign</artifactId>
<version>1.0.2</version>
</dependency>
如果你在application.properties
中配置的spring.application.name
的值为SERVICE-SOURCE
,SOURCE-SERVICE
,source
,SOURCE
中的任意一个,那么生成对应feign接口的名字则为SourceClient
。
import com.github.dewxin.generated.auto_client.SourceClient;
@FeignClient(value="SERVICE-SOURCE", contextId = "feign")
public interface SourceFeignClient extends SourceClient {
}
此处需要添加 contextId
,否则的话feign
会生成两个同名的bean
。