1. 程式人生 > >Spring Cloud(Netflix) Feign: 以Dubbo暴露服務的方式使用Feign

Spring Cloud(Netflix) Feign: 以Dubbo暴露服務的方式使用Feign

需求場景

在微服務架構中,服務的請求者以何種方式呼叫遠端服務是一項必須要解決的問題。在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介面而是像呼叫本地方法一樣呼叫遠端服務了。

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