Spring Cloud Alibaba(8)---Feign服務調用


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

很明顯,請求成功。


三、負載均衡示例

前面說了,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)


免責聲明!

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



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