Micro是一套微服务构建工具库。对于微服务架构的应用,Micro提供平台层面、高度弹性的工具组件,让服务开发者们可以把复杂的分布式系统以简单的方式构建起来,并且尽可能让开发者使用最少的时间完成基础架构的构建。
Go-micro是独立的RPC框架,它是micro工具集的核心。下面通过常用方法看下其核心功能是怎么工作的,来看一个micro服务端的代码片段

// 服务端
func main() {service := micro.NewService(micro.Name("go.micro.srv.greeter"))service.Init()hello.RegisterSayHandler(service.Server(), new(Say))if err := service.Run(); err != nil {log.Fatal(err)}
}

micro.NewService

NewService根据其中的包,创建并返回一个新服务。

func NewService(opts ...Option) Service {return newService(opts...)
}func newService(opts ...Option) Service {options := newOptions(opts...)options.Client = &clientWrapper{options.Client,metadata.Metadata{HeaderPrefix + "From-Service": options.Server.Options().Name(),},}return &service{opts: options,}
}

传入参数用来设置服务的一些属性,例如使用的中间件,注册中心,服务有关属性等。上例中设置了服务的名称。

func Name(n string) Option {return func(o *Options) {o.Server.Init(server.Name(n))}
}

注意: 这里的服务名称必须和micro客户端编写的服务名称相一致,不然会无法正常访问。例如服务端定义的服务名字为go.micro.srv.greeter,而客户端定义的服务名称为go.micro.client。那么在调用时就会出现下面的错误。

{"id": "go.micro.client","code": 500,"detail": "error selecting accesstoken node: not found","status": "Internal Server Error"
}

service.Init

Init接口会解析命令行参数,方法具体如下:

func (s *service) Init(opts ...Option) {for _, o := range opts {o(&s.opts)}s.once.Do(func() {_ = s.opts.Cmd.Init(cmd.Broker(&s.opts.Broker),cmd.Register(&s.opts.Register),cmd.Transport(&s.opts.Transport),cmd.Client(&s.opts.Client),cmd.Server(&s.opts.Server),)})
}

RegisterSayHandler

这个方法是由proto文件自动生成的hello.micro.go文件中的,用来注册服务上的handler(处理器)。具体的方法名称根据你的proto文件而定。

func RegisterSayHandler(s server.Server, hdlr SayHandler, opts ...server.HandlerOption) {type say interface {Hello(ctx context.Context, in *Request, out *Response) error}type Say struct {say}h := &sayHandler{hdlr}s.Handle(s.NewHandler(&Say{h}, opts...))
}

service.Run

Run接口用来启动之前定义的服务,这一步会让服务绑到配置中的地址(随机分配的端口)接收请求。服务通过服务发现功能,在启动时进行服务注册,关闭时进行服务卸载。服务运行起来后会一直等到kill信号或者上下文取消的信号(可能网络问题导致),这时就会执行Stop函数。Stop函数中包含了一些停止服务之前,之后等需要执行的动作。

