一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

微服務(wù)開發(fā)時(shí),接口不能對(duì)外暴露怎么辦?

 woh5r1ofyffxnh 2023-07-11 發(fā)布于浙江

大家好,我是不才陳某~

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

今天,我就來說一下碼猿慢病云管理系統(tǒng)中是如何實(shí)現(xiàn)的?

碼猿慢病云管理系統(tǒng)企業(yè)級(jí)醫(yī)療項(xiàng)目正在持續(xù)更新,需要訂閱的小伙伴可以點(diǎn)鏈接聯(lián)系陳某

往期文章如下:

常用方案

在介紹碼猿慢病云管理系統(tǒng)中的實(shí)現(xiàn)方式,先來介紹常用的兩種方案。

1. 網(wǎng)關(guān)+白名單

此方案需要在緩存中維護(hù)一套接口白名單,請(qǐng)求到達(dá)網(wǎng)關(guān)處,先判斷白名單緩存中是否存在,存在則放行,反之則攔截。

網(wǎng)關(guān)+白名單

該方案的好處是,對(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à)比很低。

2. 網(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)速度。

我們可以在所有內(nèi)部的調(diào)用請(qǐng)求頭中增加一個(gè)header標(biāo)志這是一個(gè)內(nèi)部請(qǐng)求,比如加個(gè)請(qǐng)求頭:from=Y

只要在業(yè)務(wù)接口處通過AOP的方式判斷一下請(qǐng)求頭中是否含有from=Y,如果有,則是內(nèi)部請(qǐng)求,反之則是外部請(qǐng)求

網(wǎng)關(guān)+AOP

實(shí)現(xiàn)

碼猿慢病云管理系統(tǒng)中采用的是第二種方案:網(wǎng)關(guān)+AOP ,下面來介紹一下具體的代碼實(shí)現(xiàn)。

1. 定義注解

這里AOP在碼猿慢病云管理系統(tǒng)中采用的是注解的方式,注解如下:

@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Inner {
 /**
  * 是否AOP統(tǒng)一處理
  */

 boolean value() default true;
}

2. 網(wǎng)關(guān)處理

在網(wǎng)關(guān)處需要對(duì)請(qǐng)求頭中的from進(jìn)行清洗,避免有意之人偽裝內(nèi)部請(qǐng)求,這里需要做的就是對(duì)每個(gè)請(qǐng)求直接移除from這個(gè)請(qǐng)求頭,直接使用全局過濾器即可完成,代碼如下:

/**
 * {@link com.code.ape.codeape.gateway.filter.CodeapeRequestGlobalFilter#filter}
 * @author 公眾號(hào):碼猿技術(shù)專欄
 * @url: www.java-family.cn
 */

public class CodeapeRequestGlobalFilter implements GlobalFilterOrdered {

 @Override
 public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  // 1. 清洗請(qǐng)求頭中from 參數(shù)
  ServerHttpRequest request = exchange.getRequest().mutate().headers(httpHeaders -> {
   httpHeaders.remove(SecurityConstants.FROM);
   // 設(shè)置請(qǐng)求時(shí)間
   httpHeaders.put(CommonConstants.REQUEST_START_TIME,
     Collections.singletonList(String.valueOf(System.currentTimeMillis())));
  }).build();
        .......
        .......
    }

3. feign接口處理

既然是內(nèi)部調(diào)用,按照之前的約定是要在請(qǐng)求頭中添加一個(gè)from=Y,因此在feign接口中需要新增這個(gè)請(qǐng)求頭,方式很簡單,比如設(shè)備feign接口,如下:

/**
 * @author 公眾號(hào):碼猿技術(shù)專欄
 * @url: www.java-family.cn
 * @description 設(shè)備的feign接口
 */

@FeignClient(contextId = "remoteDeviceService", value = ServiceNameConstants.DEVICE_SERVICE)
public interface RemoteDeviceService {

 /**
  * 通過Sn查詢
  * @param sn 設(shè)備SN號(hào)
  * @return 設(shè)備詳細(xì)信息
  */

