溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

SpringCloud怎么實(shí)現(xiàn)服務(wù)調(diào)用feign、熔斷hystrix和網(wǎng)關(guān)gateway

發(fā)布時(shí)間:2023-04-03 11:50:40 來源:億速云 閱讀:140 作者:iii 欄目:開發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“SpringCloud怎么實(shí)現(xiàn)服務(wù)調(diào)用feign、熔斷hystrix和網(wǎng)關(guān)gateway”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“SpringCloud怎么實(shí)現(xiàn)服務(wù)調(diào)用feign、熔斷hystrix和網(wǎng)關(guān)gateway”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識(shí)吧。

springcloud架構(gòu)的認(rèn)識(shí)

我們之前測(cè)試過eureka服務(wù)注冊(cè)功能,它能很好的保存服務(wù)之間的通訊關(guān)系,是維系微服務(wù)通訊網(wǎng)之間的電話本,同時(shí)也能夠以心跳檢測(cè)的形式監(jiān)聽每一個(gè)微服務(wù)的生命狀態(tài),對(duì)于結(jié)點(diǎn)進(jìn)行很好的監(jiān)控。那么我們今天的服務(wù)調(diào)用就是將接口變得易于管理,更簡(jiǎn)單的去調(diào)用分布式系統(tǒng)內(nèi)的微服務(wù)。而對(duì)于同一時(shí)間大量調(diào)用的某一個(gè)微服務(wù)來說它的壓力是巨大了,但是出于用戶體驗(yàn)的原因,我們必須對(duì)用戶返回什么,對(duì)前端給出一個(gè)響應(yīng),而不是掛出404或者非常慢的響應(yīng)。那么熔斷降級(jí)的處理就是非常合適的做法。另外我們對(duì)于分布式調(diào)用微服務(wù)的形式也應(yīng)、配置一個(gè)類似于nignx之類的主機(jī)進(jìn)行反向的分發(fā)。在我們的cloud生態(tài)立提供了gateway網(wǎng)關(guān)組件去實(shí)現(xiàn)請(qǐng)求的分發(fā)與微服務(wù)路由的管理。

那么就讓我們用上次測(cè)試eureka的項(xiàng)目進(jìn)行測(cè)試:

首先是利用feign組件實(shí)現(xiàn)服務(wù)調(diào)用與熔斷降級(jí)(這里的熔斷可以自行去配置,默認(rèn)是超過1秒沒給出響應(yīng)就返回熔斷的降級(jí)響應(yīng)):

  <!--引入feign服務(wù)調(diào)用-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

以上是feign的依賴,我們之前的項(xiàng)目采取的是父工程pom繼承體系,便于管理公共依賴。

/*開啟服務(wù)調(diào)用Feign的使用*/
@EnableFeignClients

在orderApplication類上打上開啟feign服務(wù)組件的注解。

這里先介紹如何使用feign實(shí)現(xiàn)簡(jiǎn)單的微服務(wù)調(diào)用:

我們需要有接口作為一個(gè)product服務(wù)調(diào)用的客戶端(可以含有很多這樣的客戶端,便于管理不同的微服務(wù)調(diào)用接口)當(dāng)前我們是order模塊:

/*對(duì)應(yīng)調(diào)用的微服務(wù)名稱*/
@FeignClient(name = "product")
public interface FeignInterface {
    /*對(duì)應(yīng)微服務(wù)的訪問路徑*/
    @GetMapping("/product/{id}")
    Product findById(@PathVariable("id")int id);
}

然后我們就可以利用自動(dòng)注入的形式在controller里優(yōu)化接口了:

    @Autowired
    private FeignInterface feignInterface;
    @GetMapping("/buyByFeign/{id}")
    public Product getProductByFeign(@PathVariable("id") int id) {
        return feignInterface.findById(id);
    }

細(xì)心的同志可以看到之前的controller接口是這樣的:

    @Autowired
    private RestTemplate restTemplate;
    @RequestMapping(value = "/buy/{id}", method = RequestMethod.GET)
    public Product getProductById(@PathVariable("id") int id) {
        return restTemplate.getForObject("http://product/product/" + id, Product.class);
    }

兩相對(duì)比,我們發(fā)現(xiàn)feign服務(wù)調(diào)用的形式完全不需要寫任何請(qǐng)求語句,也不需要處理與product微服務(wù)之間的響應(yīng)。瀏覽器訪問時(shí)依舊按照order接口上的路徑去寫即可。

其次介紹一下feign實(shí)現(xiàn)的熔斷:

我們對(duì)某一個(gè)微服務(wù)調(diào)用路線準(zhǔn)備熔斷:舉個(gè)例子,本文主要是order與product模塊之間的調(diào)用關(guān)系,因此熔斷也就是處理從order到product模塊之間的請(qǐng)求路線:

下一個(gè)實(shí)現(xiàn)類去實(shí)現(xiàn)feign服務(wù)調(diào)用接口實(shí)現(xiàn)的方法就是我們的熔斷方法(注意這里開啟熔斷器服務(wù)的注解也需打在orderApplication類上,在下面介紹hystrix時(shí)會(huì)給出來):

@Component("feignHystrix")
public class FeignHystrix implements FeignInterface{
    public Product findById(int id) {
        Product product = new Product();
        product.setId(-1);
        product.setProductName("服務(wù)熔斷");
        return product;
    }
}

要打上spring組件注解交給spring管理,不然跑起來就是一個(gè)沒有實(shí)例化的字節(jié)碼文件,根本用不了。

其次我們需要告訴feign客戶端,你這條調(diào)用線路的熔斷降級(jí)處理類型:

