《Spring Cloud》学习(一) 服务治理!

原文:http://www.cnblogs.com/crazycheng/p/10826283.html
前言:之前网上学习过Spring Cloud,对于工作上需要是足够了,总归对于一些方面一知半解,最近难得有些闲暇时间,有幸读了崔永超先生的《Spring Cloud 微服务实战》,一方面记录下自己的学习历程和读后感,一方面分享下自己对Spring Cloud微服务的一些见解,写下此文。

注意:本文着重于描述Spring Cloud运行的机制和原理部分,不会涉及到过多的代码,不会演示如何搭建注册发现,高性能注册中心,配置负载均衡等等,但是会对其内部运行机制及原理进行一定的详解。所以本文默认读者有一定的Spring Cloud基础。 您如果打算系统学习该技术,本人还是推荐上述提及书籍。

当然欢迎大牛指导错误及不足!
介绍:Spring Cloud是基于Spring Boot实现的微服务架构工具,提供了配置管理,服务治理,断路器,智能路由,微代理,控制总线,全局锁,决策竞争,分布式会话,集权状态管理等操作。
第一章 服务治理
服务治理是微服务架构的核心与基础,主要实现各个服务实例的自动化注册与发现。Spring Cloud Eureka 基于 Netflix Eureka 做了二次封装,主要负责完成微服务架构中的服务治理功能。主要用来实现服务注册发现,同时包含服务端,客户端组件。
一.服务注册 服务续约 服务发现

1.服务注册 服务续约

服务注册:服务治理中,构建注册中心来统一管理每个服务,客户端向注册中心发送自身服务的服务名,端口,IP,通信协议等等元数据信息。注册中心会将其并储存至本地服务清单(双层Map结构存储)。

高可用注册中心:分布式环境中,我们需要充分考虑发生故障的情况,所以在生产 环境中必须对各个组件进行高可用部署,对于服务注册中心也一样。 需要构建高可用的服务注册中心以增强系统的可用性。 Eureka Server的设计一开始就考虑了高可用问题,在Eureka的服务治理设计中,所有 节点即是服务提供方,也是服务消费方,服务注册中心也不例外。
Eureka Server的高可用实际上就是将自己作为服务向其他服务注册中心注册自己,这 样就可以形成一组互相注册的服务注册中心, 以实现服务清单的互相同步, 达到高可用的 效果。 以集群的方式部署注册中心,允许分片故障期间,其他分片继续提供服务发现注册,故障分片恢复时其他分片会把状态同步回来。不同的注册中心分片通过异步方式互相复制状态,提供高的实例可用性。

如图4个客户端之间可以相互调用。

服务续约: 客户端向注册中心注册自身的服务信息后,并且周期性的(默认30秒)发送心跳(eurekaTransport.registrationClient.sendHeartBeat方法)来更新服务租约。 注册中心如果一段时间(默认90秒)内没收到客户端的心跳续约,则会剔除该客户端。
注册流程详解:

客户端操作:服务启动时发送REST请求到注册中心的方式进行的,以discoveryClent.register(instanceinfo)方法进行服务注册,可以看到以com.netflix.appinfo.Instanceinfo对象为参数,该对象就是注册时客户端给服务端的服务的元数据信息(主机名、IP地址、端口号、状态页和健康检查等等)。

注册中心端操作:注册中心接收到注册请求后,先调用publishEvent函数,将该新服务注册的事件已请求转发的方式传播出去,通知其他节点的注册中心,达到服务同步,然 后调用com.netflix.eureka.registry.AbstractlnstanceRegistry父类中的register注册实现,将InstanceInfo中的元数据信息存储在一个ConcurrentHashMap对象中。 ConcurrentHashMap<String, Map<String,Lease<InstanceInfo>>>对象,它是一个两层Map结构,第一层的key存储服务名:InstanceInfo中的appName属性,第二层的key存储实例名:InstanceInfo中的instanceId属性。

2.服务发现
服务启动会调用com.netflix.discovery.DiscoveryClient的initScheduledTasks函数,发现在其中还有两个定时任务,分别是 服务获取 和 服务续约。
当我们启动服务消费者的时候,它会发送一个REST请求给服务注册中心,来获取注册中心存储的服务清单。为了性能考虑,Eureka Server会维护一份只读的服务清单来返回给客户端,同时每个客户端都会周期的(默认30秒)向注册中心咨询,获取到所有的服务实例清单,存入本地(serverList),可以对其他具体服务实例进行访问。(若希望修改缓存清单的 更新时间,可以通过 eureka.clent.registry-fetch-interval-seconds=30参数进行修改)。
二.服务消费

