首页 > 其他分享 >业务开发时,接口不能对外暴露怎么办?

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

时间:2024-07-10 22:29:50浏览次数:13  
标签:网关 服务 请求 暴露 接口 白名单 怎么办 public

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

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;
    }
 }

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

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

标签:网关,服务,请求,暴露,接口,白名单,怎么办,public
From: https://www.cnblogs.com/zhouXX/p/18295139

相关文章

  • Ceph块存储系统RDB接口
    目录1.创建Ceph块存储系统RBD接口1.1创建一个名为rbd-xy101的专门用于RBD的存储池1.2创建镜像1.3 查看镜像1.4 修改镜像大小1.5 删除镜像1.6 临时删除镜像2.Linux客户端使用2.1在管理节点创建并授权一个用户可访问指定的RBD存储池2.2 修改RBD镜像......
  • 利用Selenium和PhantomJS绕过接口加密的技术探索与实践
    selenium+phantomjs绕过接口加密我们为什么需要selenium之前我们讲解了Ajax的分析方法,利用Ajax接口我们可以非常方便地完成数据的爬取。只要我们能找到Ajax接口的规律,就可以通过某些参数构造出对应的的请求,数据自然就能被轻松爬取到。但是,在很多情况下,Ajax请求的接口通......
  • 前端如何取消接口调用
    ......
  • 智能小程序 Ray 开发门锁 API ——日志 API 接口汇总
    查询最近一条日志记录getLatestLog引入@ray-js/ray^1.5.0以上版本可使用import{getLatestLog}from'@ray-js/ray'参数LatestLogParams属性类型必填说明devIdstring是设备ID返回LatestLogResponse结构包含日志记录的各种详细信息。函数定义示例/***查询......
  • api文字识别智能录入、身份证识别、接口识别​
    OCR技术和由此带来的文字识别自动化程度不断增加,不少人预计该技术将对相当一部分的行业、工作产生影响,其中有一部分是颠覆性的。比如文字录入的工作,现在不少企业为自己的系统、产品集成了OCR技术核心,不仅能够减少人工录入的压力,正确率及录入速度等都得到了大幅的提升。可......
  • perf时 出现[kernel.kallsyms] 符号怎么办
    在perf工具生成的火焰图中看到[kernel.kallsyms],通常意味着火焰图中包含内核符号,但这些符号没有被正确解析。这可能是由于以下几个原因导致的:内核符号表不可用或不完整:perf工具需要内核的符号表来解析这些符号。如果内核符号表不可用或不完整,可能会出现[kernel.kallsyms]......
  • 实现了 ApplicationContextAware 接口的bean可以接收到 ApplicationContext 的引用
    `ApplicationContext`和`ApplicationContextAware`是Spring框架中的两个不同的概念,它们在Spring应用中扮演着不同的角色:1.**ApplicationContext**:  -`ApplicationContext`是Spring框架中的一个接口,它扩展了`BeanFactory`接口,提供了更多高级功能,如事件发布机制、......
  • C++发票识别接口轻松管理财务、发票识别sdk、增值税发票识别
    “营”“增”两种税是主流的流转税种,是两个独立而不能交叉的税种。也就是说交增值税的话就不交营业税,而交了营业税就不需要交增值税。而且,两者在征收的对象、征税范围、计税的依据、税目、税率以及征收管理等都有所不同,增值税在一些方面与营业税相比具有不少优势。营业税......
  • 【Py/Java/C++三种语言OD独家2024D卷真题】20天拿下华为OD笔试之【前缀和/固定滑窗】2
    有LeetCode算法/华为OD考试扣扣交流群可加948025485可上欧弟OJ系统练习华子OD、大厂真题绿色聊天软件戳od1441了解算法冲刺训练(备注【CSDN】否则不通过)文章目录题目描述与示例题目描述输入描述输出描述示例一输入输出说明示例二输入输出说明解题思路贪心思想......
  • C#将文件以byte[]形式传给python的sanic接口
    C#如何将文件以byte[]形式传给python的sanic接口?C#调用的部分你可以按照以下步骤进行:1)读取文件,将文件转换成byte[];2)定义类,将byte[]内容转成json格式传输;3)使用post请求将content传输到接口,返回结果;C#调用部分代码:/*将文件转换成byte[]格式*/protectedstaticbyte[]GetFileD......