go-micro开发RPC服务的方法及其运行原理2

简介: go-micro开发RPC服务的方法及其运行原理2

RPC服务的运行原理


这里从服务端的角度进行介绍,先来看一张图:

1689144141387.png


请大家参考代码从上往下看。

NewServer 时创建一个rpcServer,这个rpcServer还会创建一个httpTransport用于程序间网络通信,并绑定到当前rpcServer。

RegisterXXXHandler 时使用我们编写的Handler创建一个内部的service实例,然后注册这个service实例到rpcServer内部的router中,客户端请求时会用到它。这里其实可以注册任意一个带方法的类型,并不一定要定义proto协议,定义它只是为了协作更方便。

Service.Run 时会调用rpcServer的Start方法,这个方法内部会调用其绑定的httpTransport的Listen方法,然后在其创建的Listener上接收客户端连接,接收方法Accept传入了当前rpcServer的连接处理方法:rpcServer.ServeConn,有连接到来时会调用它。

当客户端请求来临时,客户端连接被交给rpcServer的ServeConn方法,然后又调用到HandleEvent方法。

然后进入rpcServer内部的router的函数ServeRequest中,通过分析请求消息,找到请求的服务名字和方法名字,在router中找到前面注册过的service,通过servcie.call,再进入function.call,最终通过反射调用到我们编写的Handler的业务方法。

有的同学可能会想,反射不是性能很低吗?!反射性能低主要是查找方法和字段的时候,调用方法的性能并不低,而查找方法和字段等的操作已经在RegisterXXXHandler的步骤中做了,并且缓存到了router中,所以性能并不受影响。


以上就是本文的主要内容了,如有问题,欢迎交流。演示代码已发布到Github:github.com/bosima/go-d…


相关文章
|
29天前
|
网络协议 Linux Go
分享一个go开发的工具-SNMP Server
分享一个go开发的工具-SNMP Server
27 0
|
1天前
|
Go 微服务
4. 参考 go 代码——服务注册与发现
4. 参考 go 代码——服务注册与发现
|
2天前
|
存储 负载均衡 监控
【Go 语言专栏】构建高可靠性的 Go 语言服务架构
【4月更文挑战第30天】本文探讨了如何利用Go语言构建高可靠性的服务架构。Go语言凭借其高效、简洁和并发性能,在构建服务架构中备受青睐。关键要素包括负载均衡、容错机制、监控预警、数据存储和服务治理。文章详细阐述了实现这些要素的具体步骤,通过实际案例分析和应对挑战的策略,强调了Go语言在构建稳定服务中的作用,旨在为开发者提供指导。
|
2天前
|
缓存 监控 测试技术
【Go语言专栏】使用Go语言构建高性能Web服务
【4月更文挑战第30天】本文探讨了使用Go语言构建高性能Web服务的策略,包括Go语言在并发处理和内存管理上的优势、基本原则(如保持简单、缓存和并发控制)、标准库与第三方框架的选择、编写高效的HTTP处理器、数据库优化以及性能测试和监控。通过遵循最佳实践,开发者可以充分利用Go语言的特性,构建出高性能的Web服务。
|
2天前
|
存储 关系型数据库 Go
【Go语言专栏】基于Go语言的RESTful API开发
【4月更文挑战第30天】本文介绍了使用Go语言开发RESTful API的方法,涵盖了路由、请求处理、数据存储和测试关键点。RESTful API基于HTTP协议,无状态且使用标准方法表示操作。在Go中,通过第三方库如`gorilla/mux`进行路由映射,使用`net/http`处理请求,与数据库交互可选ORM库`gorm`,测试则依赖于Go内置的`testing`框架。Go的简洁性和并发性使得它成为构建高效API的理想选择。
|
2天前
|
存储 Go 开发者
【Go语言专栏】Go语言中的结构体与方法
【4月更文挑战第30天】Go语言中的结构体是聚合数据类型,用于自定义复杂类型。通过`type`和`struct`关键字定义结构体,包含多个不同类型的字段。结构体实例化后,使用点操作符访问字段。方法为结构体添加行为,定义时需指定接收者(值或指针)。方法调用同样使用点操作符。匿名结构体无需命名,嵌套结构体可构建复杂数据结构。选择值或指针接收者取决于是否需要修改结构体状态。理解并熟练运用结构体和方法是编写高效Go代码的关键。
|
3天前
|
运维 Serverless Go
Serverless 应用引擎产品使用之在阿里云函数计算中,Go语言的函数计算服务Go程序没有正确打包如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
9 0
|
5天前
|
安全 算法 Java
写给Java开发的Go语言协程实践
写给Java开发的Go语言协程实践
11 0
|
6天前
|
Go 开发者
Golang深入浅出之-Go语言方法与接收者:面向对象编程初探
【4月更文挑战第22天】Go语言无类和继承,但通过方法与接收者实现OOP。方法是带有接收者的特殊函数,接收者决定方法可作用于哪些类型。值接收者不会改变原始值,指针接收者则会。每个类型有相关方法集,满足接口所有方法即实现该接口。理解并正确使用这些概念能避免常见问题,写出高效代码。Go的OOP机制虽不同于传统,但具有灵活性和实用性。
14 1
|
13天前
|
前端开发 Java Go
开发语言详解(python、java、Go(Golong)。。。。)
开发语言详解(python、java、Go(Golong)。。。。)