go微服务框架go-micro深度学习(三) Registry服务的注册和发现

服务的注册与发现是微服务必不可少的功能,这样系统才能有更高的性能,更高的可用性。go-micro框架的服务发现有自己能用的接口Registry。只要实现这个接口就可以定制自己的服务注册和发现。

go-micro在客户端做的负载,典型的Balancing-aware Client模式。

服务端把服务的地址信息保存到Registry, 然后定时的心跳检查,或者定时的重新注册服务。客户端监听Registry,最好是把服务信息保存到本地,监听服务的变动,更新缓存。当调用服务端的接口是时,根据客户端的服务列表和负载算法选择服务端进行通信。

go-micro的能用Registry接口

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
}

type Watcher interface {
    // Next is a blocking call
    Next() (*Result, error)
    Stop()
}

  这个接口还是很简单明了的,看方法也大概能猜到主要的作用

  Register方法和Deregister是服务端用于注册服务的,Watcher接口是客户端用于监听服务信息变化的。

接下来我以go-micro的etcdv3为Registry的例给大家详细讲解一下go-micro的详细服务发现过程

go-micro 服务端注册服务

流程图

服务端看上去流程还是比较简单的,当服务端调用Run()方法时,会调用service.Start()方法。这个除了监听端口,启动服务,还会把服务的ip端口号信息,和所有的公开接口的元数据信息保存到我们选择的Register服务器上去。

看上去没有问题,但是,如果我们的节点发生故障,也是需要告诉Register把我们的节点信息删除掉。

Run()方法中有个go s.run(ex) 方法的调用,这个方法就是根据我们设置interval去重新注册服务,当然比较保险的方式是我们把服务的ttl也设置上,这样当服务在未知的情况下崩溃,到了ttl的时间Register服务也会自动把信息删除掉。

设置服务的ttl和 interval

    // 初始化服务
    service := micro.NewService(
        micro.Name(common.ServiceName),
        micro.RegisterTTL(time.Second*30),
        micro.RegisterInterval(time.Second*20),
        micro.Registry(reg),
    )

ttl就是注册服务的过期时间,interval就是间隔多久再次注册服务。如果系统崩溃,过期时间也会把服务删除掉。客户端当然也会有想就的判断,下面会详细解说

客户端发现服务

客户端的服务发现要步骤多一些,但并不复杂,他涉及到服务选择Selector和服务发现Register两部分。

Selector是基于服务发现的,根据你选择的主机选择算法,返回主机的信息。默认的情况,go-micro是每次要得到服务器主机的信息都要去Register去获取。但是查看cmd.go的源码你会发现默认初始化的值,selector的默认flag是cache。DefaultSelectors里的cache对应的就是初始化cacheSelector方法

但是当你在执行service.Init()方法时

go-micro会把默认的selector替换成cacheSelector,具体的实现是在cmd.go的Before方法里

cacheSelector 会把从Register里获取的主机信息缓存起来。并设置超时时间,如果超时则重新获取。在获取主机信息的时候他会单独跑一个协程,去watch服务的注册,如果有新节点发现,则加到缓存中,如果有节点故障则删除缓存中的节点信息。当client还要根据selector选择的主机选择算法才能得到主机信息,目前只有两种算法,循环和随机法。为了增加执行效率,很client端也会设置缓存连接池,这个点,以后会详细说。

所以大概的客户端服务发现流程是下面这样

主要的调用过程都在Call方法内

主要的思路是

从Selector里得到选择主机策略方法next。

根据Retory是否重试调用服务,调用服务的过程是,从next 方法内得到主机,连接并传输数据 ,如果失败则重试,重试时,会根据主机选择策略方法next重新得到一个新的主机进行操作。

原文地址:https://www.cnblogs.com/li-peng/p/9689786.html

时间: 2024-08-27 22:29:26

go微服务框架go-micro深度学习(三) Registry服务的注册和发现的相关文章

(转载)深度学习三十年创新路

转载自:http://36kr.com/p/533832.html 编者注:深度学习火了,从任何意义上,大家谈论它的热衷程度,都超乎想象.但是,似乎很少有人提出不同的声音,说深度学习的火热,有可能是过度的繁荣,乃至不理性的盲从.而这次,有不同的想法出现了. 本篇文章来自依图科技 CEO Leo的投稿,依图科技是一家专注研究CV(Computer Vison,计算机视觉)的以技术驱动的创业公司,Leo自己也在这一领域有深入研究,因此这次写下这篇文章,希望回顾一下深度学习三十年的创新之路. 近期Na

深度学习三十年创新路