 @GetMapping(value = "/device/sn/{sn}",headers = "from=Y")
 R<DeviceInfoVO> getBySn(@PathVariable("sn" ) String sn);
}

@GetMapping中的headers屬性即可完成新增請(qǐng)求頭,同樣的比如@RequestMapping、@PostMapping等也是支持的。

這樣的話在feign接口發(fā)出請(qǐng)求時(shí)則會(huì)自動(dòng)在請(qǐng)求頭中新增from=Y了。

4. AOP處理

在第1步中定義了@Inner這個(gè)注解,標(biāo)注在controller方法上表示這個(gè)接口只允許內(nèi)部調(diào)用,代碼如下:

@IngoreAuth這個(gè)注解是繞過鑒權(quán)的作用,前面文章中也有分享。

那么這個(gè)注解內(nèi)部的實(shí)現(xiàn)原理是什么呢?代碼如下:

//com.code.ape.codeape.common.security.component.CodeapeSecurityInnerAspect
@Slf4j
@Aspect
@RequiredArgsConstructor
public class CodeapeSecurityInnerAspect implements Ordered {

 private final HttpServletRequest request;

 @SneakyThrows
 @Around("@within(inner) || @annotation(inner)")
 public Object around(ProceedingJoinPoint point, Inner inner) {
        //取出請(qǐng)求頭中的from屬性
  String header = request.getHeader("from");
        //判斷from===Y
  if (inner.value() && !"Y".equals(header)) {
            //不符合規(guī)則,直接拋出異常,返回給客戶端無權(quán)限
   log.warn("訪問接口 {} 沒有權(quán)限", point.getSignature().getName());
   throw new AccessDeniedException("Access is denied");
  }
  return point.proceed();
 }
    .......
}

如果請(qǐng)求頭中的from屬性不匹配,則拋出AccessDeniedException異常,會(huì)被全局異常捕獲,返回403的狀態(tài)碼,代碼如下:

總結(jié)

本節(jié)內(nèi)容介紹了微服務(wù)中接口不對(duì)外暴露的兩種方案:

  1. 網(wǎng)關(guān)+白名單
  2. 網(wǎng)關(guān)+AOP

當(dāng)然還有其他的實(shí)現(xiàn)方式,生產(chǎn)中根據(jù)項(xiàng)目需要選擇合適的方案為最佳。

最后說一句(別白嫖,求關(guān)注)

陳某每一篇文章都是精心輸出,如果這篇文章對(duì)你有所幫助,或者有所啟發(fā)的話,幫忙點(diǎn)贊、在看轉(zhuǎn)發(fā)收藏,你的支持就是我堅(jiān)持下去的最大動(dòng)力!

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    一区二区三区亚洲天堂| 狠狠干狠狠操在线播放| 国产av精品一区二区| 91欧美日韩精品在线| 98精品永久免费视频| 精品少妇一区二区三区四区| 国产日韩精品激情在线观看| 婷婷基地五月激情五月| 五月天丁香婷婷一区二区| 女厕偷窥一区二区三区在线| 亚洲高清欧美中文字幕| 91人妻人澡人人爽人人精品| 欧美日韩精品久久第一页| 亚洲中文字幕人妻av| 青青操视频在线播放免费| 中文字幕人妻综合一区二区| 国产日韩在线一二三区| 国产在线一区中文字幕| 亚洲国产精品无遮挡羞羞| 青青免费操手机在线视频| 国产91麻豆精品成人区| 最近的中文字幕一区二区| 日韩国产欧美中文字幕| 97人妻人人揉人人躁人人| 尤物久久91欧美人禽亚洲| 国产一区欧美一区日本道| 免费黄色一区二区三区| 亚洲欧美黑人一区二区| 日韩中文字幕有码午夜美女| 国产精品久久女同磨豆腐| 好吊妞视频这里有精品| 深夜日本福利在线观看| 国产亚洲精品一二三区| 精品亚洲av一区二区三区| 欧美一区二区三区视频区| 成人精品网一区二区三区| 欧美日韩无卡一区二区| 国产二级一级内射视频播放| 欧美日韩校园春色激情偷拍| 国产免费成人激情视频| 欧美做爰猛烈叫床大尺度|