服务发现的基本原理

一、什么是服务发现

服务提供者是什么, 简单说就是一个HTTP服务器,提供了API服务,有一个IP端口作为服务地址。 服务消费者是什么?

就是一个简单的进程,想要访问服务提供者提供的服务来做一些事情。 一个HTTP服务器既可以是服务提供者对外提供

服务,也可以是消费者需要别的服务提供者提供的服务,这就是服务依赖。复杂的服务甚至有多个服务依赖

服务发现有三个角色,服务提供者、服务消费者和服务中介。 服务中介是联系服务提供者和服务消费者的桥梁。服务提供者

将自己提供的服务地址注册到服务中介,服务消费者从服务中介那里查找自己想要的服务地址,然后使用这个服务。 服务中介

提供多个服务,每个服务对应多个服务提供者。

服务中介就是一个字典,字典里有很多key-value键值对,key是服务名称,value是服务提供者的地址列表。服务注册就是调用

字典的put方法放东西,服务查找就是调用字典的get方法获取东西

当服务提供者新加入时,要求服务中介能及时告知服务消费者。

二、Redis作为服务中介

Redis里面有丰富的数据结构,用来存储服务字典很合适。 对每一个服务名称,可以用一个set结构存储服务的IP:port字符串

如果服务提供者加入,调用sadd命令加入服务地址,如果服务挂掉,调用srem命令移除服务地址。 对服务消费者使用smembers

指令来获取所有服务地址然后在消费进程里随机调一个,或者使用srandmember命令直接获取随机服务地址。

如果服务提供者进程备暴力杀死了,不能主动调用srem命令怎么处理?  这个时候服务列表中多了一个黑地址指向了不存在的服务

二消费者完全不知道,这个时候服务中介就成了黑中介了。 因此,引入服务保活和检查机制,病更换数据结构。服务提供这需要每隔5秒

左右向服务中介汇报存活, 服务中介将付地址和汇报时间记录在zset数据结构的value和score中。 服务中介需要每隔10秒左右检查zset

数据结果。

那么服务列表变动时如何通知消费者?

第一种方式是轮询,消费者需要每隔几秒查询服务列表是否有改变。 如果服务很多,服务列表很大, 消费者很多,Redis会右一定压力。

这时可以引入服务列表的版本号控制,给每个服务提供一个key/value设置服务的版本号,就是在服务列表发生变动时,递增这个版本号。

消费者只要轮询这个版本号的变动即可直到服务列表是否发生了变化。

第二种方式就是采用pubsub。 及时性明显好于轮询。缺点就是每个pubsub都会占用消费者一个线程和一个额外的Redis连接。 为了减少

对线程和连接的浪费,我们使用单个pubsub广播全局版本号的变动。 所谓全局版本号就是任意服务列表发生了变动,这个版本号都会地藏。

接受到版本变动的消费者再去检查各自的依赖服务列表的版本号是否发生了变动。

Redis的单点问题怎么解决?

现流行的服务发现系统都是使用分布式数据库zookeeper etcd  consul等来作为服务中介,他们是分布式的多节点的,挂掉了一个节点没关系

系统仍然可以正常工作。 那如果整个zk集群都挂掉? 其实每个服务消费者在本地内存里都会存一份当前的服务列表,即使服务中介集群挂掉,

也是可以使用当前的服务列表正常工作的。 也可以Redis-sentinel可以在主节点挂掉的时候,自动升级从节点为主节点

三、服务配置重加载

服务发现一般只是用来注册和查找服务列表这样一个比较单纯的功能。不过现代的服务发现系统还会集成服务配置管理功能。这样可以实现服务

配置的实时重加载。 服务中介还会存储一个单独的key/value用来存储这个服务的配置信息。当这个配置项在后台被修改时,服务中介会实时通知

相关服务器变更配置信息。 比如数据库地址变动,业务参数修改等。

四、服务管理后台

为了便于服务管理,一般服务发现还会提供一个服务管理后台,用于管理人员查看服务集群的状态。如果服务注册和汇报时提供冗余的配置信息,服务

管理后台就可以呈现更为详细的服务信息。服务管理后台还可以将所有的服务依赖组织起来,形成完整的依赖。

原文地址:https://www.cnblogs.com/codechange/p/9181313.html

时间: 2024-10-26 12:27:36

服务发现的基本原理的相关文章

服务发现框架选型,Consul还是Zookeeper还是etcd

