gRPC-Server启动,深入源码探究,一起弄懂它

Posted 技术人技术事

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gRPC-Server启动,深入源码探究,一起弄懂它相关的知识,希望对你有一定的参考价值。

gRPC已经断断续续写了七篇文章了,但基本都是属于gRPC的使用上,旨在帮助大家如何使用gRPC,了解gRPC的功能以及特性,并通过示例代码让大家能快速入门,对开发人员而言,一个可运行的demo是最好的教程,文章连接和可运行demo如下,今天我们开始深入gRPC服务是怎么启动的,一起看他的源码,揭开他的神秘面纱。

 
   
   
 
  1. https://github.com/sunpengwei1992/go_common/tree/master/grpc/helloworld_demo

一个gRPC-Server启动主要以下几行代码,如下一个简单的gRPC-Server就启动起来了,但其流程可不简单,简单的背后意味着封装,一行一行来分析

下面这一行代码从表面很简单,创建了一个grpServer实例,但是这个实例的参数以及入参的参数是非常多了,弄明白了这些参数的含义,后面代码的阅读会舒畅很多

 
   
   
 
  1. gRpcServer := grpc.NewServer()`

分析NewServer源码

gRPC-Server启动,深入源码探究,一起弄懂它

上面的代码,总体四个步骤,当然,其中也有诸多细节,暂不深追究,后面会说到,且往下看

  1. 接受入参参数切片,并把默认参数全部赋值到入参上

  2. 构造Server实例

  3. 判断是否tracing(链路跟踪),IsOn(返回channelz数据收集是否打开)

  4. 返回server实例

然后我们说一下入参和返回Server的结构体的参数组成都是什么含义?这两个结构体至关重要,请仔细阅读

ServerOption入参

gRPC-Server启动,深入源码探究,一起弄懂它

cred证书是接口grpc内部是有实现的代码包如下,我们使用是只需要,调用方法传入证书文件就可以了

 
   
   
 
  1. google.golang.orggrpc@v1.23.1credentialscredentials.go

  2. creds, err := credentials.NewClientTLSFromFile("E:\server.pem", "")

inTapHandle tap.ServerInHandle定义在服务器端创建新流之前运行的函数,如果你定义的这个 ServerInhandler返回非nil错误,则服务端不会创建流,并将一个rststream流发送给具有refusedstream的客户端,它旨在用于您不想服务端创建新的流浪费资源来接受新客户端的情况,比如微服务常见的限流功能,注意,他是在每个conn的协程中执行,而不是在每个rpc的协程中执行中执行。statsHandler stats.Handler这个接口中定义的方法主要是为统计做处理的,比如一次调用中的rpc和conn,默认的实现有如下

 
   
   
 
  1. ClientHandler //主要是Client端服务的(rpc,conn)跟踪和状态统计

  2. ServerHandler //主要是Server端服务的(rpc,conn)跟踪和状态统计

  3. statshandler //grpc测试用的

Server参数

gRPC-Server启动,深入源码探究,一起弄懂它

分析RegisterHelloServiceServer源码

我们看到最上面的StartServer代码中调用了pb(proto buffer)的代码,这是自动生成的,这个方法的作用要把HelloService的实现注册到Server上,我们看下面的代码,这个方法的入参有两个,一个是NewServer创建的grpcServer实例,一个是HelloService的实现类,然后调用grpcServer的RegisterService的方法。

gRPC-Server启动,深入源码探究,一起弄懂它

RegisterService方法如下,registerservice将服务及其实现注册到grpc服务器。它是从idl(接口描述语言 Interface Description Lanauage)的代码中调用的。这必须是在调用SERVE方法之前调用。s.register(sd,ss) 方法最终是把服务的名称的和服务的描述信息注册到上面Server中的 map[string]*service

gRPC-Server启动,深入源码探究,一起弄懂它

分析gRpcServer.Serve(lis)源码

Server()方法就正式开始监听客户端的连接,并开启协程处理客户端连接,方法核心步骤如下

  1. 加锁,初始化一些参数

  2. defer处理最后的资源情况

  3. for循环接受客户端的连接,每一个客户端的连接,开启一个协程处理

我们可以看到 grpcServer整体启动流程是非常清晰的,而且go的代码阅读起来也比较清爽,但命名上大多都是缩写,需要结合上下文以及注释来仔细观察,今天的内容你掌握了吗?希望大家还是亲自去阅读一下源码,结合文章一起对照学习,这样记忆和理解也更深入,包括前面的一些基础练习也要自己实践,实践才是真理。


以上是关于gRPC-Server启动,深入源码探究,一起弄懂它的主要内容,如果未能解决你的问题,请参考以下文章

深入探究ZIPKIN调用链跟踪——拓扑Dependencies篇

mybatis源码探究(-)MapperProxyFactory&MapperProxy

Java技术专题「String技术系列」带你一起探究字符串不可变的特性

深入HotSpot虚拟机源码探究synchronized底层实现原理万字总结synchronized

深入HotSpot虚拟机源码探究synchronized底层实现原理万字总结synchronized

walker代理深入浅出——程序的启动原理(下)(探究 UIWindow)