一、go-micro入门

1. go-micro 简介

Go Micro 是一个插件化的基础框架,基于此可以构建微服务,Micro 的设计哲学是可插拔的插件化架构

在架构之外,它默认实现了 consul   作为服务发现(2019   年源码修改了默认使用mdns),通过 http 进行通信,通过 protobuf 和 json 进行编解码

2. go-micro 的主要功能

服务发现:自动服务注册和名称解析。服务发现是微服务开发的核心。当服务 A需要与服务 B 通话时,它需要该服务的位置。默认发现机制是多播 DNS(mdns),一种零配置系统。您可以选择使用 SWIM 协议为 p2p 网络设置八卦,或者为弹性云原生设置设置 consul

负载均衡:基于服务发现构建的客户端负载均衡。一旦我们获得了服务的任意数量实例的地址,我们现在需要一种方法来决定要路由到哪个节点。我们使用随机散列负载均衡来提供跨服务的均匀分布,并在出现问题时重试不同的节点

消息编码:基于内容类型的动态消息编码。客户端和服务器将使用编解码器和内容类型为您无缝编码和解码 Go 类型。可以编码任何种类的消息并从不同的客户端发送。客户端和服务器默认处理此问题。这包括默认的protobuf 和 json

请求/响应:基于 RPC 的请求/响应,支持双向流。我们提供了同步通信的抽象。对服务的请求将自动解决,负载平衡,拨号和流式传输。启用 tls 时,默认传输为 http/ 1.1 或 http2

Async Messaging:PubSub 是异步通信和事件驱动架构的一流公民。事件通知是微服务开发的核心模式。启用 tls 时,默认消息传递是点对点 http / 1.1 或 http2

可插拔接口:Go Micro 为每个分布式系统抽象使用 Go 接口,因此,这些接口是可插拔的,并允许 Go Micro 与运行时无关,可以插入任何基础技术

插件地址:https://github.com/micro/go-plugins

3. go-micro 通信流程

Server 监听客户端的调用,和 Brocker 推送过来的信息进行处理。并且 Server 端需要向 Register 注册自己的存在或消亡,这样 Client 才能知道自己的状态

Register 服务的注册的发现,Client 端从 Register 中得到 Server 的信息,然后每次调用都根据算法选择一个的 Server 进行通信,当然通信是要经过编码/解码,选择传输协议等一系列过程的

如果有需要通知所有的 Server 端可以使用 Brocker 进行信息的推送,Brocker 信息队列进行信息的接收和发布

4. go-micro 核心接口

go-micro 之所以可以高度订制和他的框架结构是分不开的,go-micro 由 8 个关键的interface 组成,每一个 interface 都可以根据自己的需求重新实现,这 8  个主要的inteface 也构成了 go-micro 的框架结构

二、Go Micro接口详解

1. Transort 通信接口

服务之间通信的接口,也就是服务发送和接收的最终实现方式,是由这些接口定制的

type Socket interface {
Recv(*Message) error
Send(*Message) error
Close() error
} type Client interface {
Socket
} type Listener interface {
Addr() string
Close() error
Accept(func(Socket)) error
} type Transport interface {
Dial(addr string, opts ...DialOption) (Client, error)
Listen(addr string, opts ...ListenOption) (Listener, error)
String() string
}

2. Codec 编码接口

go-micro 有很多种编码解码方式,默认的实现方式是protobuf,当然也有其他的实现方式,json

type Codec interface {
ReadHeader(*Message, MessageType) error
ReadBody(interface{}) error
Write(*Message, interface{}) error
Close() error
String() string
}

3. Registry 注册接口

服务的注册和发现,目前实现的有 consul、mdns、etcd、zookeeper、kubernetes 等

type Registry interface {
Register(*Service, ...RegisterOption) error
Deregister(*Service) error
GetService(string) ([]*Service, error)
ListServices() ([]*Service, error)
Watch(...WatchOption) (Watcher, error)
String() string
Options() Options
}  

4. Selector 负载均衡

以 Registry 为基础,Selector 是客户端级别的负载均衡,当有客户端向服务发送请求时,selector 根据不同的算法从 Registery 中的主机列表,得到可用的 Service 节点,进行通信,目前实现的有循环算法和随机算法,默认的是随机算法

type Selector interface {
Init(opts ...Option) error
Options() Options
// Select returns a function which should return the next node
Select(service string, opts ...SelectOption) (Next, error)
// Mark sets the success/error against a node
Mark(service string, node *registry.Node, err error)
// Reset returns state back to zero for a service
Reset(service string)
// Close renders the selector unusable
Close() error
// Name of the selector
String() string
}  

5. Broker 发布订阅接口

Broker 是消息发布和订阅的接口。例如,因为服务的节点是不固定的,如果需要修改所有服务行为,可以使服务订阅某个主题,当有信息发布时,所有的监听服务都会收到信息,根据你的需要做相应的行为即可

type Broker interface {
Options() Options
Address() string
Connect() error
Disconnect() error
Init(...Option) error
Publish(string, *Message, ...PublishOption) error
Subscribe(string, Handler, ...SubscribeOption) (Subscriber, error)
String() string
}

6. Client 客户端接口

Client 是请求服务的接口,他封装Transport 和Codec 进行rpc 调用,也封装了Brocker进行信息的发布

type Client interface {
Init(...Option) error
Options() Options
NewMessage(topic string, msg interface{}, opts ...MessageOption) Message
NewRequest(service, method string, req interface{}, reqOpts ...RequestOption) Request
Call(ctx context.Context, req Request, rsp interface{}, opts ...CallOption) error
Stream(ctx context.Context, req Request, opts ...CallOption) (Stream, error)
Publish(ctx context.Context, msg Message, opts ...PublishOption) error
String() string
}

