解决SpringCloud中多客户端的Feign client代码重复问题的思路
2018-02-24 15:57
483 查看
前言
相信用过Spring Cloud对于Spring Feign并不陌生,但是实际使用过Feign的同学恐怕都会发现多客户端的代码重复问题确实十分恶心,特别是当需要调整接口时,往往牵一发而动全身,本文就这个问题进行讨论,并通过整套实例代码来说明如何解决多个客户端的feign client代码重复问题。调用本地的FeignClient的实例这里就不赘述了,网上资料丰富。
多客户端的基本结构
首先先看一下服务端,客户端的结构。代码实例
服务端
目录结构
DemoApplication
package com.zw.se2.research.feginutil.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.netflix.feign.EnableFeignClients; @SpringBootApplication @EnableDiscoveryClient @EnableFeignClients(basePackages = {"com.zw.se2.research.fegin.utils.client"}) public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
Controller
package com.zw.se2.research.feginutil.demo.ctrl; import com.zw.se2.research.fegin.utils.client.HelloFeignUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class Controller { @Autowired HelloFeignUtil helloFeignUtil; @GetMapping("hello") public String sayHello(){ return helloFeignUtil.hello(); } }
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zw.se2.research.feginUtil</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>demo</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.10.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Edgware.SR2</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> <dependency> <groupId>com.zw.se2.research.fegin.utils</groupId> <artifactId>feginUtilDemo</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
application.properties
server.port=8189 spring.application.name=demo-server eureka.instance.prefer-ip-address=true
bootstrap.yaml
eureka: client: service-url: defaultZone: http://localhost:8797/eureka[/code]客户端
目录结构
Controller
package com.zw.se2.research.fegin.client.demo.ctrl; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class Controller { @GetMapping("/hello") public String sayHello(){ return "hello from client6667"; } }DemoApplication
package com.zw.se2.research.fegin.client.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @EnableDiscoveryClient @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }application.properties
server.port=0 spring.application.name=demo-client eureka.instance.prefer-ip-address=truebootstrap.yaml
eureka: client: service-url: defaultZone: http://localhost:8797/eureka[/code]pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zw.se2.research.fegin.client</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>demo</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.10.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Edgware.SR2</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>抽取的工具类
目录结构
HelloFeignUtil
package com.zw.se2.research.fegin.utils.client; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; /** * Created by ZEW on 2017/7/19. */ @FeignClient("demo-client") public interface HelloFeignUtil { @GetMapping("/hello") String hello(); }pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zw.se2.research.fegin.utils</groupId> <artifactId>feginUtilDemo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>feignUtilDemo</name> <description>Demo project for Spring Boot</description> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-netflix-core</artifactId> <version>1.4.3.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>4.3.14.RELEASE</version> </dependency> </dependencies> </project>注册中心
目录结构
RegisterAndDiscoveryApplication
package com.zw.se2.hy.uav; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @EnableEurekaServer @SpringBootApplication public class RegisterAndDiscoveryApplication { public static void main(String[] args) { SpringApplication.run(RegisterAndDiscoveryApplication.class, args); } }application.properties
server.port=8797 spring.application.name=reborn-register-server eureka.client.fetch-registry=falsebootstrap.yaml
eureka: client: service-url: defaultZone: http://localhost:8797/eureka[/code]pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zw.se2.hy.uav</groupId> <artifactId>register-and-discovery-server</artifactId> <version>1.0-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> <version>1.3.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <version>1.5.4.RELEASE</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.7.5.201505241946</version> <executions> <execution> <id>default-prepare-agent</id> <goals> <goal>prepare-agent</goal> </goals> </execution> <execution> <id>default-prepare-agent-integration</id> <goals> <goal>prepare-agent-integration</goal> </goals> </execution> </executions> </plugin> <!-- tag::plugin[] --> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.4.3</version> <configuration> <imageName>zw/docker_gz_register</imageName> <dockerDirectory>src/main/docker</dockerDirectory> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin> </plugins> </build> </project>总结
关键就是下面这句话@EnableFeignClients(basePackages = {"com.zw.se2.research.fegin.utils.client"})
服务端要指定feign客户端的扫描路径,仔细读说明文档是关键啊。
ps:支持数组的形式。@EnableFeignClients(basePackages = {"com.zw.se2.research.fegin.utils.client1,com.zw.se2.research.fegin.utils.client2,com.zw.se2.research.fegin.utils.client3"})
相关文章推荐
- 通过mongodb客户端samus代码研究解决问题
- 八皇后问题,解决思路和代码
- 重复登录问题解决思路
- 对于新上线的javascript与客户端缓存存在冲突,到时客户端执行的是老代码的问题解决
- 通过mongodb客户端samus代码研究解决问题
- [再加工]XMLSocket(服务器+客户端)代码,包含解决中文问题
- php使用类继承解决代码重复的问题
- android 自定义控件字体,解决字体偏移,卡顿,代码重复等问题
- java 和 C++ Socket通信(java作为服务端server,C++作为客户端client,解决中文乱码问题GBK和UTF8)
- 解决 GitHub For Windows 客户端软件中代码的中文显示乱码问题 (Git/GitHub)
- java 和 C++ Socket通信(java作为服务端server,C++作为客户端client,解决中文乱码问题GBK和UTF8)
- 解决Android中顶部title功能重复问题,减少代码冗余的功能
- android 自定义控件字体,解决字体偏移,卡顿,代码重复等问题
- javascript解决innerText浏览器兼容问题思路代码
- 重构代码解决问题的基本思路
- 利用委托与泛型解决功能代码重复问题
- Android 下拉分页重复数据问题解决思路
- 通过mongodb客户端samus代码研究解决问题
- 程矢Oracle oracle即时客户端Instant Client连接Oracle同时配置解决乱码问题
- java 和 C++ Socket通信(java作为服务端server,C++作为客户端client,解决中文乱码问题GBK和UTF8)