目录

  • 前言
  • Spring Cloud Feign继承
  • 创建Feign 接口api服务
  • 创建服务提供者
  • 创建服务消费者
  • 另一种方式


前言

Spring Cloud系列文章大多是有联系的,最好是从第一篇开始看起

Spring Cloud系列: 点击查看Spring Cloud系列文章


Spring Cloud Feign继承

Feign 的继承特性可以让服务的接口定义单独抽出来,作为公共的依赖,实现代码的共享,减少跨服务调用服务编写的问题,方便使用。



创建Feign 接口api服务

1、创建一个 Maven 项目 feign-inherit-api,用于存放 API 接口的定义,增加 Feign 的依赖,代码如下所示。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2、定义接口,指定服务名称,代码如下所示。

@FeignClient("feign-inherit-provide")
public interface UserRemoteClient {
    @GetMapping("/user/name")
    String getName();
}



创建服务提供者

1、创建一个服务提供者工程 feign-inherit-provide,引入 feign-inherit-api(即api服务),代码如下所示。

<dependency>
    <groupId>net.biancheng</groupId>
    <artifactId>feign-inherit-api</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

2、创建一个Controller类,实现 UserRemoteClient 接口,即接口的具体实现是在服务提供工程中实现的,代码如下所示。

@RestController
public class DemoController implements UserRemoteClient {
    @Override
    public String getName() {
        return "zhangsan";
    }
}

注:实现了UserRemoteClient 接口当然就要实现UserRemoteClient 接口中的方法。不同的是我这里不需要在方法上面添加@GetMapping注解,这些注解在父接口中都有,不过在Controller上还是要添加@RestController注解,另外需要注意的是,方法中的参数@RequestHeader和@RequestBody注解还是要添加,@RequestParam注解可以不添加。

创建服务消费者

创建一个服务消费者 feign-inherit-consume,同样需要引入 feign-inherit-api 用于调用 feign-inherit-provide 提供的 /user/name 接口

1、引入依赖

<dependency>
    <groupId>net.biancheng</groupId>
    <artifactId>feign-inherit-api</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

2、直接注入UserRemoteClient进行调用

@RestController
public class DemoController {
    @Autowired
    private UserRemoteClient userRemoteClient;
    @GetMapping("/call")
    public String callHello() {
        String result = userRemoteClient.getName();
        System.out.println("getName调用结果:" + result);
    }
}

另一种方式

其实还有一种方式,我们可以不在api工程指定服务,而在消费者指定服务,如下

1、api工程定义接口

public interface UserRemoteClient {
    @GetMapping("/user/name")
    String getName();
}

注意:定义的是普通接口,而不是feign接口



2、导入api依赖,在服务提供者工程实现接口

@RestController
public class DemoController implements UserRemoteClient {
    @Override
    public String getName() {
        return "zhangsan";
    }
}



3、消费者工程导入api依赖,创建RefactorUserService,继承feign-interface-api的UserRemoteClient 接口,然后添加@FeignClient来绑定服务,如下:

@FeignClient(value = "feign-interface-provide")
public interface RefactorUserService extends  UserRemoteClient {
    
}

注:这个接口中不需要添加任何方法,方法都在父接口中,这里只需要在类上面添加@FeignClient(“feign-interface-provide”)注解来绑定服务即可。

在需要使用的地方,注入RefactorUserService实例进行调用

@RestController
public class DemoController {
    @Autowired
    private RefactorUserService  userRemoteClient;
    @GetMapping("/call")
    public String callHello() {
        String result = userRemoteClient.getName();
        System.out.println("getName调用结果:" + result);
    }
}