在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/Java/ 聲明式調(diào)用Feign是如何匹配接口的?

聲明式調(diào)用Feign是如何匹配接口的?

在Feign的Service添加了FeignCLient(name = "XXX-SERVICE"),定義好了接口之后,F(xiàn)eign是通過(guò)什么方式找到服務(wù)提供者的接口的?是通過(guò)RequestMapping中的value嗎?

回答
編輯回答
嘟尛嘴

如果題主的『如何』指的是如何使用 Feign 通過(guò)聲明式的注解,提供一個(gè)供其它服務(wù)調(diào)用的 Client。

這里先舉個(gè)例子說(shuō)明:
在一個(gè) Spring Cloud 項(xiàng)目中,你通過(guò)如下代碼聲明一個(gè)服務(wù):

1. 配置文件 bootstrap.yml:

spring:
  application:
    name: mock-service

2. Endpoint 定義文件 MockController:

@RestController
public class MockController {

    @GetMapping(value = "/mocks")
    public ResponseObj getMethod() {

        ResponseObj responseObj = new ResponseObj();
        responseObj.setRetCode(ResponseObj.CODE_SUCCESS);
        responseObj.setRetMsg("獲取對(duì)象");
        return responseObj;

    }

    @PutMapping(value = "/mocks")
    public ResponseObj modifyMethod(@RequestBody MockReq mockReq) {

        ResponseObj responseObj = new ResponseObj();
        responseObj.setRetCode(ResponseObj.CODE_SUCCESS);
        responseObj.setRetMsg("修改對(duì)象: "+ mockReq.getMessage());
        return responseObj;

    }

    @PostMapping(value = "/mocks")
    public ResponseObj addMethod(@RequestBody MockReq mockReq) {

        ResponseObj responseObj = new ResponseObj();
        responseObj.setRetCode(ResponseObj.CODE_SUCCESS);
        responseObj.setRetMsg("增加對(duì)象: " + mockReq.getMessage());
        return responseObj;

    }

    @DeleteMapping(value = "/mocks")
    public ResponseObj deleteMethod(@RequestBody MockReq mockReq) {

        ResponseObj responseObj = new ResponseObj();
        responseObj.setRetCode(ResponseObj.CODE_SUCCESS);
        responseObj.setRetMsg("刪除對(duì)象: "+ mockReq.getMessage());
        return responseObj;

    }
}

3. Feign Client 定義文件 MockClient.java:

@FeignClient(value = "mock-service")
public interface MockClient {

    @GetMapping(value = "/mocks")
    ResponseObj getMethod();

    @PostMapping(value = "/mocks")
    ResponseObj postMethod(@RequestBody MockReq mockReq);

    @PutMapping(value = "/mocks")
    ResponseObj putMethod(@RequestBody MockReq mockReq);

    @DeleteMapping(value = "/mocks")
    ResponseObj deleteMethod(@RequestBody MockReq mockReq);

}

由 1、2、3 得出結(jié)論,F(xiàn)eign 提供的是對(duì) 特定服務(wù) > 特定接口 的聲明式定義。換言之,也就是先找到服務(wù),然后尋找服務(wù)里的接口。

如果題主中的『如何』指的是:上述調(diào)用方如何找到 mock-service 服務(wù)。在 Spring Cloud Netflix 中,Eureka Server (注冊(cè)中心)負(fù)責(zé)服務(wù)注冊(cè)與發(fā)現(xiàn),同一個(gè)注冊(cè)中心中的服務(wù)可以通過(guò) Feign 進(jìn)行聲明式調(diào)用。其原理是通過(guò)注解,把請(qǐng)求模板化。當(dāng)請(qǐng)求參數(shù)傳進(jìn)來(lái)的時(shí)候,會(huì)把參數(shù)填充到模板中去,然后調(diào)用類似于下面?zhèn)未a:

ResponseObj responseObj = HttpClient.getObj(mockReq, 'http://api.example.com/mocks', ResponseObj.class);

可以看成是一個(gè)遠(yuǎn)程方法調(diào)用,其中 HttpEncoder 和 HttpDecoder 等其它細(xì)節(jié),不詳細(xì)展開(kāi)。

2017年6月4日 14:50
編輯回答
陌如玉

我個(gè)人的理解是FeignClient中的接口名稱的定義與服務(wù)提供者中的controller中的接口名稱一致,就實(shí)現(xiàn)了Feign接口與被調(diào)用服務(wù)的接口的捆綁。

不知道這樣的理解對(duì)不對(duì)?

2018年3月6日 09:29