使用CSE/ServiceComb轻松实现接口访问控制

在基于CSE的微服务架构中,接口访问控制通常是个挑战。通过在接口上声明@Api或@ApiOperation注解,定义允许对外访问的接口,并在网关实现Handler拦截请求,检查接口是否有特定tags来阻止外部访问。这种方式简化了接口访问控制,体现了CSE在微服务治理上的优势。

在[基于CSE的微服务架构实践-基础架构](https://bbs.huaweicloud.com/blogs/8bb2c3b8366c11e9bd5a7ca23e93a891)中,我们介绍了一个典型的微服务架构,如下图。采用这种架构的微服务,通常会碰到一个问题:用户管理服务提供了大量的REST接口供其他微服务访问,但是不期望外部用户通过网关访问这些接口。

image.png

为了实现这个功能,很多开发框架要求用户在网关配置URL黑白名单,这个方法让用户实现接口访问控制变得复杂,并且容易疏漏。采用CSE可以轻松实现接口访问控制。

·定义接口是否允许对外访问

在开发REST的接口的时候,需要声明这些接口是否允许对外访问。用户可以使用@Api或者@ApiOperation声明tags的方式,标记这些接口只能够对外访问。

<span style="color:#000000">@RestSchema(schemaId = "InternalAccessDemo")
@RequestMapping(path = "/")
@Api(tags = {"INTERNAL"})
public class InternalAccessDemo {
  @GetMapping(path = "localAccess")
  public String localAccess(String name) {
    return "Hello, " + name;
  }
}</span>

·网关实现Handler拦截请求

网关实现Hanlder,检查访问的接口是否具备定义的tags,如果具备,认为是内部接口,不允许访问。

<span style="color:#000000">public class InternalAccessHandler implements Handler {
 
  @Override
  public void handle(Invocation invocation, AsyncResponse asyncReponse) throws Exception {
    if (invocation.getOperationMeta().getSwaggerOperation().getTags() != null
        && invocation.getOperationMeta().getSwaggerOperation().getTags().contains("INTERNAL")) {
      asyncReponse.consumerFail(new InvocationException(403, "", "not allowed"));
      return;
    }
    invocation.next(asyncReponse);
  }
 
}</span>

上面展示了Handler的逻辑:检查接口是否定义了名称为”INTERNAL”的tags,如果包含,则不允许访问。通过定义cse.handler.xml和cse.handler.chain.Consumer.default启用这个自定义的Handler,就轻松的实现了接口访问控制。

上面的例子从一个简单的应用场景,展现了CSE相较于与其他开发框架(比如Spring Cloud等)的优势。CSE的运行时基于OpenAPI,可以在网关、客户端等处理环节获取到调用接口的元数据信息,这些信息为用户开发公共的管控能力,提供了强大的支持。CSE的治理能力,都是基于这些信息进行独立构建的。

由于CSE基于ServiceComb提供微服务框架,且Dubbo和Java chassis底层都使用了Spring的依赖注入和bean管理系统,所以使用Dubbo的服务迁移到ServiceComb工作量较小,主要改动在依赖和配置方面。而Seata是一个开源的分布式事务解决方案。以下是集成CSEServiceComb)、Dubbo和Seata的大致方法: #### 依赖配置 在项目的`pom.xml`文件中添加相关依赖。 ```xml <!-- CSEServiceComb)依赖 --> <dependency> <groupId>com.huaweicloud</groupId> <artifactId>cse-sdk-all</artifactId> <version>最新版本号</version> </dependency> <!-- Dubbo依赖 --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> <version>对应的版本号</version> </dependency> <!-- Seata依赖 --> <dependency> <groupId>io.seata</groupId> <artifactId>seata-all</artifactId> <version>对应的版本号</version> </dependency> ``` #### 服务提供方配置 如果是服务提供方,需要进行如下配置改动。 - **替换依赖**:将Dubbo相关依赖替换为CSEServiceComb)相关依赖,同时保留必要的Dubbo配置以实现平滑过渡。 - **配置文件**:在配置文件中添加CSEServiceComb)和Seata的相关配置。例如,在`application.properties`或`application.yml`中配置CSE的服务注册中心地址、Seata的事务组等信息。 ```properties # CSE服务注册中心地址 cse.service.registry.address=http://127.0.0.1:30100 cse.service.name=my-service # Seata相关配置 seata.tx-service-group=my_tx_group seata.service.vgroup-mapping.my_tx_group=default ``` #### 服务调用方配置 服务调用方同样要进行依赖替换和配置调整。在调用服务时,需要使用CSEServiceComb)的服务发现机制来定位服务,同时结合Seata实现分布式事务管理。 #### Seata配置 需要启动Seata Server,并根据业务需求配置Seata的事务模式(如AT、TCC等)。在应用中添加Seata的全局事务注解,确保业务逻辑在分布式事务的管理下执行。 ```java import io.seata.spring.annotation.GlobalTransactional; import org.springframework.stereotype.Service; @Service public class MyService { @GlobalTransactional public void businessMethod() { // 业务逻辑 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值