Feign服務呼叫
有關Spring Cloud Alibaba之前寫過五篇文章,這篇也是在上面專案的基礎上進行開發。
Spring Cloud Alibaba(2)---RestTemplate微服務專案
Spring Cloud Alibaba(3)---Nacos概述
Spring Cloud Alibaba(4)---Nacos(註冊中心)
Spring Cloud Alibaba(5)---Nacos(配置中心)
Spring Cloud Alibaba(6)---Nacos持久化Mysql8.0版本
Spring Cloud Alibaba(7)---docker-compose搭建nacos1.4.0叢集
因為Feign是由Netflix開發出來,它不屬於spring cloud alibaba 的元件,所以之前在寫spring cloud相關部落格的時候也有寫過。
SpringCloud(6)---熔斷降級理解、Hystrix實戰
一、概念
一個成熟的微服務叢集,內部呼叫必然依賴一個好的RPC框架,比如:基於http協議的Feign,基於私有Tcp協議的dubbo。本文內容介紹Feign。
1、什麼是Feign
Feign是由Netflix開發出來的另外一種實現負載均衡的開源框架,它封裝了Ribbon和RestTemplate,實現了WebService的 面向介面程式設計,進一步的減低了專案的耦合度,
因為它封裝了Riboon和RestTemplate,所以它具有這兩種框架的功能,可以 實現負載均衡和Rest呼叫。
2、為什麼需要Feign
之前已經建立好了訂單微服務,商品微服務,這兩個微服務是互相隔離的,那麼微服務和微服務之間如何互相呼叫呢?
顯然兩個微服務都可以採用http通訊,之前也通過程式碼來實現restTemplate進行互相訪問,但是這種方式對引數傳遞和使用都不是很方便,我們需要配置請求head、body,
然後才能發起請求。獲得響應體後,還需解析等操作,十分繁瑣。採用Feign進行服務之間的呼叫,可以簡化呼叫流程,真正感覺到是在同一個專案中呼叫另一個類的方法的歡快感。
3、Feign優點
1、Feign旨在使程式設計java Http客戶端變得更容易。
2、服務呼叫的時候融合了 Ribbon 技術,所以也支援負載均衡作用。
3、服務呼叫的時候融合了 Hystrix 技術,所以也支援熔斷機制作用。
二、專案搭建
因為我們是通過 訂單服務(mall-order) 調 商品服務(mall-goods),所以商品服務不需要做任何改動,只需在訂單服務(mall-order)新增相關配置
1、pom.xml
<!--引入feign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2、SpringBoot啟動類
新增@EnableDiscoveryClient
註解,開啟Feign支援
//開啟Feign支援
@EnableFeignClients
@SpringBootApplication
public class OrderApplication {
public static void main(String [] args){
SpringApplication.run(OrderApplication.class,args);
}
}
3、GoodsService
這裡其實就是通過介面的方式,填寫商品服務介面資訊
/**
* mall-good s就是商品微服務的 spring.application.name
*/
@FeignClient(value = "mall-goods")
public interface GoodsService {
/**
* /api/v1/goods/findByGoodsId就是商品服務提供的介面,引數也是
*/
@GetMapping("/api/v1/goods/findByGoodsId")
Goods findById(@RequestParam("goodsId") int goodsId);
}
簡單來講這裡就三步
1、介面上新增@FeignClient 註解
2、value指是你要調的服務應用名稱
3、下面提供的介面和引數和你要調的服務提供的介面一致就可以了
4、Controller介面
@RestController
@RequestMapping("api/v1/goods_order")
public class OrderController {
@Autowired
private GoodsService goodsService;
/**
* 通過Feign請求mall-goods服務
*/
@RequestMapping("getGoodsByFeign")
public Object getGoodsByFeign(int goodsId) {
Goods goods = goodsService.findById(goodsId);
return goods;
}
}
這樣是不是也可以明顯看出,訂單服務調商品服務通過Feign就像調內部介面一樣,非常方便。
5、測試
很明顯,請求成功。
三、負載均衡示例
前面說了,Feign融合了 Ribbon 技術,所以也支援負載均衡作用。
1、Ribbon⽀持的負載均衡策略
2、預設負載均衡策略(輪詢)示例
我們先不配置任何負載均衡策略,看預設是採用什麼策略。這裡
mall-order(訂單服務)單機部署埠號:7001
mall-goods(商品服務)叢集部署埠號:6001、6002、6003。
mall-goods服務
1)、新增Controller介面
因為mall-goods是叢集部署的,所以想知道到底是那臺服務那個埠獲取請求
@RestController
@RequestMapping("api/v1/goods")
public class GoodsController {
@Autowired
private GoodsService goodsService;
@RequestMapping("findClusterName")
public Object findClusterName( HttpServletRequest request) {
//獲取是哪個節點被請求
String clusterName = "當前伺服器名稱: " + request.getServerName()+";當前叢集節點埠號: "+ request.getServerPort();
return clusterName;
}
}
mall-order服務
1)、新增Feign介面
@FeignClient(value = "mall-goods")
public interface GoodsService {
/**
* /api/v1/goods/findByGoodsId就是商品服務提供的介面,引數也是
*/
@GetMapping("/api/v1/goods/findClusterName")
String findClusterName();
}
2)新增Controller介面
@RestController
@RequestMapping("api/v1/goods_order")
public class OrderController {
@Autowired
private GoodsService goodsService;
/**
* 通過Feign請求mall-goods服務
*/
@RequestMapping("getClusterName")
public Object findClusterName() {
for (int i = 0; i <10 ; i++) {
System.out.println(goodsService.findClusterName());
}
return "執行結束";
}
}
這裡在for循請求商品服務介面10次, 看下控制檯列印結果
因為我這邊是同一臺伺服器叢集部署多個商品微服務,所以列印出的伺服器名稱都是一樣的。從埠號可以看出 訂單服務是輪詢去請求商品微服務叢集的。
3、修改負載均衡策略(隨機)示例
我們這裡改成 隨機策略,我們只需新增相關配置
@Bean
public IRule loadBalancer(){
return new RandomRule();
}
再重新請求介面
http://localhost:7001/api/v1/goods_order/getClusterName
檢視結果
可以從結果中看出,訂單服務已經變成是隨機請求商品微服務叢集的。
策略選擇
1、如果每個機器配置⼀樣,則建議不修改策略 (也就是輪詢策略)
2、如果部分機器配置強,則可以改為WeightedResponseTimeRule(響應時間加權重策略)
總結
這篇部落格也是比較簡單了來學習了Feign作為服務呼叫,下一篇部落格將會講下 Sentinel。
少說多做,句句都會得到別人的重視;多說少做,句句都會受到別人的忽視。(6)