micro入门指南——核心功能介绍
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
serviceName
为空时,服务返回的错误。
{"id": "go.micro.client","code": 500,"detail": "error selecting main node: not found","status": "Internal Server Error"
}
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
}
参考文章
- Go Micro
micro入门指南——核心功能介绍相关推荐
- LayIM 3.9.1与ASP.NET SignalR实现Web聊天室快速入门(四)之ASP.NET SignalR核心功能介绍
前言 本系列文章特点:使用ASP.NET SignalR和LayIM快速入门对接,实现一对一聊天,群聊,添加聊天群组,查找聊天记录等功能.源代码不包含LayIM的源代码,因为官方并没开源属于收费资源, ...
- 解密电商系统-Spring boot快速开始及核心功能介绍(下)
上次说了Spring boot快速开始及核心功能介绍,本次说说配置文件相关的. Spring Boot属性配置文件详解(一) 修改端口 # application.properties: server ...
- Cheat Enginee(CE)的保姆级详细使用指南~(下载安装与汉化+核心功能介绍)
目录 一.下载与安装说明 1.下载与安装 2.汉化 二.核心功能详细说明 主界面基本介绍 1.扫描并打开进程 2.扫描类型 (1)精确数值扫描 (2)值大于- (3)值小于- (4)值介于-两者之间 ...
- RabbitMQ核心功能介绍
RabbitMQ核心功能 一.MQ的概念与功能介绍 二.RabbitMQ的介绍和入门案例 三.RabbitMQ的工作队列 四.RabbitMQ的工作模式 五.RabbitMQ的发布确认 六.Rabbi ...
- nacos核心功能介绍
Nacos与euraka功能对比 功能上可以看出nacos比euraka主要增加了配置中心,并且配置中心可以设置自动刷新.这样可以减少一些服务的启动. 在注册中心,nacos支持 ap与cp两种模式, ...
- 软件架构-Spring boot快速开始及核心功能介绍(中)
上次通过Spring boot认知,核心功能.springBoot的搭建[官方向导搭建boot应用]和 [maven的方式搭建boot]. 统一父POM管理(一) ① 建立boot-parent工程 ...
- Apollo(分布式配置中心)核心概念及核心功能介绍
Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性,适用于微服务配置管理场景. 服 ...
- Dask核心功能介绍及与Spark的比较
从谷爱凌身上,我们看到了支撑她走上神坛的4个因素: 优良的基因 衣食无忧的生活 兴趣自由 智力向导 其中基因是基础,也可以说是最重要的.不要小看基因的一点儿优化,哪怕一丁点的改良就可能超越当前地球在世 ...
- 优动漫PAINT核心功能介绍
优动漫PAINT是一款功能强大的动漫绘图软件,适用于个人和专业团队创作,分为个人版和EX版.搭载了绘制漫画和插画所需的所有功能--丰富的笔工具.超强的笔压感应和手颤修正功能,可分别满足画师对于插画.漫 ...
最新文章
- sqlserver 安装_安装sqlserver
- Linux中增加软路由的两种方法,Linux中增加软路由的三种方法
- Selinux安全上下文详解
- mysql主从复制 火墙_MySQL高级知识(十五)——主从复制
- linux驱动编写(看门狗)
- 【软件工程】重要知识点
- python爬取猫途鹰网站上的评论
- 爬取中国地震网地震数据
- PIC单片机C语言编程教程
- REST Assured 4 - 第一个GET Request
- 网络共享计算机权限访问,局域网共享时提示:你没有权限访问,请与网络管理员联系...
- RewriteBase: only valid in per-directory config files 解答:
- 【图解CAN总线】-6-classic CAN 2.0总线网络“负载率”计算
- babel安装及使用
- MyBatis使用@Select注解写动态SQL语句
- Delphi和Word编程集锦
- 二维码解码器Zbar+VS2012开发环境配置
- 【傻瓜攻略】深度学习之从入门到放弃
- javaWeb项目不报错但网页报500错误
- 变频器的常用参数设置(古月金真著)