为什么使用服务发现?
想象一下,如果你在写代码调用一个有REST API或Thrift API的服务,你的代码需要知道一个服务实例的网络地址(IP地址和端口)。运行在物理硬件上的传统应用中,服务实例的网络地址是相对静态的,你的代码可以从一个很少更新的配置文件中读取网络地址。
在一个现代的,基于云的微服务应用中,这个问题就变得复杂多了,如下图所示:
服务实例的网络地址是动态分配的。而且,由于自动扩展,失败和更新,服务实例的配置也经常变化。这样一来,你的客户端代码需要一套更精细的服务发现机制。
有两种主要的服务发现模式:客户端服务发现(client-side discovery)和服务器端服务发现(server-side discovery)。我们首先来看下客户端服务发现。
客户端服务发现模式
当使用客户端服务发现的时候,客户端负责决定可用的服务实例的网络地址,以及围绕他们的负载均衡。客户端向服务注册表(service registry)发送一个请求,服务注册表是一个可用服务实例的数据库。客户端使用一个负载均衡算法,去选择一个可用的服务实例,来响应这个请求,下图展示了这种模式的架构:
一个服务实例被启动时,它的网络地址会被写到注册表上;当服务实例终止时,再从注册表中删除。这个服务实例的注册表通过心跳机制动态刷新。
Netflix OSS提供了一个客户端服务发现的好例子。Netflix Eureka是一个服务注册表,提供了REST API用来管理服务实例的注册和查询可用的实例。Netflix Ribbon是一个IPC客户端,和Eureka一起处理可用服务实例的负载均衡。下面会深入讨论Eureka。
客户端的服务发现模式有优势也有缺点。这种模式相对直接,但是除了服务注册表,没有其它动态的部分了。而且,由于客户端知道可用的服务实例,可以做到智能的,应用明确的负载均衡决策,比如一直用hash算法。这种模式的一个重大缺陷在于,客户端和服务注册表是一一对应的,必须为服务客户端用到的每一种编程语言和框架实现客户端服务发现逻辑。
服务器端服务发现模式
下图展示了这种模式的架构
客户端通过负载均衡器向一个服务发送请求,这个负载均衡器会查询服务注册表,并将请求路由到可用的服务实例上。通过客户端的服务发现,服务实例在服务注册表上被注册和注销。
AWS的ELB(Elastic Load Blancer)就是一个服务器端服务发现路由器。一个ELB通常被用来均衡来自互联网的外部流量,也可以用ELB去均衡流向VPC(Virtual Private Cloud)的流量。一个客户端通过ELB发送请求(HTTP或TCP)时,使用的是DNS,ELB会均衡这些注册的EC2实例或ECS(EC2 Container Service)容器的流量。没有另外的服务注册表,EC2实例和ECS容器也只会在ELB上注册。
HTTP服务器和类似Nginx、Nginx Plus的负载均衡器也可以被用做服务器端服务发现负载均衡器。例如,Consul Template可以用来动态配置Nginx的反向代理。
Consul Template定期从存储在Consul服务注册表的数据中,生成任意的配置文件。每当文件变化时,会运行一个shell命令。比如,Consul Template可以生成一个配置反向代理的nginx.conf文件,然后运行一个命令告诉Nginx去重新加载配置。还有一个更复杂的实现,通过HTTP API或DNS去动态地重新配置Nginx Plus。
有些部署环境,比如Kubernetes和Marathon会在集群中的每个host上运行一个代理。这个代理承担了服务器端服务发现负载均衡器的角色。为了向一个服务发送一个请求,一个客户端使用host的IP地址和服务分配的端口,通过代理路由这个请求。这个代理会直接将请求发送到集群上可用的服务实例。
服务器端服务发现模式也是优势和缺陷并存。最大的好处在于服务发现的细节被从客户端中抽象出来,客户端只需要向负载均衡器发送请求,不需要为服务客户端使用的每一种语言和框架,实现服务发现逻辑;另外,这种模式也有一些问题,除非这个负载均衡器是由部署环境提供的,又是另一个高需要启动和管理的可用的系统组件。
服务注册表(Service Registry)
服务注册表是服务发现的关键部分,是一个包含了服务实例的网络地址的数据库,必须是高可用和最新的。客户端可以缓存从服务注册表处获得的网络地址。但是,这些信息最终会失效,客户端会找不到服务实例。所以,服务注册表由一个服务器集群组成,通过应用协议来保持一致性。
正如上面提到的,Netflix Eureka是一个服务注册表的好例子。它提供了一个REST API用来注册和查询服务实例。一个服务实例通过POST请求来注册自己的网络位置,每隔30秒要通过一个PUT请求重新注册。注册表中的一个条目会因为一个HTTP DELETE请求或实例注册超时而被删除,客户端通过一个HTTP GET请求来检索注册的服务实例。
Netflix通过在每个EC2的可用区中,运行一个或多个Eureka服务器实现高可用。每个运行在EC2实例上的Eureka服务器都有一个弹性的IP地址。DNS TEXT records用来存储Eureka集群配置,实际上是从可用区到Eureka服务器网络地址的列表的映射。当一个Eureka服务器启动时,会向DNS发送请求,检索Eureka集群的配置,定位节点,并为自己分配一个未占用的弹性IP地址。
Eureka客户端(服务和服务客户端)查询DNS去寻找Eureka服务器的网络地址。客户端更想使用这个可用区内的Eureka服务器,如果没有可用的Eureka服务器,客户端会用另一个可用区内的Eureka服务器。
其它服务注册的例子包括:
- Etcd:一个高可用,分布式,一致的key-value存储,用来共享配置和服务发现。Kubernetes和Cloudfoundry都使用了etcd;
- Consul:一个发现和配置服务的工具。客户端可以利用它提供的API,注册和发现服务。Consul可以执行监控检测来实现服务的高可用;
- Apache Zookeeper:一个常用的,为分布式应用设计的高可用协调服务,最开始Zookeeper是Hadoop的子项目,现在已经顶级项目了。
一些系统,比如Kubernetes,Marathon和AWS没有一个明确的服务注册组件,这项功能是内置在基础设置中的。
下面我们来看看服务实例如何在注册表中注册。
服务注册(Service Registration)
前面提到了,服务实例必须要从注册表中注册和注销,有很多种方式来处理注册和注销的过程。一个选择是服务实例自己注册,即self-registration模式。另一种选择是其它的系统组件管理服务实例的注册,即第third-party registration模式。
自注册模式(The Self-Registration Pattern)
在self-registration模式中,服务实例负责从服务注册表中注册和注销。如果需要的话,一个服务实例发送心跳请求防止注册过期。下图展示了这种模式的架构:
Netflix OSS Eureka客户端是这种方式的一个好例子。Eureka客户端处理服务实例注册和注销的所有问题。Spring Cloud实现包括服务发现在内的多种模式,简化了Eureka的服务实例自动注册。仅仅通过@EnableEurekaClient注释就可以注释Java的配置类
self-registration模式同样也是优劣并存。优势之一在于简单,不需要其它组件。缺点是服务实例和服务注册表相对应,必须要为服务中用到的每种编程语言和框架实现注册代码。
第三方注册模式(The Third-Party Registration Pattern)
在third-party registration模式中,服务实例不会自己在服务注册表中注册,由另一个系统组件service registrar负责。service registrar通过轮询部署环境或订阅事件去跟踪运行中的实例的变化。当它注意到一个新的可用的服务实例时,就会到注册表中去注册。service registrar也会将停止的服务实例注销,下图展示了这种模式的架构。
service registrar的一个例子是开源的Registrator项目。它会自动注册和注销像Docker容器一样部署的服务。Registrator支持etcd和Consul等服务注册。
另一个service registrar的例子是NetflixOSS Prana。主要用于非JVM语言编写的服务,它是一个和服务实例配合的『双轮』应用。Prana会在Netflix Eureka上注册和注销实例。
service registrar是一个部署环境的内置组件,由Autoscaling Group创建的EC2实例可以被ELB自动注册。Kubernetes服务也可以自动注册。
third-party registration模式主要的优势在于解耦了服务和服务注册表。不需要为每个语言和框架都实现服务注册逻辑。服务实例注册由一个专用的服务集中实现。缺点是除了被内置到部署环境中,它本身也是一个高可用的系统组件,需要被启动和管理。
总结
在一个微服务应用中,服务实例在运行时的配置也会动态变化,包括他们的网络地址。为了满足客户端向服务发送请求的需要,必须要实现服务发现机制。
服务发现的关键部分是服务注册表。服务注册表是一个可用的服务实例的数据库。服务注册表提供了一个管理API和一个查询API。服务实例的注册和注销通过管理API实现,查询API用来寻找可用的服务实例。
有两种主要的服务发现模式:客户端服务发现和服务器端服务发现。客户端服务发现系统中,客户端查询服务注册表,选择一个可用的实例,响应一个请求;在服务器端服务发现系统中,客户端通过一个路由器发送请求,这个路由器会去查询服务注册表,并将请求发送给可用的实例。
有两种形式可以实现服务实例的注册和注销,一种是self-registration模式,一种是third-party registration模式。
一些部署环境中,需要通过类似Netflix Eureka,etcd或Apache Zookeeper的组件,启动自己的服务发现基础设施。其它的部署环境中,服务发现是内置的。比如,Kubernetes和Marathon处理服务实例的注册和注销,还会在每个集群host上运行一个代理,作为服务器端服务发现路由器的角色。
一个HTTP反向代理和Nginx也可以被用做服务器端服务发现负载均衡器。服务注册表可以推送路由信息到Nginx,引起配置更新,比如可以用Consul Template。Nginx Plus支持动态的重配置机制,可以从注册表中拉取服务实例相关的信息,还提供了远程配置的API。
微服务与微服务间分布式调用最主要的概念便是: protocol-aware heterogeneous interoperability; 各微服务可各自拥有自身的 platform (Java,C#, Scala…等等), 但, 各微服务间却只能藉由单一共同的协议 (protocol); 如: REST; 进行分布式的调用
微服务架构的产品或许会有数百甚至数千个微服务所构成。所以, 部署微服务时, 便很难经由手工来完成, 而必须相当程度的依赖自动化的 DevOps 工具。
服务注册与发现 | 部署 | 监控 |
Zookeeper Doozer Etcd SmartStack Eureka NSQ Serf Spotify DNS SkyDNS Consul |
Cloud Foundry Gradle Docker Docker Hub Docker Machine Kitematic Docker Compose Docker Swarm AWS Jenkins Continuum Hudson Artifactory Terraform Grunt OpenShift |
SonarCube Logstash New Relic Graphite Mesosphere / DCOS Winston Hystrix |
原文:微服务架构
转自:http://blog.csdn.net/jiaolongdy/article/details/51188798
相关推荐
服务注册与发现是微服务架构中至关重要的组成部分。它们使得服务能够动态地了解彼此的存在,并建立通信连接。 - **服务注册**:服务启动后,会向服务注册中心(如Eureka、Consul)注册自身信息,以便其他服务能够...
在微服务架构设计模式中,服务发现、服务路由、服务调用、服务监控和服务安全等都是非常重要的方面。服务发现是指服务如何被发现和注册的过程。服务路由是指服务如何被路由和分发的过程。服务调用是指服务如何被调用...
微服务架构的设计原则包括将应用划分成一系列小服务,每个服务可以围绕业务功能组织,可以独立开发、部署和扩展,并且服务治理、数据管理、基础设施自动化、容错和设计都是微服务架构中的关键部分。 OCTO是美团点评...
- **服务注册与发现**:服务注册中心允许服务实例向中心注册自己,并且服务消费者可以从服务注册中心发现可用的服务实例。 - **负载均衡**:在微服务架构中,通常会使用负载均衡器来分配客户端请求到不同的服务实例...
微服务架构包含服务治理组件,例如服务中心、服务注册与发现、负载均衡、断路器、智能路由和配置管理等,它们共同维护微服务系统健康运行。一个微服务系统通常涉及客户端、网关(如Nginx)、API网关(如Zuul)以及...
- **微服务平台**: 提供一系列工具和服务来支持微服务架构的实施,包括但不限于服务注册与发现、负载均衡、API网关等功能。 - **监控平台**: 监控各个服务的健康状况,及时发现问题并采取措施。 - **配置中心**: ...
在文档中,还涉及到了与微服务架构相关的技术术语,如“服务架构”、“容器化部署”、“负载均衡”、“服务注册与发现”、“API网关”、“配置中心”等。这些技术是微服务架构实践中的关键技术要素,文档中将对这些...
- **微服务组件**:Eureka作为服务注册与发现,Feign实现声明式服务调用,Ribbon负责客户端负载均衡,Hystrix提供断路器以防止级联故障,Zuul作为API网关,Sleuth实现服务追踪,Swagger用于API文档的生成和交互。...
5. **服务发现**:通过服务注册与发现机制,服务之间可以动态找到彼此,实现松耦合的通信。 6. **API Gateway**:作为系统对外的统一入口,处理跨服务的认证、授权、路由,以及可能的聚合和缓存等操作。 7. **持续...
- 服务注册与发现:在微服务架构中,服务实例需要动态管理,Spring Cloud提供了Eureka作为服务注册中心,服务实例启动时会向Eureka注册自己的信息,服务消费者则通过Eureka发现服务。 - 配置管理:随着微服务实例...
CellMesh可能提供了简单的API,帮助开发者轻松构建可扩展的微服务体系,支持动态的服务注册与发现、服务间的消息传递以及容错处理。 总的来说,"Go-微服务架构游戏服务框架"旨在为游戏开发提供一套高效、灵活且易于...
本书的Dubbo篇详细阐述了如何使用Dubbo构建和管理微服务,包括服务的注册与发现、服务调用、服务治理策略等。同时,通过实际案例分析,讲解了如何将原先的单体应用拆分为多个微服务,以及如何进行服务间的通信和协作...
3. **服务发现**:介绍服务注册与发现机制,如使用Eureka、Consul等工具,使得服务之间能动态地找到彼此。 4. **API Gateway**:作为微服务架构的入口,API网关处理客户端请求,聚合多个微服务的响应,提供认证、...
2. **服务治理**:包括服务注册与发现、负载均衡、熔断和降级策略等,这些都是确保服务高可用和容错性的重要手段。快手可能详细介绍了他们使用的具体服务治理框架和技术实践。 3. **数据一致性**:在微服务环境下,...
然而,这些挑战可以通过适当的工具和技术策略来克服,如使用服务注册与发现工具、引入事件驱动架构和采用容器化技术等。 总的来说,微服务架构为互联网行业的软件开发提供了更灵活、可扩展和高可用性的解决方案,使...
1. 服务注册与发现:在微服务架构中,服务需要相互调用,服务注册与发现机制帮助服务相互发现和通信。在文档中提到了Eureka作为服务注册中心,它是一个基于REST的组件,各微服务启动时会向Eureka注册自身信息,包括...