当前位置:首页 > 科技  > 软件

微服务开发时,接口不能对外暴露怎么办?

来源: 责编: 时间:2024-07-09 07:02:20 888观看
导读在业务开发的时候,经常会遇到某一个接口不能对外暴露,只能内网服务间调用的实际需求。面对这样的情况,我们该如何实现呢?今天,我们就来理一理这个问题,从几个可行的方案中,挑选一个来实现。1. 内外网接口微服务隔离将对外暴

在业务开发的时候,经常会遇到某一个接口不能对外暴露,只能内网服务间调用的实际需求。面对这样的情况,我们该如何实现呢?今天,我们就来理一理这个问题,从几个可行的方案中,挑选一个来实现。Vdw28资讯网——每日最新资讯28at.com

1. 内外网接口微服务隔离

将对外暴露的接口和对内暴露的接口分别放到两个微服务上,一个服务里所有的接口均对外暴露,另一个服务的接口只能内网服务间调用。Vdw28资讯网——每日最新资讯28at.com

该方案需要额外编写一个只对内部暴露接口的微服务,将所有只能对内暴露的业务接口聚合到这个微服务里,通过这个聚合的微服务,分别去各个业务侧获取资源。Vdw28资讯网——每日最新资讯28at.com

该方案,新增一个微服务做请求转发,增加了系统的复杂性,增大了调用耗时以及后期的维护成本。Vdw28资讯网——每日最新资讯28at.com

2. 网关 + redis 实现白名单机制

在 redis 里维护一套接口白名单列表,外部请求到达网关时,从 redis 获取接口白名单,在白名单内的接口放行,反之拒绝掉。Vdw28资讯网——每日最新资讯28at.com

该方案的好处是,对业务代码零侵入,只需要维护好白名单列表即可;Vdw28资讯网——每日最新资讯28at.com

不足之处在于,白名单的维护是一个持续性投入的工作,在很多公司,业务开发无法直接触及到 redis,只能提工单申请,增加了开发成本;另外,每次请求进来,都需要判断白名单,增加了系统响应耗时,考虑到正常情况下外部进来的请求大部分都是在白名单内的,只有极少数恶意请求才会被白名单机制所拦截,所以该方案的性价比很低。Vdw28资讯网——每日最新资讯28at.com

3. 方案三 网关 + AOP

相比于方案二对接口进行白名单判断而言,方案三是对请求来源进行判断,并将该判断下沉到业务侧。避免了网关侧的逻辑判断,从而提升系统响应速度。Vdw28资讯网——每日最新资讯28at.com

我们知道,外部进来的请求一定会经过网关再被分发到具体的业务侧,内部服务间的调用是不用走外部网关的(走 k8s 的 service)。Vdw28资讯网——每日最新资讯28at.com

根据这个特点,我们可以对所有经过网关的请求的header里添加一个字段,业务侧接口收到请求后,判断header里是否有该字段,如果有,则说明该请求来自外部,没有,则属于内部服务的调用,再根据该接口是否属于内部接口来决定是否放行该请求。Vdw28资讯网——每日最新资讯28at.com

该方案将内外网访问权限的处理分布到各个业务侧进行,消除了由网关来处理的系统性瓶颈;同时,开发者可以在业务侧直接确定接口的内外网访问权限,提升开发效率的同时,增加了代码的可读性。Vdw28资讯网——每日最新资讯28at.com

当然该方案会对业务代码有一定的侵入性,不过可以通过注解的形式,最大限度的降低这种侵入性。Vdw28资讯网——每日最新资讯28at.com

图片图片Vdw28资讯网——每日最新资讯28at.com


Vdw28资讯网——每日最新资讯28at.com

具体实操

下面就方案三,进行具体的代码演示。首先在网关侧,需要对进来的请求header添加外网标识符: from=public。
@Componentpublic 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和注解。Vdw28资讯网——每日最新资讯28at.com

@Aspect@Component@Slf4jpublic 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)@Documentedpublic @interface OnlyIntranetAccess {}

