[pravega-019] pravega源码分析--Controller子项目--ControllerServiceStarter启动的服务--服务端grpc启动

本文详细解析了gRPC服务的启动过程及安全调用机制,从Starter中启动grpc服务到GRPCServer的配置,再到ControllerServiceImpl的安全验证与功能调用,最后深入ControllerService的具体功能实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.在Starter里,启动了grpc服务:

// Start RPC server.
            if (serviceConfig.getGRPCServerConfig().isPresent()) {
                grpcServer = new GRPCServer(controllerService, serviceConfig.getGRPCServerConfig().get(), requestTracker);
                grpcServer.startAsync();
                log.info("Awaiting start of rpc server");
                grpcServer.awaitRunning();
            }

这里,GRPCServer是guava多线程框架的类,主要是服务管理,不涉及具体实现,rpc调用的功能代码,在controllerService里。

2.GRPCServer的构造函数的builder

ServerBuilder<?> builder = ServerBuilder
                .forPort(serverConfig.getPort())
                .addService(ServerInterceptors.intercept(new ControllerServiceImpl(controllerService, authHelper, requestTracker,
                                serverConfig.isReplyWithStackTraceOnError()),
                        RPCTracingHelpers.getServerInterceptor(requestTracker)));

在这里,controllerService作为参数,传递给ControllerServiceImpl类。

3.ControllerServiceImpl类,是一个“代理”类,先做校验和安全检查,然后再把参数传递给controllerService实现具体的功能。比如,它的createScope函数是这样的

    public void createScope(ScopeInfo request, StreamObserver<CreateScopeStatus> responseObserver) {
        RequestTag requestTag = requestTracker.initializeAndTrackRequestTag(requestIdGenerator.get(), "createScope", request.getScope());
        log.info(requestTag.getRequestId(), "createScope called for scope {}.", request.getScope());
        authenticateExecuteAndProcessResults(() -> this.authHelper.checkAuthorization(request.getScope(), AuthHandler.Permissions.READ_UPDATE),
                delegationToken -> controllerService.createScope(request.getScope()),
                responseObserver, requestTag);
    }

authenticateExecuteAndProcessResults函数做安全认证,然后执行controllerService.createScope。

4.ControllerService类实现具体功能,比如以createScope为例,检查参数没有问题,就调用streamStore.createScope。

    public CompletableFuture<CreateScopeStatus> createScope(final String scope) {
        Exceptions.checkNotNullOrEmpty(scope, "scope");
        try {
            NameUtils.validateScopeName(scope);
        } catch (IllegalArgumentException | NullPointerException e) {
            log.warn("Create scope failed due to invalid scope name {}", scope);
            return CompletableFuture.completedFuture(CreateScopeStatus.newBuilder().setStatus(
                    CreateScopeStatus.Status.INVALID_SCOPE_NAME).build());
        }
        return streamStore.createScope(scope);
    }

StreamStore是StreamMetadataStore类的实例化。前面已经分析过了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值