Spring Cloud 学习笔记 —— OpenFeign 继承特性

9.4 OpenFeign 继承特性

参数传递的章节中,我们可以看到 provider 的 HelloController 接口和 openfeign 的 HelloService 接口,两者高度重合,能不能把公用的提取出来呢?答案是可以使用继承特性

  • (1)在 javaboycloud 中新建一个 module,叫 hello-api,要用到 Spring MVC 中的东西,所以要引入 Web 依赖
    在这里插入图片描述
    在这里插入图片描述
  • (2)引入合适 Spring MVC 依赖和公用 commons 依赖,commons 中定义了 User 的 POJO 类
    在这里插入图片描述
		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.2.10.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.javaboy</groupId>
            <artifactId>commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

(3)定义一个接口 IUserService,涵盖 provider 和 openFeign 中的内容

public interface IUserService {
    @RequestMapping("/hello")
    String hello();

    @GetMapping("/hello2")
    String hello2(@RequestParam("name") String name);

    @PostMapping("/user2")
    User addUser2(@RequestBody User user);

    @DeleteMapping("/user2/{id}")
    void deleteUser2(@PathVariable("id") Integer id);

    @GetMapping("/user3")
    void getUserByName(@RequestHeader("name") String name) throws UnsupportedEncodingException;
}
  • (4)在 provider 和 openfeign 服务的 pom.xml 引入 hello-api 依赖
    在这里插入图片描述
    在这里插入图片描述
  • (5)在 provider 中原有的 HelloService 实现 hello-api 中的 IUserService 接口,可以删除相关注解,因为在 IUserService 中已经定义
    原来
@RestController
public class HelloController{
    @Value("${server.port}")
    Integer port;
    @RequestMapping("/hello")
    public String hello(){
        return "hello   " + port;
    }
    @GetMapping("/hello2")
    public String hello2(String name){
        System.out.println(new Date() + ">>> " + name);
        return "hello" + name;
    }
    @PostMapping("/user2")
    public User addUser2(@RequestBody User user){
        return user;
    }
    @DeleteMapping("/user2/{id}")
    public void deleteUser2(@PathVariable Integer id){
        System.out.println(id);
    }
    @GetMapping("/user3")
    public void getUserByName(@RequestHeader("name") String name) throws UnsupportedEncodingException {
        System.out.println(URLDecoder.decode(name,"UTF-8"));
    }
}

实现 IUserService 接口后

@RestController
public class HelloController implements IUserService{
    @Value("${server.port}")
    Integer port;
    @Override
    public String hello(){
        
        return "hello   " + port;
    }
    @Override
    public String hello2(String name){
        System.out.println(new Date() + ">>> " + name);
        return "hello" + name;
    }
    @Override
    public User addUser2(@RequestBody User user){
        return user;
    }
    @Override
    public void deleteUser2(@PathVariable Integer id){
        System.out.println(id);
    }
    @Override
    public void getUserByName(@RequestHeader("name") String name) throws UnsupportedEncodingException {
        System.out.println(URLDecoder.decode(name,"UTF-8"));
    }
  • (6)openfeign 服务的 HelloService 接口继承 IUserService 接口
    原来
@FeignClient(value = "provider")
public interface HelloService {
    @RequestMapping("/hello")
    String hello();

    @GetMapping("/hello2")
    String hello2(@RequestParam("name") String name);

    @PostMapping("/user2")
    User addUser2(@RequestBody User user);

    @DeleteMapping("/user2/{id}")
    void deleteUser2(@PathVariable("id") Integer id);

    @GetMapping("/user3")
    void getUserByName(@RequestHeader("name") String name) throws UnsupportedEncodingException;

}

继承 IUserService 接口后 ^_^:

@FeignClient(value = "provider")
public interface HelloService extends IUserService {

}

优缺点:

(1)代码简单明了,不易出错,服务端、客户端代码统一,一改惧改;即使优点又是缺点,也提高了服务端、客户端代码的耦合度
(2)9.2参数传递,使用继承之后,代码不变,改怎么传怎么传

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值