最后,在只能内网访问的接口上加上@OnlyIntranetAccess注解即可Vdw28资讯网——每日最新资讯28at.com

@GetMapping ( '/role/add' )@OnlyIntranetAccesspublic String onlyIntranetAccess() {    return '该接口只允许内部服务调用';}
4. 网关路径匹配在DailyMart项目中我采用的是第四种:即在网关中进行路径匹配。该方案中我们将内网访问的接口全部以前缀/pv开头,然后在网关过滤器中根据路径找到具体校验器,如果是/pv访问的路径则直接提示禁止外部访问。使用网关路径匹配方案不仅可以应对内网接口的问题,还可以扩展到其他校验机制上。譬如,有的接口需要通过access_token进行校验,有的接口需要校验api_key 和 api_secret,为了应对这种不同的校验场景,只需要再实现一个校验类即可,由不同的子类实现不同的校验逻辑,扩展非常方便。

图片图片Vdw28资讯网——每日最新资讯28at.com


Vdw28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-99643-0.html微服务开发时,接口不能对外暴露怎么办?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 三款C#开源且实用的工具类库,工作效率提升利器!

下一篇: 我们聊聊如何分析Rust进程使用了多少内存?

标签:
  • 热门焦点
  • 官方承诺:K60至尊版将会首批升级MIUI 15

    全新的MIUI 15今天也有了消息,在官宣了K60至尊版将会搭载天玑9200+处理器和独显芯片X7的同时,Redmi给出了官方承诺,K60至尊重大更新首批升级,会首批推送MIUI 15。也就是说虽然
  • 7月安卓手机性能榜:红魔8S Pro再夺榜首

    7月份的手机市场风平浪静,除了红魔和努比亚带来了两款搭载骁龙8Gen2领先版处理器的新机之外,别的也想不到有什么新品了,这也正常,通常6月7月都是手机厂商修整的时间,进入8月份之
  • 消息称迪士尼要拍真人版《魔发奇缘》:女主可能也找黑人演员

    8月5日消息,迪士尼确实有点忙,忙着将不少动画改成真人版,继《美人鱼》后,真人版《白雪公主》、《魔发奇缘》也在路上了。据外媒消息称,迪士尼将打造真人版
  • K8S | Service服务发现

    一、背景在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关、注册中心、配置中心等相关服务,可以被集群外部访问;图片对于测试「Tes」环境或者
  • JavaScript学习 -AES加密算法

    引言在当今数字化时代,前端应用程序扮演着重要角色,用户的敏感数据经常在前端进行加密和解密操作。然而,这样的操作在网络传输和存储中可能会受到恶意攻击的威胁。为了确保数据
  • 19个 JavaScript 单行代码技巧,让你看起来像个专业人士

    今天这篇文章跟大家分享18个JS单行代码,你只需花几分钟时间,即可帮助您了解一些您可能不知道的 JS 知识,如果您已经知道了,就当作复习一下,古人云,温故而知新嘛。现在,我们就开始今
  • 2纳米决战2025

    集微网报道 从三强争霸到四雄逐鹿,2nm的厮杀声已然隐约传来。无论是老牌劲旅台积电、三星,还是誓言重回先进制程领先地位的英特尔,甚至初成立不久的新
  • 三星推出Galaxy Tab S9系列平板电脑以及Galaxy Watch6系列智能手表

    2023年7月26日,三星电子正式发布了Galaxy Z Flip5与Galaxy Z Fold5。除此之外,Galaxy Tab S9系列平板电脑以及三星Galaxy Watch6系列智能手表也同期
  • iQOO Neo8 Pro即将开售:到手价3099元起 安卓性能最强旗舰

    5月23日,iQOO如期举行了新品发布会,全新的iQOO Neo8系列也正式与大家见面,包含iQOO Neo8和iQOO Neo8 Pro两个版本,其中标准版搭载高通骁龙8+,而Pro版更
Top