在使用 RestTemplate 實現 Rest API 調用的時候,是經過拼接字符串的方式構造 URL,向具體服務實例發起 Http 請求。在定義 RestTemplate 的時候,還能夠增長 @LoadBalanced
註解,在調用服務接口的時候,原來 host 部分是經過手動拼接ip和端口的,如今直接用 服務名 來寫請求路徑。在真正調用的時候,Spring Cloud 會將請求攔截下來,而後經過負載均衡器(如 Ribbon)選出節點,並替換服務名部分爲具體的ip和端口,從而實現基於服務名的負載均衡調用,相關見 Spring Cloud 服務消費(Ribbon)java
以上的方式能夠實現負載均衡調用,可是因爲每一個調用都要拼接 URL,傳遞的參數也須要放在 URL 中,這樣的開發體驗是很很差的,比較低效且難以維護。可使用 Feign 實現聲明式 REST 調用git
Feign 是 Netflix 的一套的聲明式服務調用客戶端。它使得編寫Web服務客戶端變得更加簡單。咱們只須要經過建立接口並用註解來配置它便可。它具有可插拔的註解支持,包括Feign註解和JAX-RS註解。支持可插拔編碼器和解碼器。Spring Cloud 對 Feign 進行了加強,擴展了對Spring MVC 註解的支持,並整合了 Ribbon 和 Eureka 來提供均衡負載的 HTTP 客戶端實現。github
咱們利用以前的例子(見 Spring Cloud 服務消費(Ribbon)),eureka-server
做爲服務註冊中心、product-service
做爲服務提供者,order-service-ribbon
是服務消費者。複製 order-service-ribbon
爲 order-service-feign
,在 order-service-feign
上去作一些更改spring
添加 Feign 的依賴app
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
修改啓動類,添加 @EnableFeignClients
註解負載均衡
@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients public class OrderServiceFeignApplication { public static void main(String[] args) { SpringApplication.run(OrderServiceFeignApplication.class, args); } }
建立 Feign 接口,添加 @FeignClient
註解編碼
@FeignClient("product-service") public interface ProductFeignClient { @GetMapping("/product/{id}") Product getProduct(@PathVariable Long id); }
調用 Feign 接口code
@RestController @Log4j2 public class ProductController { @Autowired private ProductFeignClient productFeignClient; @GetMapping("/product/{id}") public Product getProduct(@PathVariable Long id) { return productFeignClient.getProduct(id); } }
啓動 eureka-server、product-service:807一、product-service:807二、order-service-feign,訪問 http://localhost:8081/product/1 能夠查看結果server
示例代碼:demoxml