7. Server 服务端接口

Server 监听等待 rpc 请求,监听 broker 的订阅信息,等待信息队列的推送等

type Server interface {
Options() Options
Init(...Option) error
Handle(Handler) error
NewHandler(interface{}, ...HandlerOption) Handler
NewSubscriber(string, interface{}, ...SubscriberOption) Subscriber
Subscribe(Subscriber) error
Register() error
Deregister() error
Start() error
Stop() error
String() string
}

8. Serveice 接口

Service  是 Client  和 Server 的封装,他包含了一系列的方法使用初始值去初始化

type Service interface {
Init(...Option)
Options() Options
Client() client.Client
Server() server.Server
Run() error
String() string
}

微服务架构攀登之路(五)之Go-micro入门的更多相关文章

  1. 微服务架构攀登之路(二)之RPC

    1. RPC 简介 远程过程调用(Remote Procedure Call,RPC)是一个计算机通信协议 该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编 ...

  2. 微服务架构攀登之路(三)之gRPC入门

    一.gRPC入门 1. gRPC 简介 gRPC 由 google 开发,是一款语言中立.平台中立.开源的远程过程调用系统 gRPC 客户端和服务端可以在多种环境中运行和交互,例如用 java 写一个 ...

  3. 微服务架构攀登之路(四)之使用gRPC构建微服务

    做一个处理用户信息的微服务 客户端通过用户名,可以从服务端查询用户的基本信息 gRPC proto user.proto 定义客户端请求.服务端响应的数据格式 user.pb.go 自动生成的,为数据 ...

  4. 从 Spring Cloud 开始,聊聊微服务架构实践之路

    [编者的话]随着公司业务量的飞速发展,平台面临的挑战已经远远大于业务,需求量不断增加,技术人员数量增加,面临的复杂度也大大增加.在这个背景下,平台的技术架构也完成了从传统的单体应用到微服务化的演进. ...

  5. Re:从0开始的微服务架构:(一)重识微服务架构--转

    原文地址:http://www.infoq.com/cn/articles/micro-service-architecture-from-zero?utm_source=infoq&utm_ ...

  6. spring cloud+dotnet core搭建微服务架构:配置中心续(五)

    前言 上一章最后讲了,更新配置以后需要重启客户端才能生效,这在实际的场景中是不可取的.由于目前Steeltoe配置的重载只能由客户端发起,没有实现处理程序侦听服务器更改事件,所以还没办法实现彻底实现这 ...

  7. JHipster生成微服务架构的应用栈(五)- 容器编排示例

    本系列文章演示如何用JHipster生成一个微服务架构风格的应用栈. 环境需求:安装好JHipster开发环境的CentOS 7.4(参考这里) 应用栈名称:appstack 认证微服务: uaa 业 ...

  8. Spring Cloud构建微服务架构(五)服务网关

    通过之前几篇Spring Cloud中几个核心组件的介绍,我们已经可以构建一个简略的(不够完善)微服务架构了.比如下图所示: 我们使用Spring Cloud Netflix中的Eureka实现了服务 ...

  9. spring cloud+.net core搭建微服务架构:配置中心续(五)

    前言 上一章最后讲了,更新配置以后需要重启客户端才能生效,这在实际的场景中是不可取的.由于目前Steeltoe配置的重载只能由客户端发起,没有实现处理程序侦听服务器更改事件,所以还没办法实现彻底实现这 ...

随机推荐

  1. MySQL如何随机筛选25000条数据

    一.SELECT * FROM sheet1 t1 ORDER BY RAND() LIMIT 10000; 二.SELECT * FROM sheet1 AS t1 JOIN (SELECT ROU ...

  2. 简单的理解 Object.defineProperty()

    Object.defineProperty()的作用就是直接在一个对象上定义一个新属性,或者修改一个已经存在的属性. Object.defineProperty(obj,prop,descriptor ...

  3. CF1497A Meximization 题解

    Content 给定 \(n\) 个数 \(a_1,a_2,\dots,a_n\),你需要将这些数重新排列,使得 \(\sum\limits_{i=1}^n\operatorname{mex}(a_1 ...

  4. zabbix保姆级安装教程

    安装步骤 1.进入官网选择下载的版本和服务器类型 官网地址:https://www.zabbix.com/cn/download?zabbix=5.0&os_distribution=cent ...

  5. IO复用的三种方法(select,poll,epoll)深入理解

    (一)IO复用是Linux中的IO模型之一,IO复用就是进程告诉内核需要监视的IO条件,使得内核一旦发现进程指定的一个或多个IO条件就绪,就通过进程处理,从而不会在单个IO上阻塞了,Linux中,提供 ...

  6. 关于c++、go、nodejs、python的计算性能测试,结果令人惊讶

    计算性能在计算密集型的服务上,是非常重要的, 一直以为,在计算性能上,肯定是C++  > go > nodejs >= python 但测试结果却让人大跌眼镜!!! 实际的结果是: ...

  7. nim_duilib(3)之按钮

    introduction 更多控件用法,请参考 here 和 源码. 本文的代码基于这里 lets go xml文件添加代码 下面的xml文件内容,删除label控件的相关代码,增加了3个按钮. 其中 ...

  8. 【LeetCode】1419. 数青蛙 Minimum Number of Frogs Croaking (Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典 日期 题目地址:https://leetcode ...

  9. 【LeetCode】253. Meeting Rooms II 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 排序+堆 日期 题目地址:https://leetco ...

  10. 【LeetCode】576. Out of Boundary Paths 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 动态规划 状态搜索 记忆化搜索 相似题目 参考资料 ...