前言
我们在使用SpringCloud进行FeignClient远程调用的时候,一般需要定义两份接口定义(一份在FeignClient里面定义,一份在Controller里面实现),这时候有一种别样的写法可以通过实现定义的FeignService并加上@Controller或者@ReqeustMapping注解,将FeignClient定义的接口单独提取出来,然后依赖直接调用获取结果
话不多说,直接上代码
一、基本接口定义
基本接口定义放在单独的一个maven项目里面,假设定义其为api。
@FeignClient(name = "testFeign", url = "http://127.0.0.1:8080")
public interface LocationFeignService {
@GetMapping("/service/feign/test")
String feignTest(@RequestParam("userName") String userName);
}
二、Feign接口实现
Feign接口项目属于web项目,项目依赖api项目,在本项目里面实现LocationFeignService接口。同时加上@RestController注解。
@Slf4j
@RestController
public class LocationFeignServiceImpl implements LocationFeignService{
@Override
public String feignTest(String userName) {
return "hello:" + userName;
}
}
三、调用方使用
新建一个测试web项目,依赖api项目,并直接使用LocationFeignService的feignTest方法。
@Slf4j
@RestController
public class TestController{
@Autowired
private OrganizationService organizationService;
@GetMapping("/test")
public String test(@RequestParam("name") String name) {
String result = organizationService.feignTest(name);
return result;
}
}
四、测试
我们启动Feign接口项目与测试web项目,假设测试web项目的端口号为8081,此时我们输入地址**【localhost:8081/test?name=小宋】就可以获得结果【hello:小宋】**。
五、解答
这时候很多人估计会问,为什么我实现定义的Feign接口并加上@RestController注解就能作为一个服务启动,并且可以通过调用Feign接口就能获取到结果。
其实在这里我们的LocationFeignServiceImpl类就相当于一个Controller了,Spring在扫描的时候会向这个类的父类或者接口的注解,如果发现了@GetMapping或者@PostMapping等的注解,就会把这个方法认为是一个请求的Handler。这样做的好处在于,我们只需要定义好Feign接口并且定义其请求方式与请求参数,服务方通过实现该接口就可以暴露服务给到别的服务。调用方就可以直接通过Feign接口去获取结果。
总结
这样的使用方法有点类似于Dubbo,但确实使用起来个人觉得还是挺不错的,有意向的小伙伴们不妨来试试哈。