1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        openFeign奪命連環(huán)9問(wèn),這誰(shuí)受得了?

        共 14507字,需瀏覽 30分鐘

         ·

        2021-09-26 15:29

        1、前言

        前面介紹了Spring Cloud 中的靈魂擺渡者Nacos,和它的前輩們相比不僅僅功能強(qiáng)大,而且部署非常簡(jiǎn)單。

        今天介紹一款服務(wù)調(diào)用的組件:OpenFeign,同樣是一款超越先輩(Ribbon、Feign)的狠角色。

        文章目錄如下:

        2、Feign是什么?

        Feign也是一個(gè)狠角色,F(xiàn)eign旨在使得Java Http客戶(hù)端變得更容易。

        Feign集成了Ribbon、RestTemplate實(shí)現(xiàn)了負(fù)載均衡的執(zhí)行Http調(diào)用,只不過(guò)對(duì)原有的方式(Ribbon+RestTemplate)進(jìn)行了封裝,開(kāi)發(fā)者不必手動(dòng)使用RestTemplate調(diào)服務(wù),而是定義一個(gè)接口,在這個(gè)接口中標(biāo)注一個(gè)注解即可完成服務(wù)調(diào)用,這樣更加符合面向接口編程的宗旨,簡(jiǎn)化了開(kāi)發(fā)。

        但遺憾的是Feign現(xiàn)在停止迭代了,當(dāng)然現(xiàn)在也是有不少企業(yè)在用。

        有想要學(xué)習(xí)Feign的讀者可以上spring Cloud官網(wǎng)學(xué)習(xí),陳某這里也不再詳細(xì)介紹了,不是今天的重點(diǎn)。

        3、openFeign是什么?

        前面介紹過(guò)停止迭代的Feign,簡(jiǎn)單點(diǎn)來(lái)說(shuō):OpenFeign是springcloud在Feign的基礎(chǔ)上支持了SpringMVC的注解,如@RequestMapping等等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通過(guò)動(dòng)態(tài)代理的方式產(chǎn)生實(shí)現(xiàn)類(lèi),實(shí)現(xiàn)類(lèi)中做負(fù)載均衡并調(diào)用其他服務(wù)。

        官網(wǎng)地址:https://docs.spring.io/spring-cloud-openfeign/docs/2.2.10.BUILD-SNAPSHOT/reference/html

        4、Feign和openFeign有什么區(qū)別?

        FeignopenFiegn
        Feign是SpringCloud組件中一個(gè)輕量級(jí)RESTful的HTTP服務(wù)客戶(hù)端,F(xiàn)eign內(nèi)置了Ribbon,用來(lái)做客戶(hù)端負(fù)載均衡,去調(diào)用服務(wù)注冊(cè)中心的服務(wù)。Feign的使用方式是:使用Feign的注解定義接口,調(diào)用這個(gè)接口,就可以調(diào)用服務(wù)注冊(cè)中心的服務(wù)OpenFeign 是SpringCloud在Feign的基礎(chǔ)上支持了SpringMVC的注解,如@RequestMapping等。OpenFeign 的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通過(guò)動(dòng)態(tài)代理的方式產(chǎn)生實(shí)現(xiàn)類(lèi),實(shí)現(xiàn)類(lèi)中做負(fù)載均衡并調(diào)用其他服務(wù)。

        5、環(huán)境準(zhǔn)備

        本篇文章Spring Cloud版本、JDK環(huán)境、項(xiàng)目環(huán)境均和上一篇Nacos的環(huán)境相同:五十五張圖告訴你微服務(wù)的靈魂擺渡者Nacos究竟有多強(qiáng)?

        注冊(cè)中心就不再使用Eureka了,直接使用Nacos作為注冊(cè)和配置中心,有不會(huì)的可以查看Nacos文章。

        本篇文章搭建的項(xiàng)目結(jié)構(gòu)如下圖:

        注冊(cè)中心使用Nacos,創(chuàng)建個(gè)微服務(wù),分別為服務(wù)提供者Produce,服務(wù)消費(fèi)者Consumer。

        6、創(chuàng)建服務(wù)提供者

        既然是微服務(wù)之間的相互調(diào)用,那么一定會(huì)有服務(wù)提供者了,創(chuàng)建openFeign-provider9005,注冊(cè)進(jìn)入Nacos中,配置如下:

        server:
          port: 9005
        spring:
          application:
            ## 指定服務(wù)名稱(chēng),在nacos中的名字
            name: openFeign-provider
          cloud:
            nacos:
              discovery:
                # nacos的服務(wù)地址,nacos-server中IP地址:端口號(hào)
                server-addr: 127.0.0.1:8848
        management:
          endpoints:
            web:
              exposure:
                ## yml文件中存在特殊字符,必須用單引號(hào)包含,否則啟動(dòng)報(bào)錯(cuò)
                include: '*'

        注意:此處的spring.application.name指定的名稱(chēng)將會(huì)在openFeign接口調(diào)用中使用。

        項(xiàng)目源碼都會(huì)上傳,關(guān)于如何注冊(cè)進(jìn)入Nacos,添加什么依賴(lài)源碼都會(huì)有,結(jié)合陳某上篇Nacos文章,這都不是難事!

        7、創(chuàng)建服務(wù)消費(fèi)者

        新建一個(gè)模塊openFeign-consumer9006作為消費(fèi)者服務(wù),步驟如下。

        1、添加依賴(lài)

        除了Nacos的注冊(cè)中心的依賴(lài),還要添加openFeign的依賴(lài),如下:

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

        2、添加注解@EnableFeignClients開(kāi)啟openFeign功能

        老套路了,在Spring boot 主啟動(dòng)類(lèi)上添加一個(gè)注解@EnableFeignClients,開(kāi)啟openFeign功能,如下:

        @SpringBootApplication
        @EnableDiscoveryClient
        @EnableFeignClients
        public class OpenFeignConsumer9006Application
        {
            public static void main(String[] args) {
                SpringApplication.run(OpenFeignConsumer9006Application.classargs);
            }
        }

        3、新建openFeign接口

        新建一個(gè)openFeign接口,使用@FeignClient注解標(biāo)注,如下:

        @FeignClient(value = "openFeign-provider")
        public interface OpenFeignService {
        }

        注意:該注解@FeignClient中的value屬性指定了服務(wù)提供者在nacos注冊(cè)中心的服務(wù)名。

        4、新建一個(gè)Controller調(diào)試

        新建一個(gè)controller用來(lái)調(diào)試接口,直接調(diào)用openFeign的接口,如下:

        @RestController
        @RequestMapping("/openfeign")
        public class OpenFeignController {
            
        }

        好了,至此一個(gè)openFeign的微服務(wù)就搭建好了,并未實(shí)現(xiàn)具體的功能,下面一點(diǎn)點(diǎn)實(shí)現(xiàn)。

        8、openFeign如何傳參?

        開(kāi)發(fā)中接口傳參的方式有很多,但是在openFeign中的傳參是有一定規(guī)則的,下面詳細(xì)介紹。

        1、傳遞JSON數(shù)據(jù)

        這個(gè)也是接口開(kāi)發(fā)中常用的傳參規(guī)則,在Spring Boot 中通過(guò)@RequestBody標(biāo)識(shí)入?yún)ⅰ?/p>

        provider接口中JSON傳參方法如下:

        @RestController
        @RequestMapping("/openfeign/provider")
        public class OpenFeignProviderController {
            @PostMapping("/order2")
            public Order createOrder2(@RequestBody Order order){
                return order;
            }
        }

        consumer中openFeign接口中傳參代碼如下:

        @FeignClient(value = "openFeign-provider")
        public interface OpenFeignService {
            /**
             * 參數(shù)默認(rèn)是@RequestBody標(biāo)注的,這里的@RequestBody可以不填
             * 方法名稱(chēng)任意
             */

            @PostMapping("/openfeign/provider/order2")
            Order createOrder2(@RequestBody Order order);
        }

        注意:openFeign默認(rèn)的傳參方式就是JSON傳參(@RequestBody),因此定義接口的時(shí)候可以不用@RequestBody注解標(biāo)注,不過(guò)為了規(guī)范,一般都填上。

        2、POJO表單傳參

        這種傳參方式也是比較常用,參數(shù)使用POJO對(duì)象接收。

        provider服務(wù)提供者代碼如下:

        @RestController
        @RequestMapping("/openfeign/provider")
        public class OpenFeignProviderController {
            @PostMapping("/order1")
            public Order createOrder1(Order order){
                return order;
            }
        }

        consumer消費(fèi)者openFeign代碼如下:

        @FeignClient(value = "openFeign-provider")
        public interface OpenFeignService {
            /**
             * 參數(shù)默認(rèn)是@RequestBody標(biāo)注的,如果通過(guò)POJO表單傳參的,使用@SpringQueryMap標(biāo)注
             */

            @PostMapping("/openfeign/provider/order1")
            Order createOrder1(@SpringQueryMap Order order);
        }

        網(wǎng)上很多人疑惑POJO表單方式如何傳參,官方文檔明確給出了解決方案,如下:

        openFeign提供了一個(gè)注解@SpringQueryMap完美解決POJO表單傳參。

        3、URL中攜帶參數(shù)

        此種方式針對(duì)restful方式中的GET請(qǐng)求,也是比較常用請(qǐng)求方式。

        provider服務(wù)提供者代碼如下:

        @RestController
        @RequestMapping("/openfeign/provider")
        public class OpenFeignProviderController {

            @GetMapping("/test/{id}")
            public String test(@PathVariable("id")Integer id){
                return "accept one msg id="+id;
        }

        consumer消費(fèi)者openFeign接口如下:

        @FeignClient(value = "openFeign-provider")
        public interface OpenFeignService {

            @GetMapping("/openfeign/provider/test/{id}")
            String get(@PathVariable("id")Integer id);
        }

        使用注解@PathVariable接收url中的占位符,這種方式很好理解。

        4、普通表單參數(shù)

        此種方式傳參不建議使用,但是也有很多開(kāi)發(fā)在用。

        provider服務(wù)提供者代碼如下:

        @RestController
        @RequestMapping("/openfeign/provider")
        public class OpenFeignProviderController {
            @PostMapping("/test2")
            public String test2(String id,String name){
                return MessageFormat.format("accept on msg id={0},name={1}",id,name);
            }
        }

        consumer消費(fèi)者openFeign接口傳參如下:

        @FeignClient(value = "openFeign-provider")
        public interface OpenFeignService {
            /**
             * 必須要@RequestParam注解標(biāo)注,且value屬性必須填上參數(shù)名
             * 方法參數(shù)名可以任意,但是@RequestParam注解中的value屬性必須和provider中的參數(shù)名相同
             */

            @PostMapping("/openfeign/provider/test2")
            String test(@RequestParam("id") String arg1,@RequestParam("name") String arg2);
        }

        5、總結(jié)

        傳參的方式有很多,比如文件傳參.....陳某這里只是列舉了四種常見(jiàn)得傳參方式。

        9、超時(shí)如何處理?

        想要理解超時(shí)處理,先看一個(gè)例子:我將provider服務(wù)接口睡眠3秒鐘,接口如下:

        @PostMapping("/test2")
        public String test2(String id,String name) throws InterruptedException {
                Thread.sleep(3000);
                return MessageFormat.format("accept on msg id={0},name={1}",id,name);
        }

        此時(shí),我們調(diào)用consumer的openFeign接口返回結(jié)果如下圖:

        很明顯的看出程序異常了,返回了接口調(diào)用超時(shí)。what?why?...........

        openFeign其實(shí)是有默認(rèn)的超時(shí)時(shí)間的,默認(rèn)分別是連接超時(shí)時(shí)間10秒、讀超時(shí)時(shí)間60秒,源碼在feign.Request.Options#Options()這個(gè)方法中,如下圖:

        那么問(wèn)題來(lái)了:為什么我只設(shè)置了睡眠3秒就報(bào)超時(shí)呢?

        其實(shí)openFeign集成了Ribbon,Ribbon的默認(rèn)超時(shí)連接時(shí)間、讀超時(shí)時(shí)間都是是1秒,源碼在org.springframework.cloud.openfeign.ribbon.FeignLoadBalancer#execute()方法中,如下圖:

        源碼大致意思:如果openFeign沒(méi)有設(shè)置對(duì)應(yīng)得超時(shí)時(shí)間,那么將會(huì)采用Ribbon的默認(rèn)超時(shí)時(shí)間。

        理解了超時(shí)設(shè)置的原理,由之產(chǎn)生兩種方案也是很明了了,如下:

        • 設(shè)置openFeign的超時(shí)時(shí)間
        • 設(shè)置Ribbon的超時(shí)時(shí)間

        1、設(shè)置Ribbon的超時(shí)時(shí)間(不推薦)

        設(shè)置很簡(jiǎn)單,在配置文件中添加如下設(shè)置:

        ribbon:
          # 值的是建立鏈接所用的時(shí)間,適用于網(wǎng)絡(luò)狀況正常的情況下, 兩端鏈接所用的時(shí)間
          ReadTimeout: 5000
          # 指的是建立鏈接后從服務(wù)器讀取可用資源所用的時(shí)間
          ConectTimeout: 5000

        2、設(shè)置openFeign的超時(shí)時(shí)間(推薦)

        openFeign設(shè)置超時(shí)時(shí)間非常簡(jiǎn)單,只需要在配置文件中配置,如下:

        feign:
          client:
            config:
              ## default 設(shè)置的全局超時(shí)時(shí)間,指定服務(wù)名稱(chēng)可以設(shè)置單個(gè)服務(wù)的超時(shí)時(shí)間
              default:
                connectTimeout: 5000
                readTimeout: 5000

        default設(shè)置的是全局超時(shí)時(shí)間,對(duì)所有的openFeign接口服務(wù)都生效

        但是正常的業(yè)務(wù)邏輯中可能涉及到多個(gè)openFeign接口的調(diào)用,如下圖:

        上圖中的偽代碼如下:

        public T invoke(){
            //1. 調(diào)用serviceA
            serviceA();
            
            //2. 調(diào)用serviceA
            serviceB();
            
            //3. 調(diào)用serviceA
            serviceC();
        }

        那么上面配置的全局超時(shí)時(shí)間能不能通過(guò)呢?很顯然是serviceA、serviceB能夠成功調(diào)用,但是serviceC并不能成功執(zhí)行,肯定報(bào)超時(shí)。

        此時(shí)我們可以給serviceC這個(gè)服務(wù)單獨(dú)配置一個(gè)超時(shí)時(shí)間,配置如下:

        feign:
          client:
            config:
              ## default 設(shè)置的全局超時(shí)時(shí)間,指定服務(wù)名稱(chēng)可以設(shè)置單個(gè)服務(wù)的超時(shí)時(shí)間
              default:
                connectTimeout: 5000
                readTimeout: 5000
              ## 為serviceC這個(gè)服務(wù)單獨(dú)配置超時(shí)時(shí)間
              serviceC:
                connectTimeout: 30000
                readTimeout: 30000

        注意:?jiǎn)蝹€(gè)配置的超時(shí)時(shí)間將會(huì)覆蓋全局配置。

        10、如何開(kāi)啟日志增強(qiáng)?

        openFeign雖然提供了日志增強(qiáng)功能,但是默認(rèn)是不顯示任何日志的,不過(guò)開(kāi)發(fā)者在調(diào)試階段可以自己配置日志的級(jí)別。

        openFeign的日志級(jí)別如下:

        • NONE:默認(rèn)的,不顯示任何日志;
        • BASIC:僅記錄請(qǐng)求方法、URL、響應(yīng)狀態(tài)碼及執(zhí)行時(shí)間;
        • HEADERS:除了BASIC中定義的信息之外,還有請(qǐng)求和響應(yīng)的頭信息;
        • FULL:除了HEADERS中定義的信息之外,還有請(qǐng)求和響應(yīng)的正文及元數(shù)據(jù)。

        配置起來(lái)也很簡(jiǎn)單,步驟如下:

        1、配置類(lèi)中配置日志級(jí)別

        需要自定義一個(gè)配置類(lèi),在其中設(shè)置日志級(jí)別,如下:

        注意:這里的logger是feign包里的。

        2、yaml文件中設(shè)置接口日志級(jí)別

        只需要在配置文件中調(diào)整指定包或者openFeign的接口日志級(jí)別,如下:

        logging:
          level:
            cn.myjszl.service: debug

        這里的cn.myjszl.service是openFeign接口所在的包名,當(dāng)然你也可以配置一個(gè)特定的openFeign接口。

        3、演示效果

        上述步驟將日志設(shè)置成了FULL,此時(shí)發(fā)出請(qǐng)求,日志效果如下圖:

        日志中詳細(xì)的打印出了請(qǐng)求頭、請(qǐng)求體的內(nèi)容。

        11、如何替換默認(rèn)的httpclient?

        Feign在默認(rèn)情況下使用的是JDK原生的URLConnection發(fā)送HTTP請(qǐng)求,沒(méi)有連接池,但是對(duì)每個(gè)地址會(huì)保持一個(gè)長(zhǎng)連接,即利用HTTP的persistence connection。

        在生產(chǎn)環(huán)境中,通常不使用默認(rèn)的http client,通常有如下兩種選擇:

        • 使用ApacheHttpClient
        • 使用OkHttp

        至于哪個(gè)更好,其實(shí)各有千秋,我比較傾向于ApacheHttpClient,畢竟老牌子了,穩(wěn)定性不在話下。

        那么如何替換掉呢?其實(shí)很簡(jiǎn)單,下面演示使用ApacheHttpClient替換。

        1、添加ApacheHttpClient依賴(lài)

        在openFeign接口服務(wù)的pom文件添加如下依賴(lài):

        <!--     使用Apache HttpClient替換Feign原生httpclient-->
            <dependency>
              <groupId>org.apache.httpcomponents</groupId>
              <artifactId>httpclient</artifactId>
            </dependency>
            
            <dependency>
              <groupId>io.github.openfeign</groupId>
              <artifactId>feign-httpclient</artifactId>
            </dependency>

        為什么要添加上面的依賴(lài)呢?從源碼中不難看出,請(qǐng)看org.springframework.cloud.openfeign.FeignAutoConfiguration.HttpClientFeignConfiguration這個(gè)類(lèi),代碼如下:

        上述紅色框中的生成條件,其中的@ConditionalOnClass(ApacheHttpClient.class),必須要有ApacheHttpClient這個(gè)類(lèi)才會(huì)生效,并且feign.httpclient.enabled這個(gè)配置要設(shè)置為true。

        2、配置文件中開(kāi)啟

        在配置文件中要配置開(kāi)啟,代碼如下:

        feign:
          client:
            httpclient:
              # 開(kāi)啟 Http Client
              enabled: true

        3、如何驗(yàn)證已經(jīng)替換成功?

        其實(shí)很簡(jiǎn)單,在feign.SynchronousMethodHandler#executeAndDecode()這個(gè)方法中可以清楚的看出調(diào)用哪個(gè)client,如下圖:

        上圖中可以看到最終調(diào)用的是ApacheHttpClient

        4、總結(jié)

        上述步驟僅僅演示一種替換方案,剩下的一種不再演示了,原理相同。

        12、如何通訊優(yōu)化?

        在講如何優(yōu)化之前先來(lái)看一下GZIP 壓縮算法,概念如下:

        gzip是一種數(shù)據(jù)格式,采用用deflate算法壓縮數(shù)據(jù);gzip是一種流行的數(shù)據(jù)壓縮算法,應(yīng)用十分廣泛,尤其是在Linux平臺(tái)。

        當(dāng)GZIP壓縮到一個(gè)純文本數(shù)據(jù)時(shí),效果是非常明顯的,大約可以減少70%以上的數(shù)據(jù)大小。

        網(wǎng)絡(luò)數(shù)據(jù)經(jīng)過(guò)壓縮后實(shí)際上降低了網(wǎng)絡(luò)傳輸?shù)淖止?jié)數(shù),最明顯的好處就是可以加快網(wǎng)頁(yè)加載的速度。網(wǎng)頁(yè)加載速度加快的好處不言而喻,除了節(jié)省流量,改善用戶(hù)的瀏覽體驗(yàn)外,另一個(gè)潛在的好處是GZIP與搜索引擎的抓取工具有著更好的關(guān)系。例如 Google就可以通過(guò)直接讀取GZIP文件來(lái)比普通手工抓取更快地檢索網(wǎng)頁(yè)。

        GZIP壓縮傳輸?shù)脑砣缦聢D:

        按照上圖拆解出的步驟如下:

        • 客戶(hù)端向服務(wù)器請(qǐng)求頭中帶有:Accept-Encoding:gzip,deflate 字段,向服務(wù)器表示,客戶(hù)端支持的壓縮格式(gzip或者deflate),如果不發(fā)送該消息頭,服務(wù)器是不會(huì)壓縮的。
        • 服務(wù)端在收到請(qǐng)求之后,如果發(fā)現(xiàn)請(qǐng)求頭中含有Accept-Encoding字段,并且支持該類(lèi)型的壓縮,就對(duì)響應(yīng)報(bào)文壓縮之后返回給客戶(hù)端,并且攜帶Content-Encoding:gzip消息頭,表示響應(yīng)報(bào)文是根據(jù)該格式壓縮過(guò)的。
        • 客戶(hù)端接收到響應(yīng)之后,先判斷是否有Content-Encoding消息頭,如果有,按該格式解壓報(bào)文。否則按正常報(bào)文處理。

        openFeign支持請(qǐng)求/響應(yīng)開(kāi)啟GZIP壓縮,整體的流程如下圖:

        上圖中涉及到GZIP傳輸?shù)闹挥袃蓧K,分別是Application client -> Application ServiceApplication Service->Application client。

        注意:openFeign支持的GZIP僅僅是在openFeign接口的請(qǐng)求和響應(yīng),即是openFeign消費(fèi)者調(diào)用服務(wù)提供者的接口。

        openFeign開(kāi)啟GZIP步驟也是很簡(jiǎn)單,只需要在配置文件中開(kāi)啟如下配置:

        feign:
          ## 開(kāi)啟壓縮
          compression:
            request:
              enabled: true
              ## 開(kāi)啟壓縮的閾值,單位字節(jié),默認(rèn)2048,即是2k,這里為了演示效果設(shè)置成10字節(jié)
              min-request-size: 10
              mime-types: text/xml,application/xml,application/json
            response:
              enabled: true

        上述配置完成之后,發(fā)出請(qǐng)求,可以清楚看到請(qǐng)求頭中已經(jīng)攜帶了GZIP壓縮,如下圖:

        13、如何熔斷降級(jí)?

        常見(jiàn)的熔斷降級(jí)框架有Hystrix、Sentinel,openFeign默認(rèn)支持的就是Hystrix,這個(gè)在官方文檔上就有體現(xiàn),畢竟是一奶同胞嘛,哈哈...........

        但是阿里的Sentinel無(wú)論是功能特性、簡(jiǎn)單易上手等各方面都完全秒殺Hystrix,因此此章節(jié)就使用openFeign+Sentinel進(jìn)行整合實(shí)現(xiàn)服務(wù)降級(jí)。

        說(shuō)明:此處并不著重介紹Sentinel,陳某打算放在下一篇文章詳細(xì)介紹Sentinel的強(qiáng)大之處。

        1、添加Sentinel依賴(lài)

        openFeign-consumer9006消費(fèi)者的pom文件添加sentinel依賴(lài)(由于使用了聚合模塊,不指定版本號(hào)),如下:

        <dependency>
              <groupId>com.alibaba.cloud</groupId>
              <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

        2、配置文件中開(kāi)啟sentinel熔斷降級(jí)

        要想openFeign使用sentinel的降級(jí)功能,還需要在配置文件中開(kāi)啟,添加如下配置:

        feign:
          sentinel:
            enabled: true

        3、添加降級(jí)回調(diào)類(lèi)

        這個(gè)類(lèi)一定要和openFeign接口實(shí)現(xiàn)同一個(gè)類(lèi),如下圖:

        OpenFeignFallbackService這個(gè)是降級(jí)回調(diào)的類(lèi),一旦OpenFeignService中對(duì)應(yīng)得接口出現(xiàn)了異常則會(huì)調(diào)用這個(gè)類(lèi)中對(duì)應(yīng)得方法進(jìn)行降級(jí)處理。

        4、添加fallback屬性

        @FeignClient中添加fallback屬性,屬性值是降級(jí)回調(diào)的類(lèi),如下:

        @FeignClient(value = "openFeign-provider",fallback = OpenFeignFallbackService.class)
        public interface OpenFeignService 
        {}

        5、演示

        經(jīng)過(guò)如上4個(gè)步驟,openFeign的熔斷降級(jí)已經(jīng)設(shè)置完成了,此時(shí)演示下效果。

        通過(guò)postman調(diào)用http://localhost:9006/openfeign/order3這個(gè)接口,正常邏輯返回如下圖:

        現(xiàn)在手動(dòng)造個(gè)異常,在服務(wù)提供的接口中拋出異常,如下圖:

        此時(shí)重新調(diào)用http://localhost:9006/openfeign/order3,返回如下圖:

        哦豁,可以很清楚的看到服務(wù)已經(jīng)成功降級(jí)調(diào)用,哦了,功能完成。

        注意:實(shí)際開(kāi)發(fā)中返回結(jié)果應(yīng)該根據(jù)架構(gòu)統(tǒng)一定制,陳某這里只是為了演示方便,不要借鑒,哈哈。。。

        14、總結(jié)

        本篇文章主要面對(duì)初學(xué)者,深入的源碼以及熔斷降級(jí)放在后面詳細(xì)介紹,文中若有表述不清,錯(cuò)誤的地方歡迎指正!

        這是陳某Spring Cloud 進(jìn)階專(zhuān)欄的第二篇文章,覺(jué)得文章不錯(cuò)的,歡迎點(diǎn)贊、收藏、轉(zhuǎn)發(fā)。碼字不易,隨手一贊是美德!

        以上源碼已經(jīng)上傳GitHub,需要的公眾號(hào)【碼猿技術(shù)專(zhuān)欄】回復(fù)關(guān)鍵詞9528獲取。

        瀏覽 48
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            免费看91片 | 婷婷五月天丁香花 | 国产aa精品 | 国产喷水吹潮在线播放91 | 久久加勒比 | 免费网站成人 视频在线观看 | 91精品视频观看 | 蜜桃视频91 | 中国一级特黄大片学生 | jizz4国产精品 |