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 {
}
- (7)重启服务,测试
跟参数传递的结果一样
优缺点:
(1)代码简单明了,不易出错,服务端、客户端代码统一,一改惧改;即使优点又是缺点,也提高了服务端、客户端代码的耦合度
(2)9.2参数传递,使用继承之后,代码不变,改怎么传怎么传