func (s *service) Run() error {if err := s.Start(); err != nil {return err}ch := make(chan os.Signal, 1)signal.Notify(ch, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT)select {// 等待kill信号case <-ch:// 等待上下文取消case <-s.opts.Context.Done()}return s.Stop()
}

为了保证异常情况出现时,服务不被自动移除,Micro注册机制支持通过TTL(Time-To-Live)和间隔时间注册两种方式来解决。TTL指定一次注册在注册中心的有效期,过期后便删除,而间隔时间注册则是定时向注册中心重新注册以保证服务仍然在线。可以通过代码或命令行的方式来指定,例如:

  • 命令行的方式
 micro --register_ttl=30 --register_interval=15 api

上面的例子设置了30s的TTL生存期,并设置了每15s一次的重注册。

  • 代码实现
service := micro.NewService(micro.Name("com.example.srv.foo"),micro.RegisterTTL(time.Second*30),micro.RegisterInterval(time.Second*15),
)

下面来看下micro客户端的一些核心功能,来看代码片段。

// 客户端
func main() {service := micro.NewService(micro.Name("go.micro.srv.greeter"))service.Init()sayClient := hello.NewSayService("go.micro.srv.greeter", service.Client())rsp, err := sayClient.Hello(context.TODO(), &hello.Request{Name: "benben"})if err != nil {log.Fatal(err)}log.Println(rsp)
}

NewSayService

NewSayService方法是由proto文件生成hello.micro.go文件中的,详细代码如下:

func NewSayService(serviceName string, c client.Client) SayService {if c == nil {c = client.NewClient()}if len(serviceName) == 0 {serviceName = "go.micro.srv.greeter"}return &sayService{c:           c,serviceName: serviceName,}
}

这个方法要求传入两个参数,一个是服务的名字,一个是客户端信息,如果传入的client为空,那么该方法返回的SayService将会新建一个默认的客户端。如果服务的名字为空,则默认使用的服务名称为main

  1. serviceName为空时,服务返回的错误。
{"id": "go.micro.client","code": 500,"detail": "error selecting main node: not found","status": "Internal Server Error"
}
  1. client.Client为空时,服务返回的错误。
{"id": "go.micro.client","code": 408,"detail": "call timeout: context deadline exceeded","status": "Request Timeout"
}

负载均衡

负载均衡是一种将请求分摊负载或维持高可用的方式。微服务通过选择器负载均衡,选择器(客户端负载均衡器,它在缓存中维护了服务发现的信息,如果缓存没有找到,选择器会到注册服务中心去查找并把结果缓存起来。可以使用命令micro --selector=cache api)可以把请求分到任意多的服务节点上。服务启动后,它使用唯一的地址与id组合向注册中心注册成服务节点。选择器在服务注册信息中找到服务的节点,然后用负载均衡策略选择一个节点把请求发送出去。
客户端负载均衡内置在go-micro客户端中,这是自动完成的。前面文章中有个newService方法,其中代码开始处有newOptions方法,用来设置一些默认参数。

func newOptions(opts ...Option) Options {opt := Options{Broker:     broker.DefaultBroker,Cmd:        cmd.DefaultCmd,Client:     client.DefaultClient,Server:     server.DefaultServer,Registry:   registry.DefaultRegistry,Transport:  transport.DefaultTransport,Context:    context.Background(),}// ...return opt
}// 来看DefaultServer
var DefaultServer Server = newRpcServer()func newRpcServer(opts ...Option) Server {options := newOptions(opts...)//...return &rpcServer{//...}
}func newOptions(opt ...Option) Options {opts := Options{Codecs:     make(map[string]codec.NewCodec),Metadata:   map[string]string{},}// ...if opts.Broker == nil {opts.Broker = broker.DefaultBroker}if opts.Registry == nil {opts.Registry = registry.DefaultRegistry}if opts.Transport == nil {opts.Transport = transport.DefaultTransport}if opts.DebugHandler == nil {opts.DebugHandler = debug.DefaultDebugHandler}if opts.RegisterCheck == nil {opts.RegisterCheck = DefaultRegisterCheck}// DefaultAddress = ":0"if len(opts.Address) == 0 {opts.Address = DefaultAddress}// DefaultName = "server"if len(opts.Name) == 0 {opts.Name = DefaultName}// DefaultId = uuid.New().String()if len(opts.Id) == 0 {opts.Id = DefaultId}if len(opts.Version) == 0 {opts.Version = DefaultVersion}return opts
}

参考文章

  1. Go Micro

micro入门指南——核心功能介绍相关推荐

  1. LayIM 3.9.1与ASP.NET SignalR实现Web聊天室快速入门(四)之ASP.NET SignalR核心功能介绍

    前言 本系列文章特点:使用ASP.NET SignalR和LayIM快速入门对接,实现一对一聊天,群聊,添加聊天群组,查找聊天记录等功能.源代码不包含LayIM的源代码,因为官方并没开源属于收费资源, ...

  2. 解密电商系统-Spring boot快速开始及核心功能介绍(下)

    上次说了Spring boot快速开始及核心功能介绍,本次说说配置文件相关的. Spring Boot属性配置文件详解(一) 修改端口 # application.properties: server ...

  3. Cheat Enginee(CE)的保姆级详细使用指南~(下载安装与汉化+核心功能介绍)

    目录 一.下载与安装说明 1.下载与安装 2.汉化 二.核心功能详细说明 主界面基本介绍 1.扫描并打开进程 2.扫描类型 (1)精确数值扫描 (2)值大于- (3)值小于- (4)值介于-两者之间 ...

  4. RabbitMQ核心功能介绍

    RabbitMQ核心功能 一.MQ的概念与功能介绍 二.RabbitMQ的介绍和入门案例 三.RabbitMQ的工作队列 四.RabbitMQ的工作模式 五.RabbitMQ的发布确认 六.Rabbi ...

  5. nacos核心功能介绍

    Nacos与euraka功能对比 功能上可以看出nacos比euraka主要增加了配置中心,并且配置中心可以设置自动刷新.这样可以减少一些服务的启动. 在注册中心,nacos支持 ap与cp两种模式, ...

  6. 软件架构-Spring boot快速开始及核心功能介绍(中)

    上次通过Spring boot认知,核心功能.springBoot的搭建[官方向导搭建boot应用]和 [maven的方式搭建boot]. 统一父POM管理(一) ① 建立boot-parent工程 ...

  7. Apollo(分布式配置中心)核心概念及核心功能介绍

    Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性,适用于微服务配置管理场景. 服 ...

  8. Dask核心功能介绍及与Spark的比较

    从谷爱凌身上,我们看到了支撑她走上神坛的4个因素: 优良的基因 衣食无忧的生活 兴趣自由 智力向导 其中基因是基础,也可以说是最重要的.不要小看基因的一点儿优化,哪怕一丁点的改良就可能超越当前地球在世 ...

  9. 优动漫PAINT核心功能介绍

    优动漫PAINT是一款功能强大的动漫绘图软件,适用于个人和专业团队创作,分为个人版和EX版.搭载了绘制漫画和插画所需的所有功能--丰富的笔工具.超强的笔压感应和手颤修正功能,可分别满足画师对于插画.漫 ...

最新文章

  1. sqlserver 安装_安装sqlserver
  2. Linux中增加软路由的两种方法,Linux中增加软路由的三种方法
  3. Selinux安全上下文详解
  4. mysql主从复制 火墙_MySQL高级知识(十五)——主从复制
  5. linux驱动编写(看门狗)
  6. 【软件工程】重要知识点
  7. python爬取猫途鹰网站上的评论
  8. 爬取中国地震网地震数据
  9. PIC单片机C语言编程教程
  10. REST Assured 4 - 第一个GET Request
  11. 网络共享计算机权限访问,局域网共享时提示:你没有权限访问,请与网络管理员联系...
  12. RewriteBase: only valid in per-directory config files 解答:
  13. 【图解CAN总线】-6-classic CAN 2.0总线网络“负载率”计算
  14. babel安装及使用
  15. MyBatis使用@Select注解写动态SQL语句
  16. Delphi和Word编程集锦
  17. 二维码解码器Zbar+VS2012开发环境配置
  18. 【傻瓜攻略】深度学习之从入门到放弃
  19. javaWeb项目不报错但网页报500错误
  20. 变频器的常用参数设置(古月金真著)

热门文章

  1. 1万小时贫穷定律:为什么你越忙越穷
  2. 24/09/2022 c语言细节
  3. 深入浅出,五次课程,带您进入数据分析的世界
  4. YoLov3训练自己的数据集(小白手册)
  5. git 问题解决之remote: Permission to xxx/xxx.git denied to xxx.
  6. 数据结构—线性表(第三章)—基本知识点总结
  7. 《调色师手册:电影和视频调色专业技法(第2版)》——导读
  8. 基于已有模型,训练新数据的方法
  9. 海思YOLOv3 wk模型在nnie设备上面推理
  10. 编写一个判断素数的函数,在主函数输入一个整数时,输出是否素数的信息。