服务消费者在获取服务清单后,通过服务名可以获得具体提供服务的实例名和该实例的元数据信息。因为有这些服务实例的详细信息,所以客户端可以根据自己的需要决定具体调用哪个实例 (使用RestTemplate) 。

RestTemplate:主要有GET,POST,PUT,DELETE的请求方式。
GET有getForEntity和 getForObject 的重载。 POST有 postForEntity和 postFor Object的重载。
一般我们都会使用负载均衡结合 Ribbon 完成。当Ribbon与Eureka联合使用时,Ribbon的服务实例清单RibbonServerList会被DiscoveryEnabledNIWSServerList重写,扩展成从Eureka注册中心中获取服务端列表。 Ribbon是一个基于HTTP和TCP的客户端负载均衡器,它可以在通过客户端中配置的ribbonServerList服务端列表去轮询访问(默认)以达到均衡负载的作用。

(具体的Ribbon及RestTemplate下章负载均衡会详解)
三.服务下线 失效剔除

3.1服务下线
在系统运行过程中必然会面临关闭或重启服务的某个实例的情况,在服务关闭期间,我们自然不希望客户端会继续调用关闭了的实例。 所以在客户端程序中, 当服务实例进行正常的关闭操作时,它会触发一个服务下线的REST请求给注册中心,告诉服务注册中心:我要下线了。注册中心在接收到请求之后,将该服务状态置为下线(DOWN), 并把该下线事件传播出去。
3.2失效剔除
有些时候,我们的服务实例并不一定会正常下线,可能由于内存溢出,网络故障等原因使得服务不能正常工作,而服务注册中心并未收到服务下线的请求。为 了从服务列表中将这些无法提供服务的实例剔除, 注册中心在启动的时候会创建一个定时任务,默认每隔一段时间(默认为60秒)将当前清单中超时(默认为90秒)没有续约的服务剔除出去。

3.3自我保护
自我保护机制:服务注册到Eureka Server之后,会维护一个心跳连接,告诉Eureka Server自己还活着。EurekaServer在运行期间,会统计心跳失败的比例在15分钟之内是否低于85%, 如果出现低于的情况,EurekaServer会将当前的实例注册信息保护起来,让这些实例不会过期,尽可能保护这些注册信息。但是在这段保护期间内实例若出现问题,那么客户端很容易拿到实际已经不存在的服务实例,会出现调用失败的清况,所以客户端必须要有容错机制,比如可以使用请求重试、断路器等机制。
如果Eureka以集群模式部署,当集群中有分片出现故障时,那么Eureka就转入自我保护模式。它允许在分片故障期间继续提供服务的发现和注册,当故障分片恢复运行时,集群中的其他分片会把它们的状态再次同步回来。
当然也可以使用eureka.server.enableself-preservation=false参数来关闭保护机制,以确保注册中心可以将不可用的实例正确剔除。
四.健康检测

Actuator监控管理:为了系统获取各个微服务相关指标比如环境变量,垃圾收集信息,内存信息,线程池信息,HTTP请求统计。Spring Cloud提供了Actuator模块来自动构建一系列用于监控的端点,并且支持扩展。模块中自带一些常用资源的健康指标检接口,比如磁盘空间,DataSource链接,Mongo数据库可用,Rabbit服务,Redis,Solr检测等,也可以自己实现自定义检测器。

默认情况下,Eureka中各个服务实例的健康检测并不是通过spring-boot-actuator模块的/health 端点来实现的, 而是依靠客户端心跳的方式来保持服务实例的存活。在Eureka 的服务续约与剔除机制下,客户端的健康状态从注册到注册中心开始都会处于 UP状态, 除非心跳终止一段时间之后,服务注册中心将其剔除。 默认的心跳实现方式可以有效检查客户端进程是否正常运作, 但却无法保证客户端应用能够正常提供服务。由于大多数微服务应用都会有一些其他的外部资源依赖,比如数据库、 缓存、 消息代理等,如果我们的应用与这些外部资源无法联通的时候, 实际上已经不能提供正常的对外服务了,但是因为客户端心跳依然在运行, 所以它还是会被服务消费者调用,而这样的调用实际上并不能获得预期的结果。

在Spring Cloud Eureka中,我们可以通过简单的配置,把Eureka客户端的健康检测交给spring-boot-actuator模块的/health端点, 以实现更加全面的健康状态维护。

原文地址:https://blog.51cto.com/14084567/2394347

时间: 2024-08-26 18:49:25

《Spring Cloud》学习(一) 服务治理!的相关文章

Spring Cloud学习(一) 服务的注册与发现(Eureka)

1 创建服务注册中心 在这里,我需要用的组件是Spring Cloud Netflix的Eureka ,eureka是一个服务注册和发现模块. 1.1    创建model工程作为服务注册中心Eureka-server 项目结构 pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xml

