0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

內(nèi)外網(wǎng)接口微服務(wù)隔離如何實(shí)現(xiàn)

jf_ro2CN3Fa ? 來源:芋道源碼 ? 作者:芋道源碼 ? 2022-11-02 16:19 ? 次閱讀

1. 內(nèi)外網(wǎng)接口微服務(wù)隔離

2. 網(wǎng)關(guān) + redis 實(shí)現(xiàn)白名單機(jī)制

3. 方案三 網(wǎng)關(guān) + AOP

具體實(shí)操

在業(yè)務(wù)開發(fā)的時(shí)候,經(jīng)常會(huì)遇到某一個(gè)接口不能對(duì)外暴露,只能內(nèi)網(wǎng)服務(wù)間調(diào)用的實(shí)際需求。面對(duì)這樣的情況,我們?cè)撊绾螌?shí)現(xiàn)呢?今天,我們就來理一理這個(gè)問題,從幾個(gè)可行的方案中,挑選一個(gè)來實(shí)現(xiàn)。

1. 內(nèi)外網(wǎng)接口微服務(wù)隔離

將對(duì)外暴露的接口和對(duì)內(nèi)暴露的接口分別放到兩個(gè)微服務(wù)上,一個(gè)服務(wù)里所有的接口均對(duì)外暴露,另一個(gè)服務(wù)的接口只能內(nèi)網(wǎng)服務(wù)間調(diào)用。

該方案需要額外編寫一個(gè)只對(duì)內(nèi)部暴露接口的微服務(wù),將所有只能對(duì)內(nèi)暴露的業(yè)務(wù)接口聚合到這個(gè)微服務(wù)里,通過這個(gè)聚合的微服務(wù),分別去各個(gè)業(yè)務(wù)側(cè)獲取資源。

該方案,新增一個(gè)微服務(wù)做請(qǐng)求轉(zhuǎn)發(fā),增加了系統(tǒng)的復(fù)雜性,增大了調(diào)用耗時(shí)以及后期的維護(hù)成本。

基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

項(xiàng)目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro

視頻教程:https://doc.iocoder.cn/video/

2. 網(wǎng)關(guān) + redis 實(shí)現(xiàn)白名單機(jī)制

在 redis 里維護(hù)一套接口白名單列表,外部請(qǐng)求到達(dá)網(wǎng)關(guān)時(shí),從 redis 獲取接口白名單,在白名單內(nèi)的接口放行,反之拒絕掉。

該方案的好處是,對(duì)業(yè)務(wù)代碼零侵入,只需要維護(hù)好白名單列表即可;

不足之處在于,白名單的維護(hù)是一個(gè)持續(xù)性投入的工作,在很多公司,業(yè)務(wù)開發(fā)無法直接觸及到 redis,只能提工單申請(qǐng),增加了開發(fā)成本;另外,每次請(qǐng)求進(jìn)來,都需要判斷白名單,增加了系統(tǒng)響應(yīng)耗時(shí),考慮到正常情況下外部進(jìn)來的請(qǐng)求大部分都是在白名單內(nèi)的,只有極少數(shù)惡意請(qǐng)求才會(huì)被白名單機(jī)制所攔截,所以該方案的性價(jià)比很低。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

項(xiàng)目地址:https://gitee.com/zhijiantianya/yudao-cloud

視頻教程:https://doc.iocoder.cn/video/

3. 方案三 網(wǎng)關(guān) + AOP

相比于方案二對(duì)接口進(jìn)行白名單判斷而言,方案三是對(duì)請(qǐng)求來源進(jìn)行判斷,并將該判斷下沉到業(yè)務(wù)側(cè)。避免了網(wǎng)關(guān)側(cè)的邏輯判斷,從而提升系統(tǒng)響應(yīng)速度。

我們知道,外部進(jìn)來的請(qǐng)求一定會(huì)經(jīng)過網(wǎng)關(guān)再被分發(fā)到具體的業(yè)務(wù)側(cè),內(nèi)部服務(wù)間的調(diào)用是不用走外部網(wǎng)關(guān)的(走 k8s 的 service)。

