一 點睛spring
Feign是Netflix開發的聲明式、模板化的HTTP客戶端, Feign能夠幫助咱們更快捷、優雅地調用HTTP API。json
在Spring Cloud中,使用Feign很是簡單——建立一個接口,並在接口上添加一些註解,代碼就完成了。Feign支持多種註解,例如Feign自帶的註解或者JAX-RS註解等。api
Spring Cloud對Feign進行了加強,使Feign支持了Spring MVC註解,並整合了Ribbon和Eureka(在個人前兩篇文章中講過了),從而讓Feign的使用更加方便。restful
Spring Cloud Feign是基於Netflix feign實現,整合了Spring Cloud Ribbon和Spring Cloud Hystrix,除了提供這二者的強大功能外,還提供了一種聲明式的Web服務客戶端定義的方式。app
Spring Cloud Feign幫助咱們定義和實現依賴服務接口的定義。在Spring Cloud feign的實現下,只須要建立一個接口並用註解方式配置它,便可完成服務提供方的接口綁定,簡化了在使用Spring Cloud Ribbon時自行封裝服務調用客戶端的開發量。負載均衡
Spring Cloud Feign具有可插拔的註解支持,支持Feign註解、JAX-RS註解和Spring MVC的註解。dom
二,怎麼使用 ide
1.pom.xml中加入依賴微服務
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.在啓動類中加入註解
@SpringBootApplication
@EnableFeignClients
public class OrderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
3.建立一個接口(ProductClient)
//服務的生成者(被調用者)在註冊中心註冊的名字
@FeignClient(name = "product-service")
public interface ProductClient {
//被調用者對應方法的路由(類和方法上的@RequestMapping)
/**
* 這裏須要注意的兩個地方
* <p>
* 一、在這裏使用的GetMapping註解要和被調用發一致,若是還有問題就用@RequestMapping
* 二、@PathVariable須要設置value,若是不設置也不能成功啓動
* 注意點 一、路徑
* 二、Http方法必須對應
* 三、使用requestBody,應該使用@PostMapping
* 四、多個參數的時候,經過@RequestParam("id") int id)方式調用
*/
@GetMapping("/api/v1/product/find")
String findById(@RequestParam(value = "id") int id);
}
4.在須要的地方注入ProductClient 調用其方法
@Service
public class ProductOrderServiceImpl implements ProductOrderService {
@Autowired
private ProductClient productClient;
@Override
public ProductOrder save(int userId, int productId) {
//經過Feign 調用返回的是字符串幾個使用json轉換工具轉成對象使用
String product = productClient.findById(userId);
JsonNode jsonNode = JsonUtils.stringToNode(product);
ProductOrder productOrder = new ProductOrder();
productOrder.setCreateTime(new Date());
productOrder.setUserId(userId);
productOrder.setTradeNo(UUID.randomUUID().toString());
productOrder.setProductName(jsonNode.get("name").toString());
productOrder.setPrice(Integer.parseInt(jsonNode.get("price").toString()));
return productOrder;
}
}
上面完成了,Feign 也就能夠用了,若是你要配置集羣,測試默認負載策略,和上一篇文章ribbon 如出一轍。
由於Feign整合了ribbon 並且上一篇文章對於ribbon配置負載策略的方法對於Feign也有效。
二、超時配置
默認optons readtimeout是60,可是因爲hystrix默認是1秒超時,因此默認就是1秒 在調用方yml 文件中加入一下配置(1秒足以,除非項目有要求,否則不須要配置)工具
#修改調用超時時間
feign:
client:
config:
default:
connectTimeout: 2000
readTimeout: 2000
spring cloud的Netflix中提供了兩個組件實現軟負載均衡調用:ribbon和feign
3.ribbon和feign兩個的區別和選擇
目前,在Spring cloud 中服務之間經過restful方式調用有兩種方式
- restTemplate+Ribbon
- feign
相同點:
:ribbon和feign都是實現軟負載均衡調用
不一樣點:
ribbon:
是一個基於 HTTP 和 TCP 客戶端的負載均衡器
它能夠在客戶端配置 ribbonServerList(服務端列表),而後默認以輪詢請求以策略實現均衡負載,他是使用能夠用restTemplate+Ribbon 使用
feign:
Spring Cloud Netflix 的微服務都是以 HTTP 接口的形式暴露的,因此能夠用 Apache 的 HttpClient ,而 Feign 是一個使用起來更加方便的 HTTP 客戶端,使用起來就像是調用自身工程的方法,而感受不到是調用遠程方法
選擇 選擇feign 默認集成了ribbon 寫起來更加思路清晰和方便 採用註解方式進行配置,配置熔斷等方式方便