@FeignClient(name = "product",fallback = FeignHystrix.class)
public interface FeignInterface {
    @GetMapping("/product/{id}")
    Product findById(@PathVariable("id")int id);
}

fallback = FeignHystrix.class就是確定熔斷降級(jí)類型的配置。

這樣的方式就可以實(shí)現(xiàn)feign的服務(wù)調(diào)用與熔斷降級(jí)了。但是會(huì)出現(xiàn)直接就是熔斷方法的響應(yīng),原因是在controller層的自動(dòng)注入會(huì)直接默認(rèn)你注入的是接口的實(shí)現(xiàn)類型,這里我們最好是綁定一下name。

其次我們來換一種熔斷處理,也就是利用hystrix去實(shí)現(xiàn)服務(wù)調(diào)用關(guān)系間的熔斷處理:

        <!--引入服務(wù)熔斷hystrix-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
            <version>2.2.10.RELEASE</version>
        </dependency>

以上是它的依賴,hystrix組件用起來也是十分的簡(jiǎn)單,會(huì)對(duì)你的要求進(jìn)行不同的配置,這里本文只展示最基本的使用舉例:

/*開啟熔斷器*/
@EnableCircuitBreaker

記住在Application類上開啟熔斷器才行,基本的使用十分簡(jiǎn)單就是直接在controller接口類里這么寫就可以:

    @Autowired
    private RestTemplate restTemplate;
    @RequestMapping(value = "/buy/{id}", method = RequestMethod.GET)
    @HystrixCommand(fallbackMethod = "getProductFallBack") //給接口配置hystrix熔斷降級(jí)方法
    public Product getProductById(@PathVariable("id") int id) {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            System.out.println("睡兩秒等熔斷");
        }
        return restTemplate.getForObject("http://product/product/" + id, Product.class);
    }
    /*hystrix降級(jí)方法必須與熔斷方法保持一致參數(shù),一致返回類型*/
    public Product getProductFallBack(int id) {
        Product product = new Product();
        product.setId(-1);
        product.setProductName("服務(wù)熔斷");
        return product;
    }

注意這個(gè)降級(jí)的方法是有要求的,參數(shù)類型與返回值要與接口方法一致。你也可以建立一個(gè)新的類型里面統(tǒng)一的書寫降級(jí)方法,調(diào)用時(shí)配置上類型與方法的路徑即可(默認(rèn)是1秒不給響應(yīng)就采取熔斷降級(jí),所以直接開線程睡2秒測(cè)試熔斷響應(yīng))。

注冊(cè)中心與服務(wù)發(fā)現(xiàn)可以使得微服務(wù)之間鴿子能夠查詢到各自的存在,不需要開發(fā)者手動(dòng)的配置各個(gè)微服務(wù)的路由。服務(wù)調(diào)用與熔斷降級(jí)有效的將微服務(wù)之間的調(diào)用與流量的壓力進(jìn)行了管控與優(yōu)化,但是由客戶端或者是瀏覽器發(fā)送來的請(qǐng)求如果還是直接ip加端口加訪問路徑的話,未必就太麻煩了?這樣對(duì)于前端開發(fā)來說也是很大的痛點(diǎn)!所以nignx反向代理很受歡迎,也是采用一個(gè)nignx.conf文件作為內(nèi)部系統(tǒng)服務(wù)接口的通訊錄,外部請(qǐng)求統(tǒng)一ip與端口只需要給我你想要訪問的服務(wù)名稱我就可以幫你通訊。這也就是網(wǎng)關(guān)的基本功能。當(dāng)然如果簡(jiǎn)單的路由分發(fā)nignx完全可以充當(dāng)網(wǎng)關(guān)的角色,這里我們先介紹一下gateway組件的基本使用:

         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

以上是gateway的依賴,我們需要前置知道的是gateway與spring web有沖突,所以最好不要安裝web的依賴,如果和我一樣是父工程pom管理的可以在application.yml文件配置這一項(xiàng)解決沖突:

spring:
  application:
    name: gateway
  main:
    web-application-type: reactive

其次就是網(wǎng)關(guān)的配置信息了(你不需要寫任何類型文件,只需要淺淺的配置一下yml文件):

spring: 
    cloud:
        gateway:
          routes:
          - id: order
            uri: http://127.0.0.1:9002
            predicates:
            - Path=/order/**
          - id: product
            uri: http://127.0.0.1:9001
            predicates:
            - Path=/product/**

這個(gè)routers像極了view項(xiàng)目里我們書寫的router.js里的routes[]數(shù)組的內(nèi)容,微服務(wù)注冊(cè)名稱,微服務(wù)內(nèi)部訪問路徑,微服務(wù)默認(rèn)的訪問入口(這里的入口是controller類型上打的@RequestMapping內(nèi)容,后面的二級(jí)三級(jí)就是我們需要填寫訪問的)舉個(gè)例子(gateway默認(rèn)的端口是8080)我們現(xiàn)在需要訪問order微服務(wù)的buy/1去查1號(hào)商品,之前我們的訪問方式是:http://127.0.0.1:9002/order/buy/1

現(xiàn)在配置完以上的網(wǎng)關(guān)內(nèi)容后我們只需要訪問localhost:8080/order/buy/1(注意這個(gè)order是代表微服務(wù)名稱,也就是你配置的id,可不是controller類型的一級(jí)路由)。

讀到這里,這篇“SpringCloud怎么實(shí)現(xiàn)服務(wù)調(diào)用feign、熔斷hystrix和網(wǎng)關(guān)gateway”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI