背景
根据上篇文章的服务提供者的代码为入口,我们分析下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
补充中。。。。