根據(jù)這個(gè)特點(diǎn),我們可以對(duì)所有經(jīng)過網(wǎng)關(guān)的請(qǐng)求的header里添加一個(gè)字段,業(yè)務(wù)側(cè)接口收到請(qǐng)求后,判斷header里是否有該字段,如果有,則說明該請(qǐng)求來自外部,沒有,則屬于內(nèi)部服務(wù)的調(diào)用,再根據(jù)該接口是否屬于內(nèi)部接口來決定是否放行該請(qǐng)求。

該方案將內(nèi)外網(wǎng)訪問權(quán)限的處理分布到各個(gè)業(yè)務(wù)側(cè)進(jìn)行,消除了由網(wǎng)關(guān)來處理的系統(tǒng)性瓶頸;同時(shí),開發(fā)者可以在業(yè)務(wù)側(cè)直接確定接口的內(nèi)外網(wǎng)訪問權(quán)限,提升開發(fā)效率的同時(shí),增加了代碼的可讀性。

當(dāng)然該方案會(huì)對(duì)業(yè)務(wù)代碼有一定的侵入性,不過可以通過注解的形式,最大限度的降低這種侵入性。

4114d15a-573d-11ed-a3b6-dac502259ad0.jpg

具體實(shí)操

下面就方案三,進(jìn)行具體的代碼演示。

首先在網(wǎng)關(guān)側(cè),需要對(duì)進(jìn)來的請(qǐng)求header添加外網(wǎng)標(biāo)識(shí)符: from=public

@Component
publicclassAuthFilterimplementsGlobalFilter,Ordered{
@Override
publicMonofilter(ServerWebExchangeexchange,GatewayFilterChainchain){
returnchain.filter(
exchange.mutate().request(
exchange.getRequest().mutate().header("id","").header("from","public").build())
.build()
);
}

@Override
publicintgetOrder(){
return0;
}
}

接著,編寫內(nèi)外網(wǎng)訪問權(quán)限判斷的AOP和注解

