首页 > 其他分享 >业务开发时接口不能对外暴露解决方案

业务开发时接口不能对外暴露解决方案

时间:2023-11-15 09:33:20浏览次数:25  
标签:网关 服务 请求 解决方案 暴露 接口 白名单 public

一、内外网接口微服务隔离

       1.1、方式            

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

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

1.2、影响

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

二、网关 + redis实现白名单机制

       2.1、方式

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

2.2、影响

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

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

三、网关 + AOP

       3.1、方式

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

       3.2、影响

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

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

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

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

         

四、网关 + AOP具体实现

       4.1、首先在网关侧,需要对进来的请求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;
    }
 }
View Code

      4.2、接着,编写内外网访问权限判断的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 {
}
View Code

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

@GetMapping ( "/role/add" )
@OnlyIntranetAccess
public String onlyIntranetAccess() {
    return "该接口只允许内部服务调用";
}
View Code

 

  

                    

     

 

 

 

 

 

 

 

 

 

 

标签:网关,服务,请求,解决方案,暴露,接口,白名单,public
From: https://www.cnblogs.com/xiaobaicai12138/p/17833138.html

相关文章

  • 11 14 lombok的使用和注册接口与登录接口细节
      先导入lombok的依赖,加上@Data注解  这是pojo包下的result,使用的两个注解是无参构造和有参构造controller:书写 service接口书写: serviceImol书写: 其中@Service把把该类注入到容器中,@Autowired注解是依赖注入,Md5Util是一个工具类,其中的getMD5String(string)......
  • 抖音直播间采集截流软件,截流匿名WSS接口协议,易语言提取源码分享
    接口什么都是对接易语言的,易语言源码,然后最主要它不调用本地浏览器,所以说你有技术基础的话可以实现多线程采集的效果,我这个仅仅只是源码,多余功能就没有了,当然支持匿名奥。框架设计图:采集效果图:易语言源码:【核心代码】===================================================.版本2.......
  • 抖音直播间匿名采集软件,带接口wss,易语言源码分享
    软件是易语言开发的,然后不用调用浏览器,直接截取wss数据,客户采集匿名的数据,源码我这边会公开,核心的部分。采集出来的效果:易语言核心代码:=================================================.版本2.支持库EThread.支持库spec.程序集窗口程序集_窗口1,,,744894369.子程序_窗......
  • 抖音直播间匿名采集软件,带接口wss,易语言源码分享
    软件是易语言开发的,然后不用调用浏览器,直接截取wss数据,客户采集匿名的数据,源码我这边会公开,核心的部分。框架图: 采集出来的效果 易语言核心代码:=================================================.版本2.支持库EThread.支持库spec .程序集窗口程序集_窗口1,......
  • IDEA接口调试插件不好找?这款免费用!
    IDEA插件市场中的API调试插件不是收费(FastRequest)就是不好用(apidoc、apidocx等等)今天给大家介绍一款国产的API调试插件:Apipost-Helper,完全免费且好看好用!这款插件由Apipost团队开发的,其官方介绍是:用于IDEA项目快速生成API文档,快速查询接口、接口代码功能,并支持在IDEA中进行API调......
  • IDEA接口调试插件不好找?这款免费用!
    IDEA插件市场中的API调试插件不是收费(FastRequest)就是不好用(apidoc、apidocx等等)今天给大家介绍一款国产的API调试插件:Apipost-Helper,完全免费且好看好用!这款插件由Apipost团队开发的,其官方介绍是:用于IDEA项目快速生成API文档,快速查询接口、接口代码功能,并支持在IDEA中进行API......
  • 智能制造企业数字化转型智慧工厂建设解决方案(76页 PPT)
    智能制造是推进制造强国战略的主攻方向,加速制造企业设备、产线、车间和工厂的数字化、网络化、智能化升级,从根本上变革制造业生产方式和资源组织模式。利用数字化技术帮助企业实现智能制造,使企业具有高质量、高效率、低成本、可持续的生产能力。制造企业面临严峻的业务挑战,急需数字......
  • 喷淋塔远程监控智能运维管理系统解决方案
    喷淋塔是一种用于废气处理的环保设备,通常被用于工业废气处理中,对于降低废气排放、保护环境起着重要作用。其工作原理是通过让废气与液体(强酸、强碱、强氧化剂)充分接触,利用液体对废弃的吸收、溶解和中和作用,进而实现净化除臭达到排放标准的目的。 然而,传统喷淋塔管理方式存在一定的......
  • MySQL - MySQL 占用内存涨得特别快?可能原因?解决方案
    https://www.processon.com/mindmap/655307fe6a2ff722ead8d9e4 ......
  • 妙用 FutureTask + 线程池:轻松解决接口超时问题!
    来源:blog.csdn.net/qq_44384533/article/details/112324224之前红包权益领取查询的接口超时了,因为有用户订购的权益有点多解决方案用线程池+FutureTask将1个查询拆分成多个小查询选择FutureTask是因为它具有仅执行1次run()方法的特性(即使有多次调用也只执行1次),避免了重复查......