学科分类
目录
Spring Cloud

继承特性

前面小节开发的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仓库可以轻易实现资源共享。虽然这种做法减少了工程代码的冗余,但是工程之间的耦合性会变大,如果某个工程的接口发生变化,可能会导致相关联的工程构建失败。

点击此处
隐藏目录