<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          面試官:業(yè)務開發(fā)時,接口不能對外暴露怎么辦?我有 3 種實現方案!

          共 5712字,需瀏覽 12分鐘

           ·

          2023-08-28 11:09

          點擊關注公眾號:互聯(lián)網架構師,后臺回復 2T獲取2TB學習資源!

          上一篇:2T架構師學習資料干貨分享

          在業(yè)務開發(fā)的時候,經常會遇到某一個接口不能對外暴露,只能內網服務間調用的實際需求。面對這樣的情況,我們該如何實現呢?
          今天,我們就來理一理這個問題,從幾個可行的方案中,挑選一個來實現。


          1. 內外網接口微服務隔離

          將對外暴露的接口和對內暴露的接口分別放到兩個微服務上,一個服務里所有的接口均對外暴露,另一個服務的接口只能內網服務間調用。
          該方案需要額外編寫一個只對內部暴露接口的微服務,將所有只能對內暴露的業(yè)務接口聚合到這個微服務里,通過這個聚合的微服務,分別去各個業(yè)務側獲取資源。

          該方案,新增一個微服務做請求轉發(fā),增加了系統(tǒng)的復雜性,增大了調用耗時以及后期的維護成本。

          2. 網關 + redis 實現白名單機制

          在 redis 里維護一套接口白名單列表,外部請求到達網關時,從 redis 獲取接口白名單,在白名單內的接口放行,反之拒絕掉。

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

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

          3. 方案三 網關 + AOP

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

          我們知道,外部進來的請求一定會經過網關再被分發(fā)到具體的業(yè)務側,內部服務間的調用是不用走外部網關的(走 k8s 的 service)。

          根據這個特點,我們可以對所有經過網關的請求的header里添加一個字段,業(yè)務側接口收到請求后,判斷header里是否有該字段,如果有,則說明該請求來自外部,沒有,則屬于內部服務的調用,再根據該接口是否屬于內部接口來決定是否放行該請求。

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

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


          具體實操

          下面就方案三,進行具體的代碼演示。

          首先在網關側,需要對進來的請求header添加外網標識符: from=public

          @Component
          public class AuthFilter implements GlobalFilter, Ordered {
              @Override
              public Mono < Void > filter ( ServerWebExchange exchange, GatewayFilterChain chain ) {
                   return chain.filter(
                   exchange.mutate().request(
                   exchange.getRequest().mutate().header("id""").header("from""public").build())
                   .build()
                   );
              }
           
              @Override
              public int getOrder () {
                  return 0;
              }
           }

          接著,編寫內外網訪問權限判斷的AOP和注解

          @Aspect
          @Component
          @Slf4j
          public class OnlyIntranetAccessAspect {
           @Pointcut ( "@within(org.openmmlab.platform.common.annotation.OnlyIntranetAccess)" )
           public void onlyIntranetAccessOnClass () {}
           @Pointcut ( "@annotation(org.openmmlab.platform.common.annotation.OnlyIntranetAccess)" )
           public void onlyIntranetAccessOnMethed () {
           }
           
           @Before ( value = "onlyIntranetAccessOnMethed() || onlyIntranetAccessOnClass()" )
           public void before () {
               HttpServletRequest hsr = (( ServletRequestAttributes ) RequestContextHolder.getRequestAttributes()) .getRequest ();
               String from = hsr.getHeader ( "from" );
               if ( !StringUtils.isEmpty( from ) && "public".equals ( from )) {
                  log.error ( "This api is only allowed invoked by intranet source" );
                  throw new MMException ( ReturnEnum.C_NETWORK_INTERNET_ACCESS_NOT_ALLOWED_ERROR);
                      }
               }
           }
           
          @Target({ElementType.METHOD})
          @Retention(RetentionPolicy.RUNTIME)
          @Documented
          public @interface OnlyIntranetAccess {
          }

          最后,在只能內網訪問的接口上加上@OnlyIntranetAccess注解即可

          @GetMapping ( "/role/add" )
          @OnlyIntranetAccess
          public String onlyIntranetAccess() {
              return "該接口只允許內部服務調用";
          }

          你學會了嗎?

          原文鏈接:https://blog.csdn.net/m0_71777195/article/details/127243452

          最后,關注公眾號互聯(lián)網架構師,在后臺回復:2T,可以獲取我整理的 Java 系列面試題和答案,非常齊全。


          正文結束


          推薦閱讀 ↓↓↓

          1.JetBrains 如何看待自己的軟件在中國被頻繁破解?

          2.無意中發(fā)現了一位清華妹子的資料庫!

          3.程序員一般可以從什么平臺接私活?

          4.40歲,剛被裁,想說點啥。

          5.為什么國內 996 干不過國外的 955呢?

          6.中國的鐵路訂票系統(tǒng)在世界上屬于什么水平?                        

          7.15張圖看懂瞎忙和高效的區(qū)別!

          瀏覽 1234
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  青草娱乐视频在线观看 | 国产无码成人电影 | 久草影音先锋 | a片一级免费 | 3p两根一起进女学生 |