启动go服务_go微服务框架go-micro深度学习 rpc方法调用过程详解
摘要: 上一篇帖子go微服务框架go-micro深度学习(三) Registry服务的注册和发现详细解释了go-micro是如何做服务注册和发现在,服务端注册server信息,client获取server的地址信息,就可以和服务建立连接,然后就可以进行通信了。
上一篇帖子go微服务框架go-micro深度学习(三) Registry服务的注册和发现详细解释了go-micro是如何做服务注册和发现在,服务端注册server信息,client获取server的地址信息,就可以和服务建立连接,然后就可以进行通信了。这篇帖子详细说一下,go-micro的通信协议、编码,和具体服务方法的调用过程是如何实现的,文中的代码还是我github上的例子: gomicrorpc
go-micro 支持很多通信协议:http、tcp、grpc等,支持的编码方式也很多有json、protobuf、bytes、jsonrpc等。也可以根据自己的需要实现通信协议和编码方式。go-micro 默认的通信协议是http,默认的编码方式是protobuf,我就以默认的方式来分解他的具体实现。
服务的启动
go-micro在启动的时候会选择默认通信协议http和protobuf编码方式,但他是如何路由到具体方法的?在go-micro服务端启动的时候我们需要注册Handler,也就是我们具体实现结构体 ,如例子中注册方法时,我们调用的RegisterSayHandler方法
// 注册 Handlerrpcapi.RegisterSayHandler(service.Server(), new(handler.Say))
这个方法内部的体实现主要是利用了反射的力量,注册的对象是实现了rpc接口的方法,如我们的Say实现了SayHandler。go-micro默认的router会利用反射把Say对象的信息完全提取出来,解析出结构体内的方法及方法的参数,保存到一个map内-> map[结构体名称][方法信息集合]
具体的实现在rpc_router.go里router的Handle(Handler)方法,组织完成后map的是下图这样,保存了很多反射信息,用以将来调用。
下面是这个方法的主要代码,删除了一些,很希望大家读一下rpc_router.go里面的代码,prepareMethod方法是具体利用反射提取信息的方法。
func (router *router) Handle(h Handler) error { router.mu.Lock() defer router.mu.Unlock() // .... rcvr := h.Handler() s := new(service) s.typ = reflect.TypeOf(rcvr) s.rcvr = reflect.ValueOf(rcvr) // check name // .... s.name = h.Name() s.method = make(map[string]*methodType) // Install the methods for m := 0; m < s.typ.NumMethod(); m++ { method := s.typ.Method(m) // prepareMethod会把所有解析的信息返回来 if mt := prepareMethod(method); mt != nil { s.method[method.Name] = mt } } // ..... // save handler router.serviceMap[s.name] = s return nil}
serviceMap里保存的就是反射后的信息,下图是我用goland的debug得到的保存信息
路由信息处理完后,主要的工作就已经完成了,然后注册服务并启动服务,启动的服务是一个http的服务,我们可以看一下http_transport.go里的代码
服务的简单流程图如下 ,选择通信协议和编码方式->注册服务方法->启动服务并注册服务信息
客户端调用服务方法
客户端在启动的时候也要选择默认的通信协议http,和protobuf编码。客户端在调用rpc方法的时候如:
rsp, err := client.Hello(context.Background(), &model.SayParam{Msg: "hello server"})
go-micro为我们自动生成的rpcapi.micro.go里我们可以看一上Hello的具体实现,没有几行代码,但内部还是做了很多工作
func (c *sayService) Hello(ctx context.Context, in *model.SayParam, opts ...client.CallOption) (*model.SayResponse, error) { req := c.c.NewRequest(c.name, "Say.Hello
启动go服务_go微服务框架go-micro深度学习 rpc方法调用过程详解相关推荐
- go微服务框架go-micro深度学习(五) stream 调用过程详解
上一篇写了一下rpc调用过程的实现方式,简单来说就是服务端把实现了接口的结构体对象进行反射,抽取方法,签名,保存,客户端调用的时候go-micro封请求数据,服务端接收到请求时,找到需要调用调 ...
- Java数据持久层框架 MyBatis之API学习八(Java API详解)
对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...
- 01 微服务和微服务框架 —— SpringCloud
一.微服务介绍 1. 什么是微服务 在介绍微服务时,首先得先理解什么是微服务,顾名思义,微服务得从两个方面去理解,什么是"微".什么是"服务", 微 狭义来讲就 ...
- 架构解密从分布式到微服务:微服务架构到底是什么?
架构解密从分布式到微服务:微服务架构到底是什么? https://www.toutiao.com/i6937907188505657870/?tt_from=weixin&utm_campai ...
- SpringCLoud实战微服务之——微服务简介以及入门使用
微服务概述 微服务是什么?微服务解决了什么问题?微服务有什么特点? 单体架构是什么? 一个归档包包含了应用所有功能的应用程序,我们通常称之为单体应用.架构单体应用的架构风格,我们称之为单体架构,这是一 ...
- 什么是微服务?微服务架构的优缺点、应用
什么是微服务?微服务架构的优缺点.应用? 微服务(micro services)这个概念不是新概念,很多公司已经在实践了,例如亚马逊.Google.FaceBook.Alibaba.微服务架构模式(M ...
- 基于阿里云容器服务的微服务实践 - Part 1. 微服务与Docker
基于阿里云容器服务的微服务实践 基于阿里云容器服务的微服务实践 - Part 1. 微服务与Docker 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页:http://blo ...
- SpringCloud一、前提概述、相关微服务和微服务架构理论知识、微服务技术栈有哪些、
①前提概述.微服务架构springcloud的相关学习. 前提知识+相关说明 1.目前,我们学习到最后的微服务架构SpringCloud,基本上需要熟悉以前的学习内容和知识:springmvc.spr ...
- 为什么选择微服务架构? 微服务架构的10个核心优势 总结
为什么选择微服务架构? 微服务架构的10个核心优势 总结 文章目录 为什么选择微服务架构? 微服务架构的10个核心优势 总结 1. 什么是微服务? 2. 微服务架构有哪些特征? 1)通过服务实现组件化 ...
最新文章
- centos httpd服务做yum本地源,以及安装Mysql
- LOAD DATA INFILE 语法
- asp.net调试方法
- OpenBSD基金会收到锤子科技约140万捐赠款
- 《Python编程从入门到实践》记录之字典遍历
- Markdown自定义CSS样式
- python代码手机壁纸_python批量下载壁纸的实现代码
- 学习java一般多久
- Paraview源码解析2:vtkArrowGlyphFilter类
- 电视机进入工厂模式,factory,怎么退出
- 工作说明书(SOW)
- 神奇的泡泡java游戏,神奇的泡泡作文400字
- Maix Bit(K210) 裸机开发教程(六)摄像头使用
- YOLO格式的DOTA遥感数据集(HBB水平框)
- 同义词,近义词,反义词收集
- 【区间选点问题】 N个闭区间,最少需要多少个点,让每个闭区间都有一个点
- 不同计算机通过家庭组无法共享的是,windows7开家庭组与其他版本系统共享文件失败的解决方法...
- 登录界面——渗你千千万万遍
- 「学习笔记」黑马面面布局开发
- 【HTML】语义化标签
热门文章
- 安卓添加滚轮代码_[按键精灵手机版教程]安卓实战——制作天天酷跑脚本(2)...
- 怎么关闭虚拟机服务器,ESXI | 命令行 | 强行关闭虚拟机进程 | 无法远程访问服务器...
- 苹果app商品定价_苹果官网闹乌龙,千元产品变百元!多人闻风薅羊毛!
- java中流关闭如何打开_关于java中流关闭的问题
- ReentrantLock实现原理
- 使用yum命令安装服务时,一直卡在Loaded plugins: fastestmirror Determining fastest mirrors
- java protobuf extend_如何使用protobuf extend和编写protobuf插件
- java cache组件_组件之Cache篇
- buck电路pscad仿真_十二脉波整流器谐波抑制控制策略仿真
- java百度结果的正则表达式_java正则表达式