@FeignClient的别样用法

前言

我们在使用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,但确实使用起来个人觉得还是挺不错的,有意向的小伙伴们不妨来试试哈。

你可能感兴趣的:(java,spring,boot,spring,cloud)