@Aspect
@Component
@Slf4j
publicclassOnlyIntranetAccessAspect{
@Pointcut("@within(org.openmmlab.platform.common.annotation.OnlyIntranetAccess)")
publicvoidonlyIntranetAccessOnClass(){}
@Pointcut("@annotation(org.openmmlab.platform.common.annotation.OnlyIntranetAccess)")
publicvoidonlyIntranetAccessOnMethed(){
}

@Before(value="onlyIntranetAccessOnMethed()||onlyIntranetAccessOnClass()")
publicvoidbefore(){
HttpServletRequesthsr=((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
Stringfrom=hsr.getHeader("from");
if(!StringUtils.isEmpty(from)&&"public".equals(from)){
log.error("Thisapiisonlyallowedinvokedbyintranetsource");
thrownewMMException(ReturnEnum.C_NETWORK_INTERNET_ACCESS_NOT_ALLOWED_ERROR);
}
}
}

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public@interfaceOnlyIntranetAccess{
}

最后,在只能內(nèi)網(wǎng)訪問的接口上加上@OnlyIntranetAccess注解即可

@GetMapping("/role/add")
@OnlyIntranetAccess
publicStringonlyIntranetAccess(){
return"該接口只允許內(nèi)部服務(wù)調(diào)用";
}

審核編輯:彭靜
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8451

    瀏覽量

    150728
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    6819

    瀏覽量

    88746
  • 微服務(wù)
    +關(guān)注

    關(guān)注

    0

    文章

    131

    瀏覽量

    7322

原文標(biāo)題:業(yè)務(wù)開發(fā)時(shí),接口不能對(duì)外暴露怎么辦?

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    采用apache-httpd的微服務(wù)請(qǐng)求代理實(shí)現(xiàn)

    2018-12-06 基于apache-httpd實(shí)現(xiàn)微服務(wù)的請(qǐng)求代理
    發(fā)表于 05-17 13:11

    微服務(wù)架構(gòu)和CQRS架構(gòu)基本概念介紹

    微服務(wù)架構(gòu)現(xiàn)在很熱,到處可以看到各大互聯(lián)網(wǎng)公司的微服務(wù)實(shí)踐的分享總結(jié)。但是,我今天的分享和微服務(wù)沒有關(guān)系,希望可以帶給大家一些新的東西。如果一定要說微服務(wù)和CQRS架構(gòu)的關(guān)系,那我覺得
    發(fā)表于 05-22 09:03

    如何遙開內(nèi)外網(wǎng)穿透的問題

    使用openh323的程序升級(jí)到h323plus,利用其h.460.18 ,19 或其上的Nat功能,配合公網(wǎng)的GnuGK來實(shí)現(xiàn)內(nèi)外網(wǎng)的穿透.2. 用另
    發(fā)表于 11-03 06:29

    微服務(wù)網(wǎng)關(guān)gateway的相關(guān)資料推薦

    目錄微服務(wù)網(wǎng)關(guān) gateway 概述[路由器網(wǎng)關(guān) Zuul 概述]嵌入式 Zuul 反向代理微服務(wù)網(wǎng)關(guān) gateway 概述1、想象一下一個(gè)購物應(yīng)用程序的產(chǎn)品詳情頁面展示了指定商品的信息:2、若是
    發(fā)表于 12-23 08:19

    TFTP不支持內(nèi)外網(wǎng)傳輸嗎?

    云端服務(wù)器上搭建了tftp服務(wù)器,開發(fā)板上運(yùn)行tftp客戶端,開發(fā)板不能從服務(wù)器上拉取文件,本地電腦也不能從服務(wù)器上拉取文件,tftp不支持內(nèi)外網(wǎng)
    發(fā)表于 02-16 11:51

    CSmail郵件系統(tǒng)內(nèi)外網(wǎng)安全隔離解決方案

    CSmail郵件系統(tǒng)內(nèi)外網(wǎng)安全隔離解決方案 需求分析  電子郵件已經(jīng)是主要的辦公、交流手段,在政府、軍隊(duì)、企業(yè)等對(duì)安全要求很高的單
    發(fā)表于 01-08 13:36 ?1502次閱讀

    我所理解的SOA和微服務(wù)

    本文主要淺談SOA和微服務(wù)。SOA和微服務(wù)兩者說到底都是對(duì)外提供接口的一種架構(gòu)設(shè)計(jì)方式,微服務(wù)其實(shí)就是隨著互聯(lián)網(wǎng)的發(fā)展,復(fù)雜的平臺(tái)、業(yè)務(wù)的出現(xiàn),導(dǎo)致SOA架構(gòu)向更細(xì)粒度、更通過化程度發(fā)
    的頭像 發(fā)表于 02-07 14:19 ?3633次閱讀
    我所理解的SOA和<b class='flag-5'>微服務(wù)</b>

    微服務(wù)優(yōu)勢(shì)_微服務(wù)架構(gòu)的好處與不足

    微服務(wù)是用一組小服務(wù)的方式來構(gòu)建一個(gè)應(yīng)用,服務(wù)獨(dú)立運(yùn)行在不同的進(jìn)程中,服務(wù)之間通過輕量的通訊機(jī)制(如RESTful接口)來交互,并且
    發(fā)表于 02-23 11:24 ?4382次閱讀

    Linux微服務(wù)架構(gòu)中容錯(cuò)隔離的詳細(xì)資料技術(shù)

    對(duì)應(yīng)到微服務(wù)架構(gòu)中,我們要做的就是最大限度的隔離單個(gè)服務(wù)的風(fēng)險(xiǎn),也就是「 容錯(cuò)隔離 」的方法。
    的頭像 發(fā)表于 06-30 10:21 ?3314次閱讀

    通過微服務(wù)原理、領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)概念等來成功實(shí)現(xiàn)微服務(wù)

    組織通過微服務(wù)基本準(zhǔn)則、領(lǐng)域驅(qū)動(dòng)的設(shè)計(jì)概念和編碼優(yōu)秀實(shí)踐成功地使用微服務(wù),可以充分利用Kubernetes/容器原生的優(yōu)勢(shì)。
    的頭像 發(fā)表于 08-14 10:02 ?1879次閱讀

    如何遙開內(nèi)外網(wǎng)穿透的問題 --- MCU做簡單外網(wǎng)代理

    : ?????????? 1. 把原有使用openh323的程序升級(jí)到h323plus,利用其h.460.18 ,19 或其上的Nat功能,配合公網(wǎng)的GnuGK來實(shí)現(xiàn)內(nèi)外網(wǎng)的穿透.?????????? 2. 用另
    發(fā)表于 10-28 19:21 ?10次下載
    如何遙開<b class='flag-5'>內(nèi)外網(wǎng)</b>穿透的問題 --- MCU做簡單<b class='flag-5'>外網(wǎng)</b>代理

    一文搞懂室內(nèi)外網(wǎng)線不同

    網(wǎng)線從其應(yīng)用場(chǎng)景來看分為室外網(wǎng)線和室內(nèi)網(wǎng)線,室內(nèi)外網(wǎng)線有什么不同呢?這是很多網(wǎng)友的疑問,為了幫助大家正確選擇,科蘭通訊小編圍繞室內(nèi)外網(wǎng)線展開介紹。 室內(nèi)外網(wǎng)線不同: 顧名思義,室
    的頭像 發(fā)表于 07-27 14:43 ?4580次閱讀
    一文搞懂室<b class='flag-5'>內(nèi)外網(wǎng)</b>線不同

    一文搞懂室內(nèi)外網(wǎng)線不同

    網(wǎng)線從其應(yīng)用場(chǎng)景來看分為室外網(wǎng)線和室內(nèi)網(wǎng)線,室內(nèi)外網(wǎng)線有什么不同呢?這是很多網(wǎng)友的疑問,為了幫助大家正確選擇,科蘭通訊小編圍繞室內(nèi)外網(wǎng)線展開介紹。 室內(nèi)外網(wǎng)線不同: 顧名思義,室
    的頭像 發(fā)表于 07-11 10:58 ?1553次閱讀
    一文搞懂室<b class='flag-5'>內(nèi)外網(wǎng)</b>線不同

    邊緣計(jì)算微服務(wù)操作系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)

    面對(duì)邊緣計(jì)算運(yùn)行環(huán)境不統(tǒng)一、適配難,工業(yè)邊緣計(jì)算微服務(wù)開發(fā)難度高,微服務(wù)生態(tài)系統(tǒng)碎片化,以及工業(yè)邊緣計(jì)算行業(yè)應(yīng)用難以落地等技術(shù)和行業(yè)共性問題,本文實(shí)現(xiàn)了一種邊緣計(jì)算微服務(wù)操作系統(tǒng),包括
    的頭像 發(fā)表于 08-31 16:49 ?1037次閱讀
    邊緣計(jì)算<b class='flag-5'>微服務(wù)</b>操作系統(tǒng)的設(shè)計(jì)與<b class='flag-5'>實(shí)現(xiàn)</b>

    如何構(gòu)建彈性、高可用的微服務(wù)?

    基于微服務(wù)的應(yīng)用程序可實(shí)現(xiàn)戰(zhàn)略性數(shù)字轉(zhuǎn)型和云遷移計(jì)劃,對(duì)于開發(fā)團(tuán)隊(duì)來說,這種架構(gòu)十分重要。那么,如何來構(gòu)建彈性、高可用的微服務(wù)呢?RedisEnterprise給出了一個(gè)完美的方案。文況速覽
    的頭像 發(fā)表于 11-26 08:06 ?440次閱讀
    如何構(gòu)建彈性、高可用的<b class='flag-5'>微服務(wù)</b>?