soul從入門到放棄8--自定義單一職責插件

一梁厉、前戲-- 功能需求

通過上一篇對soul插件鏈的整體概覽學習懊渡,本篇開始“生搬硬套”冠句,盡量符合soul的編碼方式實現(xiàn)一個自定義單一職責插件。

需求:實現(xiàn)一個參數(shù)驗簽的插件织咧,驗簽失敗中斷調(diào)用鏈調(diào)用直接返回錯誤信息胀葱,否則執(zhí)行剩下調(diào)用鏈。

二笙蒙、自定義插件類

  • 在soul-plugin項目下抵屿,新建一個子模塊soul-plugin-customsign。創(chuàng)建SoulPlugin接口的實現(xiàn)類CustomSignPlugin捅位。
  • 實現(xiàn)SoulPlugin接口定義方法轧葛,各方法職責如下:

execute() 方法為核心的執(zhí)行方法,用戶可以在里面自由的實現(xiàn)自己想要的功能艇搀。

getOrder() 指定插件的排序尿扯。

named() 指定插件的名稱。

skip() 在特定的條件下中符,該插件是否被跳過姜胖。

此處附上一個小demo:

@Slf4j
public class CustomSignPlugin implements SoulPlugin {
    /**
     * 加密私鑰
     */
    private String privateKey = "CDRjzk2sb99v6nUkXx8+6g";

    @Override
    public String named() {
        return PluginEnum.CUSTOMSIGN.getName();
    }
    @Override
    public Boolean skip(final ServerWebExchange exchange) {
        final SoulContext soulContext = exchange.getAttribute(Constants.CONTEXT);
        return !Objects.equals(Objects.requireNonNull(soulContext).getRpcType(), RpcTypeEnum.HTTP.getName());
    }
    @Override
    public Mono<Void> execute(ServerWebExchange exchange, SoulPluginChain chain) {
        final SoulContext soulContext = exchange.getAttribute(Constants.CONTEXT);
        String queryParam = exchange.getRequest().getURI().getQuery();
        if (StringUtils.isNotBlank(queryParam)) {
            if(!checkSignature(exchange.getRequest())) {
                log.error("接口請求驗簽失敗");
                Object error = SoulResultWrap.error(SoulResultEnum.CHECK_CUSTOM_SIGN_EXCEPTION.getCode(), SoulResultEnum.CHECK_CUSTOM_SIGN_EXCEPTION.getMsg(), null);
                return WebFluxResultUtils.result(exchange, error);
            }
        }
        return chain.execute(exchange);
    }

    private boolean checkSignature(ServerHttpRequest request) {
        Map<String, String> map = request.getQueryParams().toSingleValueMap();
        String signReq = map.containsKey("sign")? map.get("sign").toString() : null;;
        boolean checkSignture = false;
        //驗證簽名
        if (map.size() > 0 && StringUtils.isNotBlank(signReq)) {
            //簽名匹配,則簽名認證通過
            map.remove("sign");
            if (signReq.equals(Signature.getSign(map, privateKey))
                || signReq.equalsIgnoreCase(Signature.getSign(map, privateKey))) {
                checkSignture = true;
            }
        } else {
            // 不傳簽名淀散,非法強求
            checkSignture = false;
        }
        return checkSignture;
    }

    @Override
    public int getOrder() {
        return PluginEnum.CUSTOMSIGN.getCode();
    }
  • soul-plugin-customsign目錄結(jié)構(gòu)如下:
image.png
  • 調(diào)整pom, install 本地倉庫蚜锨,待引用

三档插、設置插件執(zhí)行順序

在PluginEnum類中創(chuàng)建,自定義插件的執(zhí)行順序亚再,名字等信息。

ps:1.枚舉中code定義相對松散,這個間隔目前懷疑是為了便于“滲入”新插件

image.png

2.枚舉類中的name一定要定義好且具有唯一性特笋,后文配置中還會用到

四、設置異常

SoulResultEnum類中定義統(tǒng)一錯誤異常碼耘柱,此處建議使用英文,此處用中文作以區(qū)分棍现。

image.png

五调煎、封裝spring-starter

