摘要: 上一篇帖子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方法调用过程详解相关推荐

  1. go微服务框架go-micro深度学习(五) stream 调用过程详解

        上一篇写了一下rpc调用过程的实现方式,简单来说就是服务端把实现了接口的结构体对象进行反射,抽取方法,签名,保存,客户端调用的时候go-micro封请求数据,服务端接收到请求时,找到需要调用调 ...

  2. Java数据持久层框架 MyBatis之API学习八(Java API详解)

    对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...

  3. 01 微服务和微服务框架 —— SpringCloud

    一.微服务介绍 1. 什么是微服务 在介绍微服务时,首先得先理解什么是微服务,顾名思义,微服务得从两个方面去理解,什么是"微".什么是"服务", 微 狭义来讲就 ...

  4. 架构解密从分布式到微服务:微服务架构到底是什么?

    架构解密从分布式到微服务:微服务架构到底是什么? https://www.toutiao.com/i6937907188505657870/?tt_from=weixin&utm_campai ...

  5. SpringCLoud实战微服务之——微服务简介以及入门使用

    微服务概述 微服务是什么?微服务解决了什么问题?微服务有什么特点? 单体架构是什么? 一个归档包包含了应用所有功能的应用程序,我们通常称之为单体应用.架构单体应用的架构风格,我们称之为单体架构,这是一 ...

  6. 什么是微服务?微服务架构的优缺点、应用

    什么是微服务?微服务架构的优缺点.应用? 微服务(micro services)这个概念不是新概念,很多公司已经在实践了,例如亚马逊.Google.FaceBook.Alibaba.微服务架构模式(M ...

  7. 基于阿里云容器服务的微服务实践 - Part 1. 微服务与Docker

    基于阿里云容器服务的微服务实践 基于阿里云容器服务的微服务实践 - Part 1. 微服务与Docker 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页:http://blo ...

  8. SpringCloud一、前提概述、相关微服务和微服务架构理论知识、微服务技术栈有哪些、

    ①前提概述.微服务架构springcloud的相关学习. 前提知识+相关说明 1.目前,我们学习到最后的微服务架构SpringCloud,基本上需要熟悉以前的学习内容和知识:springmvc.spr ...

  9. 为什么选择微服务架构? 微服务架构的10个核心优势 总结

    为什么选择微服务架构? 微服务架构的10个核心优势 总结 文章目录 为什么选择微服务架构? 微服务架构的10个核心优势 总结 1. 什么是微服务? 2. 微服务架构有哪些特征? 1)通过服务实现组件化 ...

最新文章

  1. centos httpd服务做yum本地源,以及安装Mysql
  2. LOAD DATA INFILE 语法
  3. asp.net调试方法
  4. OpenBSD基金会收到锤子科技约140万捐赠款
  5. 《Python编程从入门到实践》记录之字典遍历
  6. Markdown自定义CSS样式
  7. python代码手机壁纸_python批量下载壁纸的实现代码
  8. 学习java一般多久
  9. Paraview源码解析2:vtkArrowGlyphFilter类
  10. 电视机进入工厂模式,factory,怎么退出
  11. 工作说明书(SOW)
  12. 神奇的泡泡java游戏,神奇的泡泡作文400字
  13. Maix Bit(K210) 裸机开发教程(六)摄像头使用
  14. YOLO格式的DOTA遥感数据集(HBB水平框)
  15. 同义词,近义词,反义词收集
  16. 【区间选点问题】 N个闭区间,最少需要多少个点,让每个闭区间都有一个点
  17. 不同计算机通过家庭组无法共享的是,windows7开家庭组与其他版本系统共享文件失败的解决方法...
  18. 登录界面——渗你千千万万遍
  19. 「学习笔记」黑马面面布局开发
  20. 【HTML】语义化标签

热门文章

  1. 安卓添加滚轮代码_[按键精灵手机版教程]安卓实战——制作天天酷跑脚本(2)...
  2. 怎么关闭虚拟机服务器,ESXI | 命令行 | 强行关闭虚拟机进程 | 无法远程访问服务器...
  3. 苹果app商品定价_苹果官网闹乌龙,千元产品变百元!多人闻风薅羊毛!
  4. java中流关闭如何打开_关于java中流关闭的问题
  5. ReentrantLock实现原理
  6. 使用yum命令安装服务时,一直卡在Loaded plugins: fastestmirror Determining fastest mirrors
  7. java protobuf extend_如何使用protobuf extend和编写protobuf插件
  8. java cache组件_组件之Cache篇
  9. buck电路pscad仿真_十二脉波整流器谐波抑制控制策略仿真
  10. java百度结果的正则表达式_java正则表达式