Spring Cloud(Netflix) Feign: 以Dubbo暴露服務的方式使用Feign
阿新 • • 發佈:2019-01-22
需求場景
在微服務架構中,服務的請求者以何種方式呼叫遠端服務是一項必須要解決的問題。在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
一個需要注意的地方是,要想讓Spring能自動掃描到@FeignClient
介面,必須在Spring Boot
的配置類中新增@EnableFeignClients(basePackages = "包名")
註解,否則會導致注入失敗。