导语

在上一篇博客中我们主要介绍了什么是微服务,读者可以用这篇文章进行简单的入门,当然仅仅阅读这一篇仍然是不够的,还需要广泛浏览相关概念,逐渐加深印象,可以更好的理解,在本篇文章中,主要分享了微服务框架的选型即Go-Mico,了解Go-Mico与微服务的关系。

Go-Mico是什么

这里采用官方解释,Go Micro是一个插件式的RPC框架。它用于分布式系统开发。这个插件抽象出了分布式系统的细节,下面这个图是它的一个架构图

启动服务源码剖析

看过了架构图,我们趁热打铁看一下服务是如何启动的,启动时又有哪些配置参数,我们可以看到服务的运行需要最基础的三个步骤

第一步:创建服务

其中的exmple便是我们的服务名,在框架中,经常使用go.micro.srv做前缀。在这个函数中参数是micro.Option函数数组,这些函数用来包装启动参数和配置选项。参数便是配置选项。

 service := micro.NewService(micro.Name("go.micro.srv.example"),)

为了更好的理解我们对源码进行简单的分析


在上面的函数中可以看到最终配置选项进行了我们的newService()函数中,在这个函数中,首先做的就是对我们的配置进行了初始化,让我们看看是如何初始化的。

上面的图中可以看到首先就是对options的操作,很明显,我们可以了解到options是一个结构体,现在让我们来看一看这个结构体

对于上面的属性我们可以大致了解到,原来我们的配置最终会被分配到这里。对所有的配置进行循环,然后逐个的进行配置,具体的怎么配置大家有兴趣的可以进行源码研究。
配置初始化完成后呢?我们再看newService()函数中下一步做了什么,很明显的是我们使用返回的options.ClientclientWrapper结构体进行的赋值操作。现在我们看看这个结构体的具体内容:

可以看到源码中使用options.Client进行了客户端的赋值,同时定义了客户端的header,而header便是由我们传来的服务名进行赋值。最终返回给我们service的客户端。

第二步:初始化服务

 service.Init()

对于这一步,Init()源码如下主要是对我们的的配置,再一次进行封装,并同时初始化我们的命令行参数,这样的目的在于我们在使用命令行时,可以查看更多详细的信息。这里做了解。

第三步:运行服务

 if err := service.Run(); err != nil {log.Fatal(err)
}

在这一步中,Run()函数的源码如下

在函数体中可以看到首先便是启动服务,然后定义了一个信号通道,并规定了三个信号量,同时使用select进行监听我们的通道,一旦检测到相关信号,我们的服务便会停止。

syscall.SIGTERM 结束进程
syscall.SIGINT ctrl + c
syscall.SIGQUIT ctrl + \

Go-Mico和分布式系统

为什么Go-Micro适用于分布式系统中呢,我们带着疑问来看一下Go-Micro都做了什么。还是看我们的架构图
在架构图的最下面一层我们可以看到有5个核心模块

broker负责消息
Codec负责编码
Registry负责注册发现
Selector负责负载均衡
Transport负责接收请求与响应。

熟悉过分布式系统的同学应该知道,在分布式系统中,有服务发现,负载均衡、同步/异步通信、消息编码等,原来Go-Micro为我们抽象出了这些细节,这样我们就可以使用Go-Micro更快的进行分布式开发了。

特性

  • 注册机制:服务在启动的时候我们可以使用consul,etcd,zookeeper,dns,gossip等提供支持,同时Go-Micro提供了服务发现,在服务注册时可以成功发现,如果服务死亡,服务也会被清除。
  • 选择器:负载均衡中,选择器提供了一些算法,为我们选择合适的服务。
  • 传输:传输支持多种形式,包括http,rabbitMQ,WebSocket等
  • 代理:提供了异步发布/订阅通信的接口,这是事件驱动架构和微服务的基本要求之一,经常使用RabbitMQ,当然在go-plugins也提供了其它消息代理。
  • 编解码器:对于Json,protobuf,等语言有着强大的解码。
  • Docker部署:支持Docker部署,并在Docker拥有Micro的官方镜像。

结语

微服务是一个很好的架构,但是微服务如何使用同样是需要考虑,对于小型团队,小型业务,如果功能单一,业务功能没有任何必要用微服务,当然如果你正在学习中,可以用来练手。在真正的项目中,微服务更多的使用在复杂的系统,微服务的实施对架构能力和技术能力是要求都很高,因为咋微服务中,服务的管理,服务的通信,监控,治理都需要系统的考虑。

推荐阅读

  • RabbitMQ系列笔记封装篇
  • 开发环境搭建(持续更新中)
  • RabbitMQ系列笔记介绍篇
  • Golang中Modle包的使用
  • goriila context深入学习笔记
  • Go Context深入学习笔记
  • 基于Nginx和Consul构建高可用及自动发现的Docker服务架构
  • 关于log日志的深入学习笔记