深度学习三十年创新路 编者注:深度学习火了,从任何意义上,大家谈论它的热衷程度,都超乎想象.但是,似乎很少有人提出不同的声音,说深度学习的火热,有可能是过度的繁荣,乃至不理性的盲从.而这次,有不同的想法出现了. 本篇文章来自依图科技 CEO Leo的投稿,依图科技是一家专注研究CV(Computer Vison,计算机视觉)的以技术驱动的创业公司,Leo自己也在这一领域有深入研究,因此这次写下这篇文章,希望回顾一下深度学习三十年的创新之路. 近期Nature杂志刊登了Lecun.Bengio.H

框架《Keras深度学习实战》中英文PDF+源代码分析

作为一款轻量级.模块化的开源深度学习框架, Keras 以容易上子.利于快速原型实现.能够与TensorFlow 和Theano 等后端计算平台很好兼容等优点, 深受众多开发人 员和研究人员的喜爱. <Keras深度学习实战>结合大量实例,简明扼要地介绍了目前热门的神经网络技术和深度学习技术 .从经典的多层感知机到用于图像处理的深度卷积网络,从处理序列化数据的循环网络到伪造仿真数据的生成对抗网络,从词嵌入到AI 游戏应用中的强化学习,引领一层一层揭开深度学习的面纱, 并在逐渐清晰的理论框架下,

Pegasus学习三:服务通信框架介绍

Pegasus来源于点评的开源框架pigeon:https://github.com/dianping/pigeon 什么是Pegasus Pegasus是一个高性能的分布式服务框架,致力于提供RPC远程服务调用方案,并可作为精简版SOA服务治理的方案.实现基本的RPC,路由,负载均衡,容错,统计报表,服务注册订阅功能. 其核心模块包括以下几类: 远程通信:基于NIO的Socket通信,"底层异步上层同步" + "请求|响应" 模式的信息交互方式,可支持多种序列化协

深度学习三

转载:http://blog.csdn.net/zouxy09/article/details/8775518 目录: 一.概述 二.背景 三.人脑视觉机理 四.关于特征 4.1.特征表示的粒度 4.2.初级(浅层)特征表示 4.3.结构性特征表示 4.4.需要有多少个特征? 五.Deep Learning的基本思想 六.浅层学习(Shallow Learning)和深度学习(Deep Learning) 七.Deep learning与Neural Network 八.Deep learnin

深度学习(三)----算法岗面试题

● 神经网络为啥用交叉熵. 参考回答: 通过神经网络解决多分类问题时,最常用的一种方式就是在最后一层设置n个输出节点,无论在浅层神经网络还是在CNN中都是如此,比如,在AlexNet中最后的输出层有1000个节点,而即便是ResNet取消了全连接层,也会在最后有一个1000个节点的输出层. 一般情况下,最后一个输出层的节点个数与分类任务的目标数相等.假设最后的节点数为N,那么对于每一个样例,神经网络可以得到一个N维的数组作为输出结果,数组中每一个维度会对应一个类别.在最理想的情况下,如果一个样本

企业分布式微服务云SpringCloud SpringBoot mybatis (三) 服务消费者(Feign)

一.Feign简介 Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单.使用Feign,只需要创建一个接口并注解.它具有可插拔的注解特性,可使用Feign 注解和JAX-RS注解.Feign支持可插拔的编码器和解码器.Feign默认集成了Ribbon,并和Eureka结合,默认实现了负载均衡的效果. 简而言之: Feign 采用的是基于接口的注解 Feign 整合了ribbon 二.准备工作 继续用上一节的工程, 启动eureka-server,端口为8761; 启动se

分页技术框架(Pager-taglib)学习三(pager-taglib中传递参数时中文乱码问题)

一.问题描述 问题: 使用<pg:param name="key" />标签传递中文参数时,会有乱码. 原因: 因为它默认是用gb2312来对添加的参数进行编码,如果你的过滤器.jsp页面都是采用的gb2312就没有什么问题,如果你采用的是utf-8来编码,那么中文参数传递过程中就会出现乱码导致无法解析.   二.问题解决方法 网上有很多解决办法,重新修改编译源代码是一种方法: 在com\jsptags\navigation\pager下面的PagerTag的addPara

go微服务框架go-micro深度学习-目录

go微服务框架go-micro深度学习(一) 整体架构介绍 go微服务框架go-micro深度学习(二) 入门例子 go微服务框架go-micro深度学习(三) Registry服务的注册和发现 go微服务框架go-micro深度学习(四) rpc方法调用过程详解 go微服务框架go-micro深度学习(五) stream 调用过程详解 代码在github上 原文地址:https://www.cnblogs.com/li-peng/p/10522084.html