成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

OpenFeign整合Sentinel,由淺入深,搭建屬于自己的腳手架

開(kāi)發(fā) 架構(gòu)
Sentinel是阿里巴巴開(kāi)源的一款微服務(wù)流量控制組件。是面向分布式、多語(yǔ)言異構(gòu)化服務(wù)架構(gòu)的流量治理組件,主要以流量為切入點(diǎn),從流量路由、流量控制、流量整形、熔斷降級(jí)、系統(tǒng)自適應(yīng)過(guò)載保護(hù)、熱點(diǎn)流量防護(hù)等多個(gè)維度來(lái)幫助開(kāi)發(fā)者保障微服務(wù)的穩(wěn)定性。

本文由淺人深,帶你了解如何在項(xiàng)目中整合OpenFeign與Sentinel,分析Sentinel源碼,并打造自己的Sentinel腳手架。

Sentinel是什么

Sentinel是阿里巴巴開(kāi)源的一款微服務(wù)流量控制組件。是面向分布式、多語(yǔ)言異構(gòu)化服務(wù)架構(gòu)的流量治理組件,主要以流量為切入點(diǎn),從流量路由、流量控制、流量整形、熔斷降級(jí)、系統(tǒng)自適應(yīng)過(guò)載保護(hù)、熱點(diǎn)流量防護(hù)等多個(gè)維度來(lái)幫助開(kāi)發(fā)者保障微服務(wù)的穩(wěn)定性。

OpenFeign調(diào)用

我們先看一下,沒(méi)有整合Sentinel,OpenFeign調(diào)用異常時(shí),是怎樣的情況。假定存在兩個(gè)服務(wù),order和user,然后再order服務(wù)中,通過(guò)feign調(diào)用user中的接口。

公共組件中定義接口:

@FeignClient(name = "xdty-user")
public interface UserApi {

    @GetMapping("/getUserInfo")
    ResponseResult getUserInfo();
}

user服務(wù)中實(shí)現(xiàn)接口:

public class UserController implements UserApi {
    @Override
    public ResponseResult getUserInfo() {
        int i = 1/0; //模擬異常
        return new ResponseResult("200","user info");
    }
}

order服務(wù)中調(diào)用user服務(wù)中的接口:

@RestController
public class OrderController implements OrderApi {

    @Autowired
    private UserApi userApi;

    @Override
    public ResponseResult getOrderInfo() {
        return userApi.getUserInfo();
    }
}

利用postman訪問(wèn)order服務(wù)。

返回接口:

可以看到,這樣的返回值,是非常不友好的,對(duì)于項(xiàng)目而言,不管接口成功與否,都應(yīng)有統(tǒng)一的返回,如:code,message。

OpenFeign整合Sentinel

引入依賴(lài):

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

啟用OpenFeign整合Sentinel的自動(dòng)配置。熔斷是在consumer端實(shí)現(xiàn)的,所以在consumer端的application.yaml配置文件中添加如下配置。

feign:
  sentinel:
    enabled: true

定義一個(gè)容錯(cuò)的處理類(lèi),當(dāng)調(diào)用遠(yuǎn)程接口失敗或超時(shí)時(shí),會(huì)調(diào)用對(duì)應(yīng)接口的容錯(cuò)邏輯。

public class UserApiFallback implements UserApi {

    @Override
    public ResponseResult getUserInfo() {
        return new ResponseResult("503","用戶(hù)服務(wù)異常");
    }
}

@Component
public class UserApiFallbackFactory implements FallbackFactory<UserApi> {
    @Override
    public UserApi create(Throwable cause) {
        return new UserApiFallback();
    }
}

@FeignClient 注解上增加 fallbackFactory屬性。

@FeignClient(name = "xdty-user",fallbackFactory = UserApiFallbackFactory.class)
public interface UserApi {

    @GetMapping("/getUserInfo")
    ResponseResult getUserInfo();
}

再次調(diào)用接口。

可以發(fā)現(xiàn),服務(wù)異常后,會(huì)進(jìn)行降級(jí)處理,返回統(tǒng)一定義的異常。

全局異常封裝分析

上述代碼,增加了異常處理邏輯,但存在一個(gè)問(wèn)題,就是每次都要為其設(shè)置fallbackFactory參數(shù)。導(dǎo)致項(xiàng)目中會(huì)多出很多冗余代碼。那我們能不能有一個(gè)自己定制化的默認(rèn)Fallback去處理這些相同的事情呢?

要想解決這個(gè)問(wèn)題,需要先了解sentinel中fallback的機(jī)制。前面提到,要使用sentinel需要配置文件中指定feign.sentinel.enabled=true。看到SentinelFeignAutoConfiguration的代碼實(shí)現(xiàn),我想大家也就明天這樣配置的原因了。

