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类的实例化。前面已经分析过了。