微服务的功能
服务的注册与发现
服务注册指 向服务注册中心注册一个服务实例,服务提供者将自己的服务信息(服务器、IP等)告知给服务中心。
服务发现指 当服务消费者需要消费另一个服务时,服务注册中心能告知消费者他所需要的服务的实例信息。
通常,一个服务即是提供者也是消费者。
服务消费者一般使用HTTP协议或消息组件这种轻量级的通信机制来进行服务消费
关系如下:
什么是“心跳”?
一个服务注册后,会定期向服务中心发送“心跳”,表明自己处于可用状态。当一个服务一段时间没有发送“心跳”,服务中心会把它从服务列表剔除,
如果之后再发送“心跳”,服务中心会重新把它放入服务列表。
----------------------------------------------------------------------------------------------------------
服务负载均衡
服务间的相互调用一般是通过HTTP协议来实现的,而网络往往具有不可靠性,为了保证服务的高可用性,往往采用集群化部署。
消费者如何选择提供者,这涉及到负载均衡。
所有的服务都向服务中心注册,每个服务也能定期获取所有服务列表,
消费者集成了负载均衡组件,组件能从消费者那获取所有服务列表,并隔一段时间刷新,
当消费者需要消费时,负载均衡组件能通过一定的负载均衡策略选择服务。
由于服务也得定期获取所有服务列表,当服务过多时,服务中心就会有很大的负载,为了实现高可用,一般可以把服务中心集群化,每个服务中心的数据实时同步。
----------------------------------------------------------------------------------------------------------
服务容错
服务间的依赖错综复杂,一个网络请求往往需要调用多个服务,
如果一个服务不可用,用户请求会处于阻塞状态,线程被阻塞,另外,等待此进程的其他服务也会被阻塞,这些服务的进程也会被阻塞,在高并发的情况下线程会很快耗尽,这样引发连锁反应,称之为“雪崩”。
为了解决“雪崩”,引入“熔断器”概念。
当请求一个服务的失败次数在一定时间小于阈值,熔断器关闭状态,服务正常。
当失败次数大于阈值时,打开熔断器,所有请求快速失败,解放了进程。
一段时间后熔断器半打开,执行一定数量的请求,剩下的快速失败,若依旧失败,继续打开,若成功,关闭熔断器。
作用总结:
1. 防雪崩
2. 资源隔离
3. 服务降级
4. 自我修复(一段时间尝试半开)
----------------------------------------------------------------------------------------------------------
服务网关
微服务系统中,资源是以API接口的形式暴露出来以提供服务,而API接口通常由服务网关(API网关层)统一暴露,请求先到达网关层,经过身份验证,权限判断等再转发到具体的服务,
内部的服务不对外提供API接口,这样可以把内部服务隐藏起来,一定程度上保护了系统安全。
备注:之前将的服务都是服务层,服务网关属于网关层,在服务层之上。
介绍:API网关有请求转发的功能,还能负责一定的安全验证,例如请求是否合法,是否有请求权限,网关层以集群方式存在。
网关层作用:
1. 资源统一聚合对外暴露,保护系统安全
2. 安全验证,权限验证
3. 请求监控,实现日志
4. 流量监控
5. 从内部服务剥离,方便测试
备注:网关层之上还有负载均衡层,通过一定的路由策略转发到网关层
----------------------------------------------------------------------------------------------------------
服务配置的统一管理
不同的服务有不同的配置文件,例如数据库配置、日志输出级别配置,且这些配置在不同环境也不一样,随着服务的增加,配置文件的管理是很麻烦的事。
有许多管理配置的组件,以Spring Cloud Config为例。
过程:
1. Config Server(配置服务)读取配置文件仓库的配置信息,(配置文件仓库可是本地仓库,也可放于远程GIT仓库)
2. 配置服务启动,读取配置,存于内存
3. 启动服务,例如A、B时,由于A、B指定了配置信息,他们会向配置服务读取配置
4. 当配置需要修改更新时,我们可向配置服务发送POST请求进行刷新,A、B服务也会重新读取
备注:对于集群化的服务,可通过消息总线来刷新,如果服务较多,配置服务也可以集群部署
----------------------------------------------------------------------------------------------------------
服务链路追踪
微服务系统有多个服务单元,服务单元很多且相互调用很复杂,出现异常很难定位,所以必须实现分布式链路追踪,跟进一个请求的服务过程,出了问题能很快定位。
常见地链路追踪组件有Google的Dapper、Twitter的Zipkin、阿里的Eagleeye