@ConditionalOnProperty 中 feign.sentinel.enabled 起了決定性作用,這也就是為什么我們需要在配置文件中指定 feign.sentinel.enabled=true。

接下來(lái)看 SentinelFeign.builder 里面的實(shí)現(xiàn):

build方法中重新實(shí)現(xiàn)了super.invocationHandlerFactory方法,也就是動(dòng)態(tài)代理工廠,構(gòu)建的是InvocationHandler對(duì)象。

build中會(huì)獲取Feign Client中的信息,比如fallback,fallbackFactory等,然后創(chuàng)建一個(gè)SentinelInvocationHandler,SentinelInvocationHandler繼承了InvocationHandler。

SentinelInvocationHandler中的invoke方法里面進(jìn)行熔斷限流的處理。

從這段代碼我就可以看出,在沒(méi)有配置fallback時(shí),并沒(méi)有向SentinelInvocationHandler構(gòu)造方法中傳入FallbackFactory。這樣的話我們就有了思路:

  • 編寫(xiě)公共FallbackFactory
  • 改寫(xiě)SentinelFeign使得fallbackFactory為void.class時(shí),我們傳入自己的公共FallbackFactory實(shí)例。

打造自己的sentinel腳手架

接下來(lái),我們沿著sentinel的思路,編寫(xiě)一個(gè)屬于自己的小小腳手架,實(shí)現(xiàn)統(tǒng)一的兜底方法。

定義全局的fallback處理器。

定義一個(gè)全局的FallbackFactory。

重新實(shí)現(xiàn)spring-cloud-starter-alibaba-sentinel下的SentinelFeign。

注入我們的SentinelFeign Bean。

注:這里使用AutoConfigureBefore注解,要想該注解生效,必須把自定義的配置類(lèi)變成自動(dòng)配置類(lèi)。

這樣,以后只要定義基本屬性@FeignClient,不需要再配置fallBackFactory,就可以完成統(tǒng)一的兜底方法了。

責(zé)任編輯:姜華 來(lái)源: 今日頭條
相關(guān)推薦

2020-08-19 08:55:47

Redis緩存數(shù)據(jù)庫(kù)

2021-05-21 05:22:52

腳手架工具項(xiàng)目

2021-01-07 05:34:07

腳手架JDK緩存

2022-07-18 07:58:46

Spring工具工具類(lèi)

2021-12-19 07:22:16

Create前端工具

2016-08-10 14:59:41

前端Javascript工具

2021-12-23 10:35:32

SpringCloud腳手架架構(gòu)

2016-09-07 15:35:06

VueReact腳手架

2025-05-16 07:24:41

Springkafka腳手架

2021-04-28 16:10:48

開(kāi)發(fā)腳手架 Spring

2021-05-13 17:02:38

MDC腳手架日志

2021-04-13 14:47:53

認(rèn)證授權(quán)Java

2021-07-13 18:42:38

Spring Boot腳手架開(kāi)發(fā)

2020-03-20 08:32:41

物聯(lián)網(wǎng)腳手架傳感器

2018-06-11 14:39:57

前端腳手架工具node.js

2019-12-25 15:20:48

前端腳手架命令

2018-08-30 16:08:37

Node.js腳手架工具

2022-04-24 11:33:47

代碼管理工程

2021-08-30 06:59:06

StrviewAppStrview.js項(xiàng)目

2014-08-15 09:36:06

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: www.久| 精品一区二区三区四区在线 | 国产精品久久久久久久久久久免费看 | 午夜精品一区二区三区在线观看 | 国产精品1区 | av网站免费看 | 欧美成人视屏 | 亚洲 中文 欧美 日韩 在线观看 | 国产精品国产成人国产三级 | 黄免费观看视频 | 免费观看一级视频 | 亚洲在线视频 | 视频1区2区 | 国产日韩欧美一区二区 | 午夜小视频在线播放 | 久久中文字幕电影 | 欧美成人高清 | 成年人免费在线视频 | 国产98色在线 | 日韩 | 操视频网站 | 成年免费大片黄在线观看一级 | 日本不卡免费新一二三区 | 91资源在线| 男女污污网站 | 蜜桃一区二区三区 | 欧美日韩在线一区二区 | 精品无码久久久久久国产 | 亚洲黄色国产 | 一级毛片视频 | 毛片电影| 亚洲成人综合社区 | 国产精品高清在线 | 男人天堂av网站 | 91av在线免费观看 | 一区二区精品在线 | 偷拍自拍网站 | 免费毛片网 | 亚洲国产aⅴ成人精品无吗 综合国产在线 | 一级在线视频 | 99re超碰| 国产福利视频 |