java版b2b2c社交电商Spring Cloud构建微服务架构-服务注册与发现

Spring Cloud简介Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布式会话和集群状态管理等操作提供了一种简单的开发方式. Spring Cloud包含了多个子项目(针对分布式系统中涉及的多个不同开源产品),比如:Spring Cloud Config.Spring Cloud Netflix.Spring Cloud0 CloudFoundry.S

Spring Cloud构建微服务架构服务注册与发现

Spring Cloud简介Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布式会话和集群状态管理等操作提供了一种简单的开发方式. Spring Cloud包含了多个子项目(针对分布式系统中涉及的多个不同开源产品),比如:Spring Cloud Config.Spring Cloud Netflix.Spring Cloud0 CloudFoundry.S

基于Spring Cloud的微服务构建学习-3 服务治理:Spring Cloud Eureka

基于Spring Cloud的微服务构建学习-3 服务治理:Spring Cloud Eureka 什么是服务治理 服务治理可以说是微服务架构中最为核心和基础的模块,它主要用来实现各个微服务实例的自动化注册与发现. 为什么需要服务治理模块 在最初构建微服务系统的时候可能服务并不多,我们可以通过做一些静态配置来完成服务调用 此时看着一切都还正常. 随着项目逐渐接近尾声,维护人员需要维护的服务越来越多,越来越复杂,最终形成大量的配置文件,维护将会变得越来越困难.此时,微服务应用实例自动化管理框架变得

spring cloud 学习(4) - hystrix 服务熔断处理

hystrix 是一个专用于服务熔断处理的开源项目,当依赖的服务方出现故障不可用时,hystrix有一个所谓的断路器,一但打开,就会直接拦截掉对故障服务的调用,从而防止故障进一步扩大(类似中电路中的跳闸,保护家用电器). 使用步骤:(仍然在之前的示例代码上加以改造) 一.添加hystrix依赖 compile 'org.springframework.cloud:spring-cloud-starter-hystrix' 二.在需要熔断的方法上添加注解 package com.cnblogs.y

基于Spring Cloud的微服务构建学习-2 Spring Boot

基于Spring Cloud的微服务构建学习-2 Spring Boot 为什么使用Spring Boot而不是Spring Spring Boot具有自动化配置,快速开发,轻松部署优点,非常适合用作微服务架构中各项具体微服务的开发框架.它不仅可以帮助我们快速的构建微服务,还可以轻松简单的整合Spring Cloud实现系统服务化,而如果使用了传统的Spring构建方式的话,在整合过程中我们还需要做更多的依赖管理工作才能让它们完好的运行起来. Spring Boot的宗旨并非是重写Spring或

Spring Cloud 学习总结001-服务治理-Eureka

学习参考:http://blog.didispace.com/Spring-Cloud%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/ spring cloud由[服务注册中心,服务提供者,服务消费者]组成: 服务注册中心存储各个服务的信息,将一个原数据存储在一个[双层结构的map中], 第一城的key是服务名,第二层的key是服务的实例名, { 服务1:{ 实例1:实例1 实例2:实例2 } } 自我保护 Eureka server在运行期间会统计心跳失败比例在15分

基于Spring Cloud的微服务落地

请点击此处输入图片描述 微服务架构模式的核心在于如何识别服务的边界,设计出合理的微服务.但如果要将微服务架构运用到生产项目上,并且能够发挥该架构模式的重要作用,则需要微服务框架的支持. 在Java生态圈,目前使用较多的微服务框架就是集成了包括Netfilix OSS以及Spring的Spring Cloud.它包括: Spring Cloud Config:配置管理工具,支持使用Git存储配置内容,可以实现应用配置的外部化存储,支持客户端配置信息刷新.加密/解密配置内容等. Spring Clo

Spring Cloud学习(一)

Spring Cloud是什么? Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册.配置中心.消息总线.负载均衡.断路器.数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署.Spring并没有重复制造轮子,它只是将目前各家公司开发的比较成熟.经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂.易部署和易

Spring Cloud gateway 网关服务二 断言、过滤器

微服务当前这么火爆的程度,如果不能学会一种微服务框架技术.怎么能升职加薪,增加简历的筹码?spring cloud 和 Dubbo 需要单独学习.说没有时间?没有精力?要学俩个框架?而Spring Cloud alibaba只需要你学会一个就会拥有俩种微服务治理框架技术.何乐而不为呢?加油吧!骚猿年 上一篇我们讲述了gateway 的路由功能其实也类似与zuul服务的路由转发. 今天主要讲一下断言机制. 内置的断言工厂 介绍 Spring Cloud Gateway将路由作为Spring Web