cover_image

探究go-zero是如何基于grpc进一步扩展

智汇云 360智汇云开发者
2025年02月14日 03:33

1. 为什么要在grpc上扩展?

grpc主要在于解决微服务领域中rpc通信的标准策略,针对rpc的通信方式、协议编码、请求阐述等做统一的规范约定,这样在跨语言跨项目的时候双方之间的通信也会轻松。

图片

而目前主流框架在使用grpc的时候在其基础上进行扩展和增强功能如下几点:

  1. 需要自定义的功能:gRPC提供了一些常见的功能,如请求-响应模式、流式传输等。但是,如果你需要实现一些特定的功能,如认证、授权、日志记录、监控等,可能需要在gRPC的基础上进行扩展开发。
  2. 需要与其他技术栈结合:虽然gRPC在Go语言中非常流行,但在某些情况下,你可能需要与其他技术栈进行结合,如数据库、消息队列、缓存等。在这种情况下需要编写自定义的代码来与这些技术栈进行交互。
  3. 需要适应特定的业务需求:每个项目都有不同的业务需求。尽管gRPC提供了很多功能,但你可能需要根据你的业务需求进行定制化开发,以满足特定的需求。
  4. 需要性能优化:尽管gRPC在性能方面表现出色,但在某些场景下可能需要进行性能优化。你可能需要对请求-响应模式、流式传输等进行优化,以提高系统的性能和吞吐量。
尽管gRPC是一个强大的框架,但在特定的业务需求下,需要在其基础上进行扩展开发或构建新的项目。这样可以满足特定的需求,提高系统的性能和灵活性。

2. go-zero的目录结构

图片
go-zero中的目录结构里主要包含core、internal、zrpc。
  • core: 包含go-zero框架整体的核心内库工具包,如redis、MySQL、熔断器等机制
  • internal:是针对整个框架定义的内部处理方式,包含服务的处理实例、请求编码、健康检测、分析。
  • zrpc:是rpc服务端与客户端的调用连接入口,封装了关于服务端和客户端的操作。

3. go-zero如何适配grpc

目前已知go-zero是使用了grpc作为底层rpc的调度机制,因此在服务的定义与请求调度上是需要与grpc的方式适配的。
go-zero的解决方案是在grpc的类库实例对象上做一层适配的调度封装进行解决,在使用goctl命令的时候它会自动为我们创建好这一层封装。
图片
在go-zero的入口文件中,先创建好整个服务系统所使用的服务核心对象,然后再创建zrpc的服务对象并对整个程序启动。
图片
而在zrpc.MustNewServer中第一个参数是注册好服务的配置信息,而第二个参数则是完成对grpc服务的注册,参数类型是方法类型,在类型中要求传递grpcServer对象。
图片
结合如上的代码即可完成grpc的服务注册。

4. 服务初始化

我们再看看服务的初始化:
图片
在服务的初始化中并不复杂,主要做了下面的事情
  1. 先创建一个用于记录整个系统运行中各项指标的工具
  2. 验证服务是否默认使用的是etcd作为服务发现机制,以此创建相应的rpc服务对象
  3. 并设置好服务名及指标记录的拦截器
  4. 设置服务的信息其中包含prometheus/trace等监听。
我们对代码往下看在RpcServer中还提供了关于grpc请求信息及拦截器的设置
图片
rpcserver
server = internal.NewRpcServer(c.ListenOn, c.Middlewares, serverOptions...)继续往下分析。
图片
可以看到的是最终构建并返回的实际rpc调度的服务对象,在内容中设置好基础rpcServer,中间件,监控。
rpcpubserver
图片
在rpcPubServer中,则会基于etcd做注册中心,并且向etcd中注册了服务对象

5. 服务启动

关于服务的启动基于代码的跟踪,主要核心的代码即在zrpc/internal/rpcserver.go中。
图片
整体代码在启动的过程中并不复杂,程序中默认使用tcp作为rpc的基础通信协议,然后设置好grpc的拦截器并创建好grpc的server对象,顾在这里可以看出go-zero是在start的时候才去进行监听创建grpc服务。
在服务创建后就执行register方法,该方法在前面入口的时候就已看到了具体传递的参数内容
图片
在后续的内容中设置好对应的健康检测的机制,加载服务停止或非正常情况下的停止机制,然后启动服务。
图片

6. 总结

通过对上述内容的了解,基本清楚go-zero是如何与grpc的结合,在服务和调度的时候是对grpc的方式进行了一层适配,而因使用goctl的关系对用户在开发的时候是无感知的。
而在go-zero的服务初始化中及就默认使用etcd作为服务的注册发现机制,如果没有设置会以普通的rpc服务去启动而没有做注册动作,在go-zero调用start的时候最后才去创建出grpc并运行。
由此:如果我们需要使用consol作为服务注册中心的话,需要自己在启动入口进行注册。

END

360智汇云是以"汇聚数据价值,助力智能未来"为目标的企业应用开放服务平台,融合360丰富的产品、技术力量,为客户提供平台服务。
目前,智汇云提供数据库、中间件、存储、大数据、人工智能、计算、网络、视联物联与通信等多种产品服务以及一站式解决方案,助力客户降本增效,累计服务业务1000+。
智汇云致力于为各行各业的业务及应用提供强有力的产品、技术服务,帮助企业和业务实现更大的商业价值。
官网:https://zyun.360.cn 或搜索“360智汇云
客服电话:4000052360
欢迎使用我们的产品!😊
关注公众号,干货满满的前沿技术文章等你来。想看哪方面内容,也欢迎留言和我们交流!

360智汇云 · 目录
上一篇应对流量洪峰:ingress-nginx弹性化改造与HPA压测全解析下一篇360在离线混部 koordinator 和 hadoop-yarn 方案
继续滑动看下一个
360智汇云开发者
向上滑动看下一个