Spring Cloud Alibaba(8)---Feign服務呼叫

雨點的名字發表於2021-05-11

Feign服務呼叫

有關Spring Cloud Alibaba之前寫過五篇文章,這篇也是在上面專案的基礎上進行開發。

Spring Cloud Alibaba(1)---入門篇

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(5)---Feign服務呼叫

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、測試

Spring Cloud Alibaba(8)---Feign服務呼叫

很明顯,請求成功。


三、負載均衡示例

前面說了,Feign融合了 Ribbon 技術,所以也支援負載均衡作用。

1、Ribbon⽀持的負載均衡策略

Spring Cloud Alibaba(8)---Feign服務呼叫

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次, 看下控制檯列印結果

Spring Cloud Alibaba(8)---Feign服務呼叫

因為我這邊是同一臺伺服器叢集部署多個商品微服務,所以列印出的伺服器名稱都是一樣的。從埠號可以看出 訂單服務是輪詢去請求商品微服務叢集的

3、修改負載均衡策略(隨機)示例

我們這裡改成 隨機策略,我們只需新增相關配置

 @Bean
    public IRule loadBalancer(){
        return new RandomRule();
    }

再重新請求介面

http://localhost:7001/api/v1/goods_order/getClusterName

檢視結果

Spring Cloud Alibaba(8)---Feign服務呼叫

可以從結果中看出,訂單服務已經變成是隨機請求商品微服務叢集的。

策略選擇

1、如果每個機器配置⼀樣,則建議不修改策略 (也就是輪詢策略) 
2、如果部分機器配置強,則可以改為WeightedResponseTimeRule(響應時間加權重策略)

總結 這篇部落格也是比較簡單了來學習了Feign作為服務呼叫,下一篇部落格將會講下 Sentinel。



少說多做,句句都會得到別人的重視;多說少做,句句都會受到別人的忽視。(6)

相關文章