继承特性
前面小节开发的Feign程序,可能有的读者已经观察到很多代码是重复的。在Spring Cloud Feign开发中,能够使用继承特性来帮助我们解决这些代码的重复问题,进一步减少编码量。接下来,我们在上一小节的基础上继续改造,对Feign的继承特性进行介绍。这里,我们需要一个公共工程存放其他服务需要的实体类和接口,这样可以避免在其他服务中编写同样的实体类和接口。后续通过引入公共工程的依赖,从而调用公共工程中的资源。具体开发步骤如下:
1、 新建一个公共工程common-client
使用Spring Initializr方式新建一个名称为common-client的Spring Boot工程,这里将Group命名为com.itheima,将Artifact命名为common-client。
2、新建Module项目dm-common-module
由于本工程的目的是实现资源共享,因此,我们创建好工程后,删除工程common-client中的src文件夹,并新建一个Module项目dm-common-module,将4.2.2小节中的User实体类和FeignService接口及其所在包复制到dm-common-module中,并在pom.xml文件中指定项目的打包方式为jar包形式。中添加打包方式后的部分pom.xml文件代码如下所示。
// 省略部分代码
<groupId>com.itheima</groupId>
<artifactId>dm-common-module</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dm-common-module</name>
3.将Module项目打成jar包到Maven仓库
选择IEDA工具右侧的MAVEN→dm-common-module→Lifecyle,双击Lifecyle中的install进行打包。打包完成后,会在工程dm-common-module的target目录下生成刚刚打包的jar。
4.改造eureka-provider
(1)在pom.xml中,引入dm-common-module工程依赖,代码如所示。
<dependency>
<groupId>com.itheima</groupId>
<artifactId>dm-common-module</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
(2)创建RefactorHelloController类,该类实现了dm-common-module的FeignService接口, FeignService类是一个公共接口,其他类通过继承该接口,从而达到对该类中的资源进行共享。RefactorHelloController类的具体代码如例1所示。
例1 eureka-provider\src\main\java\com\itheima\eurekaprovider\controller\RefactorHelloController.java
1 @RestController
2 public class RefactorHelloController implements FeignService{
3 @Override
4 public String hello(@RequestParam("name") String name){
5 return "Hello "+name;
6 }
7 @Override
8 public User hello(
9 @RequestHeader("name") String name, @RequestHeader("age") Integer
10 age){
11 return new User(name,age);
12 }
13 @Override
14 public String hello(@RequestBody User user){
15 return "Hello "+user.getName()+", "+user.getAge();
16 }
17 }
在例1中,RefactorHelloController类通过实现FeignService接口,所以在类中不再包含以往会定义的请求映射注解@RequestMapping,重写的方法会自动附带@RequestMapping注解功能。在RefactorHelloController类中,除了要实现接口逻辑之外,还需增加@RestController注解使该类成为一个REST接口。
在例1中,第1行代码使用@RestController注解将RefactorHelloController标注为一个Rest接口,RefactorHelloController类通过实现FeignService接口,从而处理不同参数的请求。
3.改造服务消费者eureka-feign-client
(1)在pom.xml中,引入dm-common-module工程依赖,代码如下所示。
<dependency>
<groupId>com.itheima</groupId>
<artifactId>dm-common-module</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
(2)创建RefactorHelloService接口,继承dm-common-module包中的FeignService接口,通过添加@FeignClient注解绑定提供者服务。如例2所示。
例2 eureka-feign-client\src\main\java\com\itheima\eurekafeignclient\RefactorHelloService.java
1 @FeignClient("eureka-provider")
2 public interface RefactorHelloService extends FeignService {
3 }
(3)在FeignController中,注入RefactorHelloService实例,并新增一个feignConsumer()方法,在feignConsumer()方法中,通过refactorHelloService实例调用FeignService接口中的hello()方法,如例3所示。
例3 eureka-feign-client\src\main\java\com\itheima\eurekafeignclient\controller\FeignController.java
1 @RestController
2 public class FeignController {
3 @Autowired
4 FeignService feignService;
5 @Autowired
6 RefactorHelloService refactorHelloService;
7 @RequestMapping(value = "/helloUser",method = RequestMethod.GET)
8 public String HelloUser(){
9 StringBuilder sb=new StringBuilder();
10 sb.append(feignService.hello("czbk")).append("<BR/>");
11 sb.append(feignService.hello(new
12 User("czbk ",30))).append("<BR/>");
13 sb.append(feignService.hello("czbk ",30)).append("<BR/>");
14 return sb.toString();
15 }
16 @RequestMapping(value = "/feign-consumer", method = RequestMethod.GET)
17 public String feignConsumer() {
18 StringBuilder sb = new StringBuilder();
19 sb.append(refactorHelloService.hello("czbk ")).append("<BR/>");
20 sb.append(refactorHelloService.hello("czbk ",
21 30)).append("<BR/>");
22 sb.append(refactorHelloService.hello(new
23 User("czbk ", 30))).append("<BR/>");
24 return sb.toString();
25 }
26 }
注意:
在服务提供者和消费者中导入实体类和FeignService接口的包时要注意导入的是dm-common-module项目下的包。
4.启动服务进行测试
启动应用并查看效果,本次要注意项目的启动顺序。由于eureka-provider和eureka- feign-client都依赖dm-common-module项目中的接口,所以必须先构建dm-common-module工程,然后再构建eureka-provider和eureka-feign-client。依次启动eureka-server, eureka-provider和eureka-feign-client,访问http://localhost: 8764/feign-consumer
,可以查看效果。
上述内容就是我们的Feign继承特性的体现。使用Feign继承特性的优点很明显,可以将公共资源从项目中分离出来,同时配合Maven仓库可以轻易实现资源共享。虽然这种做法减少了工程代码的冗余,但是工程之间的耦合性会变大,如果某个工程的接口发生变化,可能会导致相关联的工程构建失败。