0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

内外网接口微服务隔离如何实现

jf_ro2CN3Fa 来源:芋道源码 作者:芋道源码 2022-11-02 16:19 次阅读

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

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

3. 方案三 网关 + AOP

具体实操

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

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

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

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

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

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

项目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro

视频教程:https://doc.iocoder.cn/video/

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

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

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

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

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

项目地址:https://gitee.com/zhijiantianya/yudao-cloud

视频教程:https://doc.iocoder.cn/video/

3. 方案三 网关 + AOP

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

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

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

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

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

4114d15a-573d-11ed-a3b6-dac502259ad0.jpg

具体实操

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

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

@Component
publicclassAuthFilterimplementsGlobalFilter,Ordered{
@Override
publicMono< Void >filter(ServerWebExchangeexchange,GatewayFilterChainchain){
returnchain.filter(
exchange.mutate().request(
exchange.getRequest().mutate().header("id","").header("from","public").build())
.build()
);
}

@Override
publicintgetOrder(){
return0;
}
}

接着,编写内外网访问权限判断的AOP和注解

@Aspect
@Component
@Slf4j
publicclassOnlyIntranetAccessAspect{
@Pointcut("@within(org.openmmlab.platform.common.annotation.OnlyIntranetAccess)")
publicvoidonlyIntranetAccessOnClass(){}
@Pointcut("@annotation(org.openmmlab.platform.common.annotation.OnlyIntranetAccess)")
publicvoidonlyIntranetAccessOnMethed(){
}

@Before(value="onlyIntranetAccessOnMethed()||onlyIntranetAccessOnClass()")
publicvoidbefore(){
HttpServletRequesthsr=((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
Stringfrom=hsr.getHeader("from");
if(!StringUtils.isEmpty(from)&&"public".equals(from)){
log.error("Thisapiisonlyallowedinvokedbyintranetsource");
thrownewMMException(ReturnEnum.C_NETWORK_INTERNET_ACCESS_NOT_ALLOWED_ERROR);
}
}
}

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public@interfaceOnlyIntranetAccess{
}

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

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

审核编辑:彭静
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    7573

    浏览量

    148206
  • 数据
    +关注

    关注

    8

    文章

    6504

    浏览量

    87445
  • 微服务
    +关注

    关注

    0

    文章

    117

    浏览量

    7231

原文标题:业务开发时,接口不能对外暴露怎么办?

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    一行代码,保障分布式事务一致性—GTS:微服务架构下分布式事务解决方案

    ,首先它将微服务从分布式事务中解放出来,微服务实现不需要再考虑反向接口、幂等、回滚策略等复杂问题,只需要业务自己的接口即可,大大降低了
    发表于 06-05 19:14

    采用apache-httpd的微服务请求代理实现

    2018-12-06 基于apache-httpd实现微服务的请求代理
    发表于 05-17 13:11

    微服务架构和CQRS架构基本概念介绍

    微服务架构现在很热,到处可以看到各大互联网公司的微服务实践的分享总结。但是,我今天的分享和微服务没有关系,希望可以带给大家一些新的东西。如果一定要说微服务和CQRS架构的关系,那我觉得
    发表于 05-22 09:03

    如何遥开内外网穿透的问题

    使用openh323的程序升级到h323plus,利用其h.460.18 ,19 或其上的Nat功能,配合公网的GnuGK来实现内外网的穿透.2. 用另
    发表于 11-03 06:29

    微服务网关gateway的相关资料推荐

    目录微服务网关 gateway 概述[路由器网关 Zuul 概述]嵌入式 Zuul 反向代理微服务网关 gateway 概述1、想象一下一个购物应用程序的产品详情页面展示了指定商品的信息:2、若是
    发表于 12-23 08:19

    TFTP不支持内外网传输吗?

    云端服务器上搭建了tftp服务器,开发板上运行tftp客户端,开发板不能从服务器上拉取文件,本地电脑也不能从服务器上拉取文件,tftp不支持内外网
    发表于 02-16 11:51

    我所理解的SOA和微服务

    本文主要浅谈SOA和微服务。SOA和微服务两者说到底都是对外提供接口的一种架构设计方式,微服务其实就是随着互联网的发展,复杂的平台、业务的出现,导致SOA架构向更细粒度、更通过化程度发
    的头像 发表于 02-07 14:19 3423次阅读
    我所理解的SOA和<b class='flag-5'>微服务</b>

    Linux微服务架构中容错隔离的详细资料技术

    对应到微服务架构中,我们要做的就是最大限度的隔离单个服务的风险,也就是「 容错隔离 」的方法。
    的头像 发表于 06-30 10:21 3118次阅读

    通过微服务原理、领域驱动设计概念等来成功实现微服务

    组织通过微服务基本准则、领域驱动的设计概念和编码优秀实践成功地使用微服务,可以充分利用Kubernetes/容器原生的优势。
    的头像 发表于 08-14 10:02 1723次阅读

    如何遥开内外网穿透的问题 --- MCU做简单外网代理

    :            1. 把原有使用openh323的程序升级到h323plus,利用其h.460.18 ,19 或其上的Nat功能,配合公网的GnuGK来实现内外网的穿透.           2. 用另
    发表于 10-28 19:21 10次下载
    如何遥开<b class='flag-5'>内外网</b>穿透的问题 --- MCU做简单<b class='flag-5'>外网</b>代理

    一文搞懂室内外网线不同

    网线从其应用场景来看分为室外网线和室内网线,室内外网线有什么不同呢?这是很多网友的疑问,为了帮助大家正确选择,科兰通讯小编围绕室内外网线展开介绍。 室内外网线不同: 顾名思义,室
    的头像 发表于 07-27 14:43 3782次阅读
    一文搞懂室<b class='flag-5'>内外网</b>线不同

    一文搞懂室内外网线不同

    网线从其应用场景来看分为室外网线和室内网线,室内外网线有什么不同呢?这是很多网友的疑问,为了帮助大家正确选择,科兰通讯小编围绕室内外网线展开介绍。 室内外网线不同: 顾名思义,室
    的头像 发表于 07-11 10:58 738次阅读
    一文搞懂室<b class='flag-5'>内外网</b>线不同

    边缘计算微服务操作系统的设计与实现

    面对边缘计算运行环境不统一、适配难,工业边缘计算微服务开发难度高,微服务生态系统碎片化,以及工业边缘计算行业应用难以落地等技术和行业共性问题,本文实现了一种边缘计算微服务操作系统,包括
    的头像 发表于 08-31 16:49 560次阅读
    边缘计算<b class='flag-5'>微服务</b>操作系统的设计与<b class='flag-5'>实现</b>

    设计微服务架构的原则

    微服务是一种软件架构策略,有利于改善整体性能和可扩展性。你可能会想,我的团队需不需要采用微服务,设计微服务架构有哪些原则?本文会给你一些灵感。文章速览:微服务设计的要素
    的头像 发表于 11-26 08:05 199次阅读
    设计<b class='flag-5'>微服务</b>架构的原则

    如何构建弹性、高可用的微服务

    基于微服务的应用程序可实现战略性数字转型和云迁移计划,对于开发团队来说,这种架构十分重要。那么,如何来构建弹性、高可用的微服务呢?RedisEnterprise给出了一个完美的方案
    的头像 发表于 11-26 08:06 203次阅读
    如何构建弹性、高可用的<b class='flag-5'>微服务</b>?