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

点击关注公众号,Java干货及时送达👇

79623362e44acd37be4daefcbe3405cd.png来源:blog.csdn.net/m0_71777195/article/details/127243452

  • 内外网接口微服务隔离

  • 网关 + redis 实现白名单机制

  • 方案三 网关 + AOP

  • 具体实操


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

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

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

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

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

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

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

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

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

3. 方案三 网关 + AOP

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

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

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

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

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

9c09ce135e629736a2330eeb67d16851.jpeg

图片

具体实操

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

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

517617bc67a9dadb40f653cf595828ef.jpeg

 
 
最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

明天见(。・ω・。)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 答:使用Spring MVC和Spring Web Services可以很容易地实现XML接口。Spring MVC可以建立RESTful接口,而Spring Web Services可以用于构建SOAP接口。 ### 回答2: JAVA SSM(Spring+SpringMVC+MyBatis)是一种主流的Java开发框架,它将Spring、SpringMVC和MyBatis集成在一起,提供了一种快速、稳定、可扩展的开发方式。 对外XML接口实例指的是使用XML作为数据传输格式的外部接口,通常用于与其他系统进行数据交互。在JAVA SSM中,实现对外XML接口可以按照以下步骤进行: 1. 定义XML格式:根据外部接口需要的数据格式,使用XML定义数据结构和字段。 2. 创建POJO类:根据XML数据结构,创建对应的Java类,使用注解或配置文件将Java类与XML字段进行映射。 3. 编写Controller:在SpringMVC中编写Controller类,使用注解标注接口访问路径和请求方式,并在方法参数中接收对应的POJO类作为参数。 4. 编写Service层:在Service层中实现业务逻辑,根据需求进行数据处理、验证和转换等操作。 5. 调用Mapper:在Service层中调用对应的Mapper接口,通过MyBatis进行数据的查询、插入、更新和删除等操作。 6. 构建XML数据:根据业务需求,从数据库中获取数据,并根据XML格式构建对应的XML数据。 7. 返回XML数据:在Controller中将构建好的XML数据作为响应返回,可以使用ResponseEntity或@ResponseBody注解将数据转换为XML格式。 8. 配置XML返回类型:在SpringMVC配置文件中添加对XML格式的支持,配置Content-Type和返回的数据格式。 通过以上步骤,我们可以在JAVA SSM框架中实现对外XML接口。在实际开发中,还可能涉及数据加密、数据校验、异常处理等相关的功能,需要根据具体需求进行相应的扩展和处理。 ### 回答3: JAVA SSM是指基于JAVA的Spring+SpringMVC+Mybatis框架的开发方式。对外XML接口是指通过XML文件暴露给外部系统访问的接口。 在JAVA SSM中,通过编写XML文件来定义对外接口。首先,我们需要在Spring的配置文件中配置一个Servlet,使用SpringMVC框架来处理HTTP请求。然后,在SpringMVC的配置文件中配置一个用于解析XML请求的控制器。 对于XML接口的处理,我们可以使用DOM、SAX或者JAXB等技术。DOM是一种将整个XML文件加载到内存中,并以树形结构表示的方式来处理XML的技术。SAX是一种基于事件驱动的处理方式,可以在解析XML文件通过回调函数来处理相应的事件。JAXB是一种将XML数据绑定到JAVA对象上的技术,可以方便地将XML数据转换为JAVA对象进行处理。 在控制器中,我们可以根据请求的XML格式进行相应的解析和处理。可以使用XPath来定位XML中的数据,或者使用解析器对XML进行解析。然后根据解析得到的数据,调用相应的业务逻辑处理模块来完成业务操作。处理完成后,再将结果转换为XML格式返回给请求方。 对外XML接口的实例可以是查询用户信息、创建订单、查询订单状态等功能。可以根据具体业务需求来定义相应的XML格式,并在控制器中进行解析和处理。在处理过程中,可以调用相应的服务层或DAO层来完成具体的业务操作。 总之,JAVA SSM对外XML接口的实例是通过XML文件来暴露给外部系统访问的接口,在JAVA SSM框架中可以使用不同的技术来处理XML请求并完成对应的业务操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值