刨根问底系列之grpc-java服务提供者源码分析

536 阅读1分钟

背景

根据上篇文章的服务提供者的代码为入口,我们分析下grpc服务提供者的源码和流程

功能

  • 服务绑定
  • transportServer和nettyServer创建

创建grpc的服务对象


public class HelloWorldServer {

    private Server server;

    private void start() throws IOException {
        /* The port on which the server should run */
        int port = 50051;
        server = Grpc.newServerBuilderForPort(port, InsecureServerCredentials.create())
                .addService(new GreeterImpl())
                .build()
                .start();
       
    }
}
  • 定义端口为50051
  • 不使用服务器标识或加密。

创建服务对象。io.grpc.Grpc#newServerBuilderForPort


public static ServerBuilder<?> newServerBuilderForPort(int port, ServerCredentials creds) {
  return ServerRegistry.getDefaultRegistry().newServerBuilderForPort(port, creds);
}

  • ServerRegistry.getDefaultRegistry() 获取默认的注册器
public static synchronized ServerRegistry getDefaultRegistry() {
  if (instance == null) {
    List<ServerProvider> providerList = ServiceProviders.loadAll(
        ServerProvider.class,
        Collections.<Class<?>>emptyList(),
        ServerProvider.class.getClassLoader(),
        new ServerPriorityAccessor());
    instance = new ServerRegistry();
    for (ServerProvider provider : providerList) {
      logger.fine("Service loader found " + provider);
      if (provider.isAvailable()) {
        instance.addProvider(provider);
      }
    }
    instance.refreshProviders();
  }
  return instance;
}
  • 使用了 ServiceLoader.load

io.grpc.ServerRegistry#newServerBuilderForPort

ServerBuilder<?> newServerBuilderForPort(int port, ServerCredentials creds) {
  List<ServerProvider> providers = providers();
  if (providers.isEmpty()) {
    throw new ProviderNotFoundException("No functional server found. "
        + "Try adding a dependency on the grpc-netty or grpc-netty-shaded artifact");
  }
  StringBuilder error = new StringBuilder();
  for (ServerProvider provider : providers()) {
    ServerProvider.NewServerBuilderResult result
        = provider.newServerBuilderForPort(port, creds);
    if (result.getServerBuilder() != null) {
      return result.getServerBuilder();
    }
    error.append("; ");
    error.append(provider.getClass().getName());
    error.append(": ");
    error.append(result.getError());
  }
  throw new ProviderNotFoundException(error.substring(2));
}

这个主要功能校验ServerProvider

注册服务类 io.grpc.ServerBuilder#addService(io.grpc.BindableService)

io.grpc.Server#start 启动类

public ServerImpl start() throws IOException {
  synchronized (lock) {
    // check 状态
    checkState(!started, "Already started");
    checkState(!shutdown, "Shutting down");
    // Start and wait for any ports to actually be bound.

    ServerListenerImpl listener = new ServerListenerImpl();
    transportServer.start(listener); // 该方法最关键的地方
    executor = Preconditions.checkNotNull(executorPool.getObject(), "executor");
    started = true;
    return this;
  }
}

io.grpc.internal.InternalServer#start

补充中。。。。