微服务之Eureka服务发现

作者: 铁汤 | 来源:发表于2016-10-27 10:24 被阅读14864次

    当调用API或者发起网络通信的时候,无论如何我们都要知道被调用方的IP和服务端口,大部分情况是通过域名和服务端口,事实上基于DNS的服务发现,因为DNS缓存、无法自治和其他不利因素的存在,有很多局限。传统的DNS方式,都是通过nginx或者其他代理软件来实现,物理机器的ip和port都是固定的,那么nginx中配置的服务ip和port也是固定的,服务列表的更新只能通过手动来做,但如果后端服务很多时,手动更新容易出错,效率也很低,这在后端服务发生故障时,不可用时间就可能会加长。在微服务中,尤其是使用了Docker等虚拟化技术的微服务,其IP和port都是动态分配的,服务实例数也是动态变化的,那么就需要精细而准确的服务发现机制。当微服务app启动后,告诉其他服务自己的ip和端口,这里的其他服务就是Eureka Server和Eureka Client,这样其他服务就知道这个服务有多少实例在线,都在哪些地方,方便去负载均衡和调用。

    Eureka属于客户端发现模式,客户端负责决定相应服务实例的网络位置,并且对请求实现负载均衡。客户端从一个服务注册服务中查询所有可用服务实例的库,并缓存到本地。服务调用时,客户端使用负载均衡算法从多个后端服务实例中选择出一个,然后发出请求。Eureka分为Eureka Server和Eureka client, Eureka Server是一个服务注册中心,为服务实例注册管理和查询可用实例提供了REST API,并可以用其定位、负载均衡、故障恢复后端服务的中间层服务。在服务启动后,Eureka Client向服务注册中心注册服务同时会拉去注册中心注册表副本;在服务停止的时候,Eureka Client向服务注册中心注销服务;服务注册后,Eureka Client会定时的发送心跳来刷新服务的最新状态。

    客户端发现模式的优点是服务调用、负载均衡不需要和Eureka Server通信,直接使用本地注册表副本,因此Eureka Server不可用时是不会影响正常的服务调用,性能也不会因为网络延迟和服务端延迟受到影响。但其缺点也很明显,但某个服务不可用时,各个Eureka Client不能及时的知道,需要1~3个心跳周期才能感知,但是,由于基于Netflix的服务调用端都会使用Hystrix来容错和降级,当服务调用不可用时Hystrix也能及时感知到,通过熔断机制来降级服务调用,因此弥补了基于客户端服务发现的时效性的缺点。

    Eureka Server采用的是对等通信(P2P),无中心化的架构,无master/slave区分,每一个server都是对等的,既是Server又是Client,所以其集群方式可以自由发挥,可以各点互连,也可以接力互连。Eureka Server通过运行多个实例以及彼此之间互相注册来提高可用性,每个节点需要添加一个或多个有效的serviceUrl指向另一个节点。利用Eureka Server这种架构特性, 我在Eureka Server Cluster的部署时采用了三角形通信模型,三角形是一个很好的均衡模型,既是各点互连,又是接力互连,三角形本身就是一个稳定性几何形状,有着稳固、坚定搜索、耐压的特点,家具、建筑、交通等各种行业都有应用。如下图所示,Eureka Cluster的每个实例都和另外2个实例通信交互。


    相关文章

      网友评论

      • 攀缘的木棉花:您好,我想问的是eureka进入保护模式了,那些不存在的实例不能用了,但是我的客户端还能取到这个实例,那怎么办呢?
        铁汤:@攀缘的木棉花 进入保护模式后,不再剔除注册列表的信息,客户端仍然能获取到实例列表,但实际上有可能有些实例已经下线,这种情况建议使用hystrix做容错处理
      • 谦小易:直接使用本地注册表副本,因此Eureka Server不可用时是不会影响正常的服务调用,性能也不会因为网络延迟和服务端延迟受到影响。
        这句话不太明白,Eureka Server不可用时,即使我有本地缓存的注册表副本,请求最终不还是通过Server来实现的吗,为啥会server不可用时不会影响服务调用
        谦小易:@铁汤 多谢 另外,spring cloud feign默认采用的是http请求吗,我抓包并没有抓到
        铁汤: @谦小易 准确说是微服务实列的hostname和端口,还有微服务实列信息
        谦小易:难道注册表里存的是服务器的通信地址,然后客户端之前直接调用?
      • 流浪加肥猫:讲的很清楚:+1:
      • 9bc5e7976ff2:第二段能用一个实际场景详细讲解一下吗?就是怎么发现服务,怎么注册的?
        9bc5e7976ff2: @铁汤 好的,谢谢啦!
        铁汤:@小蚂蚁爱吃白菜 最近工作有点慢,一会半会儿说不清楚,这里给出官网的文档参考,希望对你有帮助:

        客户端和服务端通信:https://github.com/Netflix/eureka/wiki/Understanding-eureka-client-server-communication

        p2p通信理解:https://github.com/Netflix/eureka/wiki/Understanding-Eureka-Peer-to-Peer-Communication
      • tkec:能提供下3个eureka server的配置吗?我在本地起3个server,但第三台机器就没有和前两台形成环型。
        铁汤:@tkec 如果在同一zone,3个server其实很简单,用逗号分隔eureka url:eureka.client.serviceUrl.defaultZone=http://host1:8761/eureka/,http://host2:8761/eureka/,http://host3:8761/eureka/
      • 彳亍路:讲解的很好,但是 我有点不懂,http://blog.didispace.com/springcloud1/
        看下这个文章,不太懂为什么这个问题:你好,当我停止提供一个服务的时候,注册中心未发现此服务已关闭?页面提示一个红色警告。但是我问其他的人,好像大部分都能有心跳感应,发现了。这是为什么?
        铁汤:@逼格高的名字都被取完了 你说的页面红色警告看看提示信息含义,这个和你的eureka server 配置有关系。
        停止服务要看什么情况,如果不是强制进程关闭(比如kill-9),eureka客户端会主动发送注销;如果是强制关闭,要等1~3个心跳周期才能被停止,这个要看具体配置可能为注销也可能为down状态
      • 我在睡觉:没有太看懂
        我在睡觉: @我在睡觉 @铁汤 你的说的那个使用场景我没太看懂,另外我觉得你说的这个场景可以用load balance解决。
        铁汤: @我在睡觉 那些内容看不懂?
        铁汤:@我在睡觉 那些内容看不懂?

      本文标题:微服务之Eureka服务发现

      本文链接:https://www.haomeiwen.com/subject/tsijuttx.html