Spring Cloud Feign詮釋

文章參考來源: 司青 的 http://blog.csdn.net/neosmith/article/details/52180852

在微服務架構中,服務的請求者以何種方式調用遠程服務是一項必須要解決的問題。在spring Cloud(Netflix)技術棧中,每個微服務是以HTTP REST接口的形式暴露的,這樣在執行遠程調用時,正常情況下需要使用一個HTTP客戶端,然後向服務發起HTTP請求。實際上,如果使用Netflix的Feign作爲Http Client的話,我們就可以做到像Dubbo一樣,服務的調用者直接調用接口方法調用遠程服務,而不需要通過常規的Http Client構造請求再解析返回數據。

Netflix Feign是一種模板化的Http Client, 即你可以通過編程的方式“製作”模板,然後在發起HTTP請求時就不需要指定URL請求頭請求參數這些累贅的信息了,例如:

@FeignClient(name = "ea")
public interface AdvertGroupRemoteService {

    @RequestMapping(value = "/group/{groupId}")
    AdvertGroupVO findByGroupId(@PathVariable("groupId") Integer adGroupId);
}
上面的代碼中我們聲明瞭一個“模板”(實際是接口),模板中有一個方法findByGroupId, 並通過註解定義了這個方法需要發起的HTTP請求信息(註解與SpringMVC完全相同)。在使用時,我們只需要在調用端的Service中注入AdvertGroupRemoteService就可以 像調用本地方法一樣執行遠程調用了:
@RestController
public class TestCtr {

    @Autowired
    private AdvertGroupRemoteService advertGroupRemoteService;

    public AdvertGroupVO findById(Integer id) {
        return advertGroupRemoteService.findByGroupId(id);
    }
}

正常情況下,應當由服務的調用者使用這個HTTP Client向遠程服務發起請求,但是這樣的壞處是調用者必須對遠程服務的HTTP REST接口非常瞭解。這裏可以變通一下,我們爲每一個微服務創建一個API包,這個包中只有@FeignClient的聲明,然後在服務的調用端通過maven引入該API包,這樣調用者就無需關心實際的REST接口而是像調用本地方法一樣調用遠程服務了。

正如上面實例 advertGroupRemoteService.findByGroupId(id) 語句實際執行可理解問調用的 http://xxxxxx:port/ea/group/123 接口獲取數據。

一個需要注意的地方是,要想讓Spring能自動掃描到@FeignClient接口,必須在Spring Boot的配置類中添加@EnableFeignClients(basePackages = “包名”)註解,否則會導致注入失敗。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章