本文并不介绍服务发现的基本原理.除了一致性算法之外,其他并没有太多高深的算法,网上的资料很容易让大家明白上面是服务发现. 想直接查看结论的同学,请直接跳到文末. 目前,市面上有非常多的服务发现工具,<Open-Source Service Discovery>一文中列举了如下开源的服务发现工具.(http://jasonwilder.com/blog/2014/02/04/service-discovery-in-the-cloud/) 上面表格中,前三个是通用的,后面都是各大公司自己造的轮子

服务发现的基础概念

服务发现与服务发现组件的基本原理 什么是服务发现 在传统的系统部署中,服务运行在一个固定的已知的 IP 和端口上,如果一个服务需要调用另外一个服务,可以通过地址直接调用,但是,在虚拟化或容器话的环境中,服务实例的启动和销毁是很频繁的,服务地址在动态的变化,如果需要将请求发送到动态变化的服务实例上,至少需要两个步骤: 服务注册 - 存储服务的主机和端口信息 服务发现 - 允许其他用户发现服务注册阶段存储的信息 服务发现的主要优点是可以无需了解架构的部署拓扑环境,只通过服务的名字就能够使用服务,提供

Spring Cloud官方文档中文版-服务发现:Eureka服务端

官方文档地址为:http://cloud.spring.io/spring-cloud-static/Dalston.SR3/#spring-cloud-eureka-server 文中例子我做了一些测试在:http://git.oschina.net/dreamingodd/spring-cloud-preparation Service Discovery: Eureka Server 服务发现:Eureka服务端 How to Include Eureka Server 如何创建Eurek

Android网络服务发现(NSD)协议的使用

Android的网络服务发现协议(NSD)可以用于在小范围的网络中发现邻近设备上的某个应用.这对于一些社交网络.多人游戏类的应用会非常有帮助. Android的NSD的使用方法大致上分为四种操作: 1. 注册网络服务 2. 发现网络服务 3. 连接网络服务 4. 注销网络服务 使用NSD时一定要注意: 记得在Manifest中加入android.permission.INTERNET 权限,不然程序会崩溃. 一. 注册网络服务 注册网络服务需要两样东西: 网络服务的信息(NsdServiceIn

Spring Cloud官方文档中文版-服务发现:Eureka客户端

官方文档地址为:http://cloud.spring.io/spring-cloud-static/Brixton.SR7/#_spring_cloud_netflix 文中例子我做了一些测试在:http://git.oschina.net/dreamingodd/spring-cloud-preparation Spring Cloud Netflix This project provides Netflix OSS integrations for Spring Boot apps th

Kubernetes如何使用kube-dns实现服务发现

大纲: ?       Kubernetes中如何发现服务 ?       如何发现Pod提供的服务 ?       如何使用Service发现服务 ?       如何使用kube-dns发现服务 ?       kube-dns原理 ?       组成 ?       域名格式 ?       配置 注:本次分享内容基于Kubernetes 1.2版本! 下面从一个简单的例子开始讲解. 1.Kubernetes中如何发现服务 ◆   发现Pod提供的服务 首先使用nginx-deploym

服务发现系统etcd介绍

一.概述 etcd是一个高可用的键值存储系统,主要用于共享配置和服务发现.etcd是由CoreOS开发并维护的,灵感来自于 ZooKeeper 和 Doozer,它使用Go语言编写,并通过Raft一致性算法处理日志复制以保证强一致性.Raft是一个新的一致性算法,适用于分布式系统的日志复制,Raft通过选举的方式来实现一致性,在Raft中,任何一个节点都可能成为Leader.Google的容器集群管理系统Kubernetes.开源PaaS平台Cloud Foundry和CoreOS的Fleet都

微服务架构下的服务发现

编者的话]这是关于使用微服务架构创建应用系列的第四篇文章.第一篇介绍了微服务架构的模式,讨论了使用微服务架构的优缺点.第二和第三篇描述了微服务架构内部的通讯机制.这篇文章中,我们将会探讨服务发现相关问题. 为什么要使用服务发现? 我们设想一下当正在写代码时,使用了提供REST API或者Thrift API的服务,为了完成一次服务请求,代码需要知道服务实例的网络位置(IP地址和端口).传统应用都运行在物理硬件上,服务实例的网络位置都是相对固定的.例如,代码可以从一个经常变更的配置文件中读取网络位

服务发现之美:Consul集群搭建

近几年随着Docker容器技术.微服务等架构的兴起,人们开始意识到服务发现的必要性.微服务架构简单来说,是一种以一些微服务来替代开发单个大而全应用的方法, 每一个小服务运行在自己的进程里,并以轻量级的机制来通信, 通常是 HTTP RESTful API.微服务强调小快灵, 任何一个相对独立的功能服务不再是一个模块, 而是一个独立的服务.那么,当我们需要访问这个服务时,如何确定它的地址呢?这时就需要服务发现了. Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发