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

news/2024/11/17 3:54:49/文章来源:https://www.cnblogs.com/zhouXX/p/18295139

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

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

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

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

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

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

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

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

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

3. 方案三 网关 + AOP

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

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

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

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

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

具体实操

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

首先在网关侧,需要对进来的请求header添加外网标识符: from=public

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

最后,在只能内网访问的接口上加上@OnlyIntranetAccess注解即可

点击查看代码
@GetMapping ( "/role/add" )
@OnlyIntranetAccess
public String onlyIntranetAccess() {return "该接口只允许内部服务调用";
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/741952.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

博客园XSS漏洞测试

<img src=1 onerror=alert(document.cookie)> `

06-Web API

Web API种的概念以及提供的相关方法的使用01 DOM的概念02 BOM概念除了DOM对象以外都是BOM,例如上图浏览器上的一些东西 03 DOM的继承关系图04 节点之间的导航 获取一个节点之后,可以根据这个节点去获取其它节点,称之为节点之间的导航获取节点代码示例 <!DOCTYPE html> …

实战篇——SSRF漏洞Redis反弹shell实战

实战篇——SSRF漏洞Redis反弹shell实战 SSRF之Redis实战 上一章中利用file伪协议实现了内网的主机探测,发现存在192.168.118.151,对其进行端口探测:可见开放了6379端口,结合响应判断为Redis服务。 而Redis存在未授权访问漏洞,可以利用该漏洞实现信息泄露、数据删除以及反弹…

今日笔记

学习背景 学习目的,在搭建lamp架构的业务背景下,先用了yum搭建的形式,部署了disuz产品 从过程中理解yum如何安装软件,生成的配置文件路径,如何启动每一个进程,你应该整理清楚操作文档,下次拿着这个文档,可以很快的再部署出多套一样的环境。 有同学感慨,说这个搭建环境…

点云分割网络---Point Transformer V3

PDF:《Point Transformer V3: Simpler, Faster, Stronger》 CODE: https://github.com/Pointcept/PointTransformerV3 一、大体内容 Point Transformer V3(PTv3)没有像V2那样在注意力机制方面寻求创新,而是专注于保持点云背景下准确性和效率之间的平衡,如下所示与上一代Poin…

面经梳理-分布式

梳理分布式相关面经题目 请简述一下CAP理论,我们常见的中间件分别侧重点是什么?简述一下BASE理论?什么是强一致性,弱一致性,最终一致性 CAP理论 CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分…

易优CMS模板标签artpagelist瀑布流

[基础用法]标签:artpagelist 描述:实现无刷新瀑布流分页,适用于首页,列表分页,内容页等模板。小注:需配合artlist标签。 注意:要实现瀑布流分页,必须要在模板目录pc/system里创建一个模板样本,命名格式为:arclist_+tagid属性名称,比如:arclist_index001.htm,里面内…

使用vscode远端连接虚拟机

主要是需要使用虚拟机ubuntu上的cmake环境,但是为了GUI又不想搞WSL,在虚拟机上再装一个vscode又有点卡,所以用了这招。 基本上网上的方法照着来就行了。几个简单的小步骤稍微记录一下。给虚拟机安装一下openssh并修改配置开放22端口(就很简单的跟着[1]来就行了)虚拟机ifco…

Python 数据挖掘

数据挖掘基础数据挖掘:这种从数据中“淘金”,从大量数据(包括文本)中挖掘出隐含的、未知的、对决策有潜在价值的关系、模式和趋势,并用这些知识和规则建立用于决策支持的模型,提供预测性决策支持的方法、工具和过程,就是数据挖掘;它是利用各种分析工具在大量数据中寻找其规…

Python Selenium+cookie+XPATH爬取数据

以某科研基金信息平台为例,写了一个基于selenium的web自动化爬虫。不带验证码防反爬以及代理ip池,是最基础的自动化工具爬虫。 一、首先,此平台需要登录后才能正常访问,否则数据不全,因此需要登录后获取cookie,以便selenium能够以登录状态运行 1.F12打开开发者工具,找到…

个人赛补题

round 1范围很小用暴力+贪心,左右枚举,先拿再放。尽量放小的所以需要排下序 include include "map" include "algorithm" include "cmath" include "vector" include "set" include "queue" define int long lo…