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

这篇具有很好参考价值的文章主要介绍了业务开发时,接口不能对外暴露怎么办?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在业务开发的时候,经常会遇到某一个接口不能对外暴露,只能内网服务间调用的实际需求。面对这样的情况,我们该如何实现呢?

今天,我们就来理一理这个问题,从几个可行的方案中,挑选一个来实现。

推荐一个开源免费的 Spring Boot 实战项目:

https://github.com/javastacks/spring-boot-best-practice

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

将对外暴露的接口和对内暴露的接口分别放到两个微服务上,一个服务里所有的接口均对外暴露,另一个服务的接口只能内网服务间调用。

该方案需要额外编写一个只对内部暴露接口的微服务,将所有只能对内暴露的业务接口聚合到这个微服务里,通过这个聚合的微服务,分别去各个业务侧获取资源。

该方案,新增一个微服务做请求转发,增加了系统的复杂性,增大了调用耗时以及后期的维护成本。

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

在 redis 里维护一套接口白名单列表,外部请求到达网关时,从 redis 获取接口白名单,在白名单内的接口放行,反之拒绝掉。

该方案的好处是,对业务代码零侵入,只需要维护好白名单列表即可;

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

3. 方案三 网关 + AOP

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

我们知道,外部进来的请求一定会经过网关再被分发到具体的业务侧,内部服务间的调用是不用走外部网关的(走 k8s 的 service)。

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

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

当然该方案会对业务代码有一定的侵入性,不过可以通过注解的形式,最大限度的降低这种侵入性。

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

具体实操

下面就方案三,进行具体的代码演示。

首先在网关侧,需要对进来的请求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 "该接口只允许内部服务调用";
}

你学会了吗?

版权声明:本文为CSDN博主「肥肥技术宅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/m0_71777195/article/details/127243452

近期热文推荐:

1.1,000+ 道 Java面试题及答案整理(2022最新版)

2.劲爆!Java 协程要来了。。。

3.Spring Boot 2.x 教程,太全了!

4.别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!

5.《Java开发手册(嵩山版)》最新发布,速速下载!

觉得不错,别忘了随手点赞+转发哦!文章来源地址https://www.toymoban.com/news/detail-655504.html

到了这里,关于业务开发时,接口不能对外暴露怎么办?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ​路由器端口映射怎么设置?内网IP不能映射怎么办?​

    使用路由器后,Internet用户无法访问到局域网内的主机,因此不能访问内网搭建的Web、FTP、Mail等服务器。路由器 端口映射功能可以实现将内网的服务器映射到Internet,从而实现服务器对外开放。 建议在设置路由器端口映射之前,确认以下几点: 1.服务器:服务器设置为固定

    2024年02月09日
    浏览(61)
  • 无线网感叹号不能上网怎么办

    1、首先拔掉无线路由器的电源,等待一分钟之后,再次开通电源,重启无线路由器,之后再看看无线网络是否可用,如果可用,则说明可能是路由器内部的小程序错误,通常这种情况很少发生。 2、检查“猫”跟“路由器”的连接是否完好,这个很重要,路由器开着,但是这

    2024年02月06日
    浏览(50)
  • 路由器设置好了但不能上网怎么办?

    不少初次使用路由器上网的朋友经常会遇到路由器设置好了上不了网的情况,出现这种情况很多朋友就没辙,不知道怎么办了。下面小编为大家介绍下遇到路由器设置好了上不了网的排除故障方法,相信会对你有所帮助。 路由器设置好了上不了网怎么办 请分别从以下几个方

    2024年02月05日
    浏览(44)
  • 【已解决】PPT不能转换成PDF文档怎么办?

    PPT可以转换成PDF文档,只需要点击PPT菜单页面中的【文件】选项,再点击【导出】即可转换,如果转换时发现【导出】选项不可选,无法完成转换怎么办?以下3种方法可以试试! 出现上面这种情况,我们可以看下PPT是否正处于“只读模式”,也就是PPT设置了限制保护,在打

    2024年02月06日
    浏览(56)
  • u盘被占用不能安全弹出怎么办?里面的文件怎么取出来

    当我们需要将u盘从电脑中安全弹出时,有时会遇到u盘被占用的情况,导致无法安全地弹出u盘,这时我们该如何处理呢? 第一部分:u盘被占用不能安全弹出怎么解决 u盘被占用不能安全弹出来里面的文件会丢失吗?当u盘被占用而不能安全弹出时,可能会出现数据损坏或丢失

    2023年04月12日
    浏览(34)
  • 【解决方法】PPT不能编辑,按钮都是灰色,怎么办?

    PPT文件打开之后,发现无法编辑,再仔细查看发现工具栏中的功能按钮都是灰色的,无法使用,这是什么原因?该如何解决? 原因:无法编辑PPT文件,并且功能按钮都是灰色,这是因为文件设置了编辑权限导致的。 而想要取消修改权限,我们需要打开文件时输入权限密码,

    2024年01月25日
    浏览(68)
  • 蓝牙bluesoleil 不能与该设备建立连接该怎么办?

    蓝牙设备无法正常连接,而且它是不需要配对密码的,可还是出现无法连接,并“蓝牙bluesoleil 不能与该设备建立连接,请确认其电源开启且已设置为可发现模式”,现在来解说如何解决这个问题 1、首先,单击右下角蓝牙图标,注意,此时,它是蓝色的,然后再单击“显示经

    2024年02月07日
    浏览(61)
  • 电脑只能登录微信?但却打不开网页?不能上网怎么办?ip地址和DNS出问题了无法上网怎么办?

    描述一下问题: 昨天使用了一些代理梯子。直接关机,没有关闭那个软件、今天打开电脑就出问题了。只能登录微信!但却打不开网页! 今天查了很多资料都没有解决。花了2个多小时。终于可以上网了! 找到【控制面板】 --【网络和Internet】-- 里面的【网络连接】或者【网

    2024年02月05日
    浏览(80)
  • Win10中Pro/E鼠标滚轮不能缩放该怎么办?

    Pro/E安装好后,鼠标滚轮不能缩放模型,该怎么办?问题多发生在win8/win10上,新装了PROE,发现滑动鼠标中键不能放大缩小。 彩虹图纸管理软件_图纸管理系统_图纸文档管理软件系统_彩虹EDM【官网】 彩虹EDM图纸管理软件系统,由南宁市二零二五科技有限公司 自主研发。为用户

    2024年02月08日
    浏览(76)
  • 华为E3276s-150 4G网卡不能用该怎么办?

    同事有一个电信的4G网卡,我看他平常在单位用用速度不错,自己也去买了华为的E3276s-150的4G上网卡,但是买来后发现用不了,后来有个朋友帮忙看了后,终于将问题解决了。现将经验分享给大家。 故障现象 1 、上网卡插上后没有4G信号和客户端显示,但是周围同事用的其他

    2024年02月08日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包