SpringCloud(三)之Feign實現負載均衡的使用


一 點睛

Feign是Netflix開發的聲明式、模板化的HTTP客戶端, Feign可以幫助我們更快捷、優雅地調用HTTP API。

在Spring Cloud中,使用Feign非常簡單——創建一個接口,並在接口上添加一些注解,代碼就完成了。Feign支持多種注解,例如Feign自帶的注解或者JAX-RS注解等。

Spring Cloud對Feign進行了增強,使Feign支持了Spring MVC注解,並整合了Ribbon和Eureka(在我的前兩篇文章中講過了),從而讓Feign的使用更加方便。

Spring Cloud Feign是基於Netflix feign實現,整合了Spring Cloud Ribbon和Spring Cloud Hystrix,除了提供這兩者的強大功能外,還提供了一種聲明式的Web服務客戶端定義的方式。

Spring Cloud Feign幫助我們定義和實現依賴服務接口的定義。在Spring Cloud feign的實現下,只需要創建一個接口並用注解方式配置它,即可完成服務提供方的接口綁定,簡化了在使用Spring Cloud Ribbon時自行封裝服務調用客戶端的開發量。

Spring Cloud Feign具備可插拔的注解支持,支持Feign注解、JAX-RS注解和Spring MVC的注解。


二,怎么使用 

  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>
* 1、在這里使用的GetMapping注解要和被調用發一致,如果還有問題就用@RequestMapping
* 2、@PathVariable需要設置value,如果不設置也不能成功啟動
   *  注意點   1、路徑
* 2、Http方法必須對應
   * 3、使用requestBody,應該使用@PostMapping
* 4、多個參數的時候,通過@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也有效。

2、超時配置
默認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
寫起來更加思路清晰和方便
采用注解方式進行配置,配置熔斷等方式方便


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM