一、背景
一直RPC调用都是使用dubbo接口,近来微服务比较火?开始使用SpringCloud的接口,使用@FeignClient的调用方式。
二、理论
注册中心Eureka,用于服务注册和发现。接口调用的实质就是restful接口,通过spring内部封装的HttpClient方式请求调用。 数据传递使用json格式,所以提供方和调用方的实体参数只要保证字段名称和类型相同即可。
服务提供方,API接口(web controller抽象),参数要使用参数注解@RequestParam,@RequestBody;要指定请求的类型GET,POST等;服务的实现就是@Controller的接口,要implements API接口。
服务调用方的调用方式有三种:
1. 在启动类的注解上标记提供方的package名称,支持配置多个提供方,如下,就可以直接调用接口了
@EnableFeignClients(basePackages = {
"com.yx.test.business.api"
})
2. 在调用方新建接口,extends API接口,并标记为Feign接口,如下,name和path与提供方一致
@FeignClient(name = "yx-test-business", path = "/business/config")
public interface BusinessConfigApi extends BusinessConfigRest {
}
3. 在调用方copy提供方API代码,因为前面说过,使用Json格式传递,只要保证字段一致即不影响
@FeignClient(name = "yx-product-test", path = "/api/product")
public interface BaseProductAPIRepo {
/**
* 根据条件模糊查询产品信息
* @param query 查询条件
* @return
*/
@GetMapping("/blurSearch")
List<ProductDTO> searchByBlur(@RequestBody QueryProductDTO query);
}
三、实践
1. 服务提供方接口
@FeignClient(name = "yx-test-business", path = "/business/config")
public interface BusinessConfigRest {
@GetMapping("/getRatio")
YstResult<Double> getRatio(@RequestParam("activityType") String activityType);
}
2. 服务提供实现
@RestController
@Slf4j
@RequestMapping("/business/config")
public class BusinessConfigController extends AbstractBaseController implements BusinessConfigRest {
@Override
public BaseResult<Double> getRatio(@RequestParam("activityType") String activityType) {
// 接口逻辑
}
3. 调用方使用如开始提到的【二、理论 3. 服务调用方的调用方式有三种】
需要注意的是:
1. 启动类要加如下注解
@EnableDiscoveryClient
@EnableFeignClients
2. 要配置注册中心eureka【深入学习后再总结】
3. 三种调用方式其实都是在解决一个问题,接口的@Autowired
四、总结
使用下来,你会发现,所谓的Feign接口,本质上就是http调用,只不过是把以往web层形式的接口,用在了api层,并且封装了httpClient方法,不用自己去调用,而通过配置约定的@Feign注解的方式实现调用。