本文欢迎转载,转载请联系作者,谢谢!

  • 公众号【常更新】:陌无崖
  • GitHub:https://github.com/yuwe1
  • CSDN【看心情更新】: https://blog.csdn.net/weixin_40051278
  • 博客地址【定期更新】:https://mowuya.cn/

微服务系列笔记之Go-Micro相关推荐

  1. 微服务系列笔记之Mico Api详解

    导语 上一篇文章中有了入门案例,现在是不是有了很好的理解,不过有个前提是你需要了解grpc技术,简单的来说grpc是一个通信框架,micro是类似的一个通信框架,只不过这个框架应用于微服务中.因此如果 ...

  2. 微服务系列笔记之Go-Micro入门案例

    导语 了解了Micro的基本框架之后,我们做一个简单的例子来实现客户端与服务端的通信,在了解本篇文章之前,需要你对rpc.grpc通信技术有所了解. 准备工作 ## 安装go-micro go get ...

  3. 微服务系列笔记之什么是微服务

    导语 微服务(Microservice Architecture)是近几年流行的一种架构思想,它的概念没有很明确的指出.ThoughtWorks 公司的首席科学家 Martin Fowler曾经解释过 ...

  4. 微服务系列笔记之API事件订阅模式和元数据模式

    导语 今天继续总结关于micro api的其它用法.因为每个知识点基本类似,在这篇笔记中了event和meta做对比.本系列的笔记全部参考Go Micro官方源码及博客,比较多,有兴趣的可以去研究. ...

  5. 什么是微服务_微服务系列笔记:什么是微服务?

    作者 | 莫无崖 导语 微服务(Microservice Architecture)是近几年流行的一种架构思想,它的概念没有很明确的指出.ThoughtWorks 公司的首席科学家 Martin Fo ...

  6. 牌类游戏使用微服务重构笔记(四): micro框架使用经验

    项目依赖 推荐使用go module, 我选择go module的最主要原因是足够简单,可以脱离gopath,就跟写nodejs一样,随便在一个地方新建一个文件夹就可以撸代码了,clone下来的源码也 ...

  7. 学习笔记:带你十天轻松完成 Go 微服务系列(二)- 服务拆分

    学习笔记:带你十天轻松搞定 Go 微服务系列(二) 1.学习课程 2.服务拆分 2.1 按业务服务拆分 2.2 按调用方式拆分 3.创建项目目录 3.1 在 code 中新建项目 3.2 创建 mal ...

  8. SpringCloudAlibaba系列微服务搭建笔记一_Nacos

    目录儿 二.SpringCloud技术栈 三.环境搭建 3.1 开发环境搭建 3.2 安装部署mysql 3.3 创建 SpringBoot 项目 3.3.1 简介 3.3.2 构建项目 3.3.3 ...

  9. 牌类游戏使用微服务重构笔记(八): 游戏网关服务器

    网关服务器 所谓网关,其实就是维持玩家客户端的连接,将玩家发的游戏请求转发到具体后端服务的服务器,具有以下几个功能点: 长期运行,必须具有较高的稳定性和性能 对外开放,即客户端需要知道网关的IP和端口 ...

最新文章

  1. 数据库服务器 之 在Linux下使用perl通过unixODBC连接SQLServer2000
  2. Win64 驱动内核编程-33.枚举与删除对象回调
  3. 【Python】纯代码通过神经网络实现线性回归的拟合
  4. Python-输入输出
  5. bitset中_Find_first()与_Find_next()函数
  6. 制作模块-制作模块压缩包
  7. 最全!最完整的递归下降分析法代码!!! (实验报告,代码)
  8. Android开发之RadioButton位于文字右边的显示方法
  9. 数学--数论--原根(循环群生成元)
  10. vfp赋值超过7位出错_JDK1.7下的HashMap的源码分析
  11. 此网址已被限制 此网址使用了一个通常用于网络浏览以外目的的端口。出于安全原因,Firefox 取消了该请求。
  12. ActiveX 技术疑点 一
  13. php array函数 array_keys返回数组的键值
  14. 显示器 设置选项 解析
  15. 使用Everything清理垃圾文件
  16. 如何查询域名whois?域名whois查询能获得哪些信息
  17. CSS3 filter滤镜详解
  18. 动态拨号主机多IP随机分配拨号自动分配
  19. 用malloc开辟二维数组的三种办法
  20. 你关心的2023年PMP的考试时间和地点在这里

热门文章

  1. 【EasyAR学习】显示模型
  2. Google 谷歌 AI博客:发布Objectron 3D对象检测模型数据集
  3. Vue props实现组件间数据传输
  4. 概率波和杨氏双缝干涉
  5. CRect::IntersectRect的功能
  6. 二、5G无线网络空中接口(1)--老狐笔记
  7. 安装Ubuntu时,无法连接虚拟设备sata0:1,因为主机上没有相应的设备
  8. 嵌入式开发—天气时钟
  9. 已经有一个排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中。
  10. 关于ubuntu使用pip3安装软件时报ImportError:cannot inport name 'sysconfig'错误的解决方法