前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >gRPC-Server启动,深入源码探究,一起弄懂它

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

作者头像
阿伟
发布2019-10-22 17:56:27
4.2K0
发布2019-10-22 17:56:27
举报
文章被收录于专栏:GoLang那点事GoLang那点事

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

  1. gRPC的特性和背后设计的原则
  2. gRPC的接口描述语言ProtoBuffer
  3. gRPC之GoLang入门HelloWord
  4. gRPC之流式调用原理http2协议分析
  5. gRPC认证的多种方式实践
  6. gRPC拦截器那点事,希望帮到你
  7. gRPC注册中心,常用的注册中心你懂了吗?AP还是CP
代码语言:javascript
复制
https://github.com/sunpengwei1992/go_common/tree/master/grpc/helloworld_demo

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

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

代码语言:javascript
复制
gRpcServer := grpc.NewServer()`
分析NewServer源码

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

  1. 接受入参参数切片,并把默认参数全部赋值到入参上
  2. 构造Server实例
  3. 判断是否tracing(链路跟踪),IsOn(返回channelz数据收集是否打开)
  4. 返回server实例

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

ServerOption入参

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

代码语言:javascript
复制
\google.golang.org\grpc@v1.23.1\credentials\credentials.go
creds, err := credentials.NewClientTLSFromFile("E:\\server.pem", "")

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

代码语言:javascript
复制
ClientHandler //主要是Client端服务的(rpc,conn)跟踪和状态统计
ServerHandler //主要是Server端服务的(rpc,conn)跟踪和状态统计
statshandler //grpc测试用的
Server参数
分析RegisterHelloServiceServer源码

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

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

分析gRpcServer.Serve(lis)源码

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

  1. 加锁,初始化一些参数
  2. defer处理最后的资源情况
  3. for循环接受客户端的连接,每一个客户端的连接,开启一个协程处理

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GoLang那点事 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 分析NewServer源码
    • ServerOption入参
      • Server参数
      • 分析RegisterHelloServiceServer源码
      • 分析gRpcServer.Serve(lis)源码
      相关产品与服务
      微服务引擎 TSE
      微服务引擎(Tencent Cloud Service Engine)提供开箱即用的云上全场景微服务解决方案。支持开源增强的云原生注册配置中心(Zookeeper、Nacos 和 Apollo),北极星网格(腾讯自研并开源的 PolarisMesh)、云原生 API 网关(Kong)以及微服务应用托管的弹性微服务平台。微服务引擎完全兼容开源版本的使用方式,在功能、可用性和可运维性等多个方面进行增强。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档