Spring Cloud与微服务构建学习笔记之微服务应具备功能介绍(四)

本文介绍了Spring Cloud作为Java微服务架构的特点,包括服务的注册与发现、负载均衡、服务容错、服务网关、配置管理和链路追踪等功能。重点讨论了服务注册中心的健康检查、服务的负载均衡策略、熔断器机制的自我修复能力,以及服务网关在安全性与流量控制上的作用。
摘要由CSDN通过智能技术生成

Spring Cloud是Java语言的微服务架构, 依赖于Spring Boot,有持续交付和易部署的特点,Spring Cloud的组件非常多,涉及微服务的方方面面。微服务中的“服务”是一个独立运行的单元组件,每个单元组件运行在独立的进程中,组件与组件之间通常使用HTTP 这种轻量级的通信机制进行通信。
微服务的特点:

  • 按照业务来划分,单个服务代码量小,业务单一,易于维护。

  • 每个微服务都有自己的独立基础组件,例如数据库、缓存等。

  • 微服务之间的通信是通过HTTP协议或者消息组件,具有容错能力。

  • 微服务有一套治理方案,服务之间不耦合,可以随时加入和剔除服务。

  • 单个微服务能够集群化部署,并且有负载均衡能力。

  • 整个服务器系统应该有完整的安全机制,包括用户验证,权限验证,资源保护等。

  • 整个微服务系统有链路追踪的能力。

  • 有一套完整的日志系统。
    微服务的功能包括以下几方面:

  • 服务的注册和发现。

  • 服务的负载均衡。

  • 服务的容错。

  • 服务网关。

  • 服务配置的统一管理。

  • 链路追踪。

  • ‘实时日志。
    下面具体介绍微服务系统的功能:
    (1)服务的注册与发现:
    微服务由很多单一职责的服务单元组成,每个服务单元有众多实例,而且服务之间相互依赖构成网状,所以微服务系统需要服务注册中心来统一管理微服务实例,方便查看每一个微服务实例的健康状态。
    服务注册是指向服务注册中心注册一个实例,,服务提供者将自己的服务信息(如服务名称、IP地址等)告知服务注册中心。
    服务发现是指当服务消费者需要消费另一个服务时,服务注册中心能够服务消费者它所要消费的服务的实例信息(如服务名,IP地址等)。
    通常情况下一个服务既是服务提供者,也是服务消费者。服务消费者一般使用HTTP协议或者消息组件这种轻量级别的通信机制来进行服务消费。
    服务的注册与发现如图所示:
    在这里插入图片描述
    服务的注册中心会提供服务的健康检查功能,检查被注册的服务是否可用,通常一个服务实例注册后,会定时向服务注册中心发送“心跳”,以表示自己处于可用状态,当某服务实例停止向注册中心发送心跳一段时间后,服务注册中心会认为该服务实例不可用,会将该服务实例从服务注册列表中剔除,如果被剔除的服务实例过一段时间后继续向注册中心提供心跳,那么注册中心会重新将该服务实例加入注册中心列表。微服务的服务注册组件一般会提供可视化UI界面用来查看服务的健康状况。
    (2)服务负载均衡:
    服务与服务的相互调用一般通过HTTP通信协议实现,然而网络具备不可靠性,为了保证服务的高可用,服务单元通常是集群化部署,例如将服务提供者进行集群化部署,那么服务消费者该调用哪个服务提供者的实例?由此将涉及到服务的负载均衡。
    服务负载均衡的做法一般如下图所示:
    在这里插入图片描述
    所有的服务都向服务注册中心注册,服务注册中心持有每个服务的名称和IP地址,同时每个服务也会获取所有服务注册列表信息,服务消费者集成了负载均衡组件,该组件会向服务消费者获取服务注册列表信息,并每隔一段时间重新刷新获取该列表,当服务消费者消费服务时,负载均衡组件获取服务提供者所有的实例的注册信息,并通过负载均衡策略,选择一个服务提供者的实例,向该实例进行服务消费,由此实现服务负载均衡。
    服务注册中心不但需要定时接收每个服务的心跳(用来检查服务是否可用),而且每个服务都会定期获取服务注册列表信息,当服务实例数量很多时,服务注册中心也就承担了非常大的负载。由于服务注册中心在微服务中起着至关重要的作用,因此必须高可用(将服务注册中心集群化,每个服务注册中心的数据实例实时同步)。如下图所示:
    服务注册中心高可用:服务注册中心高可用
    (3)服务的容错
    在实际项目中,一个微服务系统往往由若干个微服务组成,服务的数量越多,服务之间额依赖性就越错综复杂,一个网络请求通常需要调用多个服务才可完成,如果一个服务不可用,例如网络延迟或故障,会影响到依赖这个不可用服务的其他服务,进而导致用户的请求处于阻塞状态,导致这些服务的线程资源消耗殆尽,进而导致他们不可用,最后导致整个系统处于瘫痪状态,即雪崩效应。
    为了解决分布式系统的这种雪崩效应,分布式系统引入了熔断器机制。熔断器的作用:当一个服务处理用户请求的失败次数在一定时间内小于设定的阈值时,熔断器处于关闭状态,服务正常,当服务处理用户请求的失败次数在一定时间内大于设定的阈值,说明服务出现故障,此时熔断器处于打开状态,此时所有的请求都会执行快速失败,不执行业务逻辑。而熔断器处于打开状态一段时间后会处于半打开状态,并执行一定数量的请求,剩余的请求会执行快速失败,若执行的请求失败了,则继续打开熔断器,若成功了,则熔断器关闭,因此熔断器的作用是保护服务。防止服务出现雪崩效应。
    除此之外,熔断器机制还有如下作用:

  • 将资源进行隔离:当某个服务的某个API接口出现故障,只会隔离该API该接口,不会影响其他API接口,被隔离的接口,会执行快速失败逻辑,不会等待,服务不会阻塞,如果不进行隔离,请求会一直处于阻塞状态,直到超时,若有大量请求同时处于阻塞状态,服务器线程资源将被迅速消耗完。

  • 服务降级功能:当服务处于正常状态时,大量请求在短时间内同时涌入,超过服务的处理能力,此时熔断器会被打开,将服务降级,以免服务因负载过高而出现故障。

  • 自我修复能力:例如当因某个微小故障导致熔断器被打开,例如短时间的网络故障,如果不能自我监控,自我检测和自我修复,则需开发人员手动关闭熔断器,会增加开发工作量。
    Netfix的Hystrix熔断器开源组件功能很强大,不仅有熔断器功能,还有熔断器状态检测,并提供界面友好的UI。
    (4)服务网关
    微服务系统通常将资源以API接口形式暴露给外界提供服务,API接口通常由服务网关(也称API网关)统一暴露,这样做可以将内部服务隐藏起来。在一定程度上保护了微服务系统的安全,API网关有请求转发的作用,另外也可能负责一定的安全验证,例如判断某个请求是否合法,该请求对某个资源是否具备操作权限,网关层以集群形式存在,在服务网关层之前可能需要加负载均衡层,通常为Nginx双机热备,通过一定的路由策略,将请求转发至网关层,到达网关层后经过一系列用户身份验证,权限判断,最终转发至具体服务。
    网关层的意义:

  • 将所有服务的API接口资源统一聚合,对外统一暴露,外界调用的API接口都是网关对外暴露的API接口。保护微服务系统内部的微服务单元API接口。防止被外界直接调用以及服务敏感信息对外暴露。

  • 网关可以做一些用户身份认证,权限认证,防止非法请求操作,对内部服务起到保护作用。

  • 可以实现监控功能,实时日志输出,对请求进行记录。

  • 可以用来做流量监控,在高流量的情况下对服务进行降级。

  • API接口从内部服务分离出来,方便测试。
    而网关实现以上功能需要做高可用,否则网关可能会成为服务中的瓶颈,最常用额网关组件有Zuul、Nginx.
    (5)服务配置的统一管理
    开发一个服务往往会有大量的配置文件,例如数据库的配置,日志输出等级配置,而不同的环境配置也不同,因此需要有统一管理配置的组件。例如Spring Cloud Config组件,阿里的Diamond,百度的Disconf,携程的Apollo等。
    举例Spring Cloud Config 说明服务配置统一管理:
    组件实现大致过程:
    ①、Config Server(配置服务)读取配置文件仓库的配置信息。配置文件仓库可以存放在配置服务的本地仓库,可以是放在远程的Git仓库。
    ②配置服务启动后,读取完成的配置信息存在配置服务的内存中。
    ③当服务的配置信息需要修改且修改完成后,向配置服务发送post请求刷新配置,从而服务会重新向配置服务重写读取配置文件。
    对于集群化的服务可以通过消息总线来刷新多个服务实例,如果服务数量较多,对配置中心需要考虑集群化部署,从而使配置中心高可用。
    (6)服务链路追踪
    微服务系统由很多微服务单元组成,服务与服务之间调用复杂,当出现错误或异常,会很难定位,因此必须要实现分布式链路追踪,跟进一个请求有哪些服务参与,参与的顺序是什么,从而使每个请求链路清晰可见。
    Google开源的链路追踪组件Dapper、Twitter的Zipkin、以及阿里的Eagleeye(鹰眼),都是非常优秀的链路开源组件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值