  • 在soul-spring-boot-starter-plugin項目下,創(chuàng)建子模塊soul-spring-boot-starter-plugin-customsign
  • 引入自定義插件依賴
<dependency>
    <groupId>org.dromara</groupId>
    <artifactId>soul-plugin-customsign</artifactId>
    <version>${project.version}</version>
</dependency>
  • 此類只是對做一個簡單的spring-starter封裝,封裝一個CustomSignPluginConfiguration
@Configuration
public class CustomSignPluginConfiguration {
    /**
     * init SoulPlugin.
     *
     * @return {@linkplain SoulPlugin}
     */
    @Bean
    public SoulPlugin customSignPlugin() {
        return new CustomSignPlugin();
    }
}
  • 當然不要忘記加上加載bean的配偶spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.dromara.soul.spring.boot.plugin.divide.DividePluginConfiguration
  • 整體目錄結(jié)構(gòu)如下
image.png

六己肮、soul-bootstrap的配置

此處配置就“過于”簡單士袄,只需要引入maven依賴即可,體現(xiàn)出作者對代碼的高內(nèi)聚谎僻、低耦合了娄柳,nice!

<pre><dependency>
<groupId>org.dromara</groupId>
<artifactId>soul-spring-boot-starter-plugin-customsign</artifactId>
<version>${project.version}</version>
</dependency></pre>

七艘绍、配置插件信息

  • 整體項目mvn一下
mvn  clean package install -Dmaven.test.skip=true -Dmaven.javadoc.skip=true -Drat.skip=true -Dcheckstyle.skip=true
  • 插件管理中配置插件信息赤拒,此處插件名正式前文PluginEnum中定義name,一定保持一致否則插件鏈初始化將失敗诱鞠,慘痛浪費15分鐘調(diào)試經(jīng)驗需了。
image.png

八、測試

  • 分別啟動soul-bootstrap般甲、soul-plugin-customsign測試一下
image.png

一發(fā)入魂肋乍,搞定! 收拾收拾可以再睡一會了敷存。

九墓造、小結(jié)

  • 知易行難:感覺自己捋清了調(diào)用鏈,實現(xiàn)一個自定義插件應該還算easy锚烦。實際操作起來觅闽,其實~~~~我還是很菜啊涮俄!
  • 回顧整個實現(xiàn)流程蛉拙,確實很精巧。熱插拔的插件鏈彻亲,確實很精巧孕锄,原有代碼基本不需要改動,確實高內(nèi)聚低耦合苞尝。確實很精巧;痢!宙址!
  • 日拱一卒轴脐,每天進步一點點
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子大咱,更是在濱河造成了極大的恐慌恬涧,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碴巾,死亡現(xiàn)場離奇詭異溯捆,居然都是意外死亡,警方通過查閱死者的電腦和手機餐抢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門现使,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人旷痕,你說我怎么就攤上這事碳锈。” “怎么了欺抗?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵售碳,是天一觀的道長。 經(jīng)常有香客問我绞呈,道長贸人,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任佃声,我火速辦了婚禮艺智,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘圾亏。我一直安慰自己十拣,他們只是感情好,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布志鹃。 她就那樣靜靜地躺著夭问,像睡著了一般。 火紅的嫁衣襯著肌膚如雪曹铃。 梳的紋絲不亂的頭發(fā)上缰趋,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機與錄音陕见,去河邊找鬼秘血。 笑死,一個胖子當著我的面吹牛淳玩,可吹牛的內(nèi)容都是我干的直撤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼蜕着,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起承匣,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蓖乘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后韧骗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嘉抒,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年袍暴,在試婚紗的時候發(fā)現(xiàn)自己被綠了些侍。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡政模,死狀恐怖岗宣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情淋样,我是刑警寧澤耗式,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站趁猴,受9級特大地震影響刊咳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜儡司,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一娱挨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧捕犬,春花似錦跷坝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至誉裆,卻和暖如春顿颅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背足丢。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工粱腻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人斩跌。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓绍些,卻偏偏與公主長得像,于是被迫代替她去往敵國和親耀鸦。 傳聞我的和親對象是個殘疾皇子柬批,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容