服务注册与发现中心采用Eureka,以AP为核心的高可用注册中心,保证高可用性和最终一致性,server之间互相注册的replicate机制可以单点注册、全局感知,通过集群式部署来避免单点故障导致服务不可用。
提供云端服务发现,一个基于Rest的服务,用于定位服务,以实现云端中间层的服务发现和故障转移。
主要用来实现服务治理,统一管理众多微服务应用的地址信息,以及复杂的调用关系,减少应用之间的耦合,通过提供服务方在Eureka Server注册服务,服务消费方在Server上订阅所需服务得到提供者的地址信息,完成一次服务之间的请求调用。
由Eureka Server和Eureka Client组成,Eureka Server用作注册中心,支持集群部署;Eureka Client是一个Java客户端,用来处理服务注册与发现。
Spring Cloud GateWay作为Spring Cloud生态系统中的网关,旨在为微服务架构提供一种简单有效的统一的API路由管理方式,并且基于Filter链的方式提供了网关基本的功能,如:安全、授权、监控/指标、限流等。
GateWay特征有:动态路由、基于HTTP请求的路由匹配、Predicates和Filters作用于特定路由、集成Hystrix熔断器、易于编写的Predicates和Filters、限流、路径重写、与服务注册发现组件结合根据serviceId转发。
重要的概念
请求时,客户端向GateWay发起请求,如果在GateWay Handler Mapping中找到与请求相匹配的路由(此处用到Predicate),将其发送到GateWay Web Handler,Handler再通过指定的过滤链来将请求发送到实际的服务执行业务逻辑,然后返回。期间,过滤器可能在发送代理请求之前(pre过滤器)或之后(post过滤器)执行。
GateWay基于Webflux,支持异步非阻塞编程。
一次服务调用请求过程,提供某个服务的应用可能有多个(集群部署),消费方需要从中选择一个进行调用,即客户端负载均衡技术,Ribbon主要提供客户端的软件负载均衡算法。
Ribbon支持许多常见的负载均衡策略,同时也支持自定义负载均衡策略。
Hystrix的主要作用是熔断器,控制故障范围,是一个容错管理工具,通过熔断机制控制服务和第三方库的节点,对延迟和故障提供更强大的容错能力。
由于网络分区环境的复杂性,通常服务不能保证100%的可用性,如果某个服务出现故障,调用该服务就会出现线程阻塞,此时若有大量请求涌入,线程资源耗尽后造成服务瘫痪。而由于服务之间的调用依赖性,故障会快速在服务群中扩散,严重时导致大量微服务不可用,这就是服务故障的“雪崩 ”效应。
Hystrix可以在服务故障时拦截请求,快速返回错误信息,同时自动探测服务状态以便后续恢复服务请求,另外也支持实现服务降级机制,可以显著增加整个分布式系统的健壮性和稳定性。
Feign是一个声明式的Web服务客户端,支持可插入注释、可插拔编码解码器,以及Ribbon的负载均衡、Hystrix和它的fallback和HTTP请求和响应的压缩。
将对Rest服务请求封装成接口形式,以调用本地接口的形式调用远程Rest服务,对开发更加直观友好。
Feign通过编写简单的接口和插入注解,Feign就会根据自定义的HTTP请求的参数、格式、地址等信息,来完全代理HTTP请求,通过调用接口就可以完成服务请求。
通过SpringMVC的相关注解可以对外暴露Rest服务。
随着微服务规模的增大,以及生产、测试等环境隔离的要求,由每个微服务应用单独维护各自的配置信息会非常混乱,而且每次配置信息的变更都需要应用的重启才能生效,因此需要一个分布式配置中心,提供统一的配置信息管理。
Spring Cloud中的分布式配置中心组件Spring Cloud Config,支持配置信息放在配置服务器本地,也支持存放在远程Git仓库中,集中化管理集群配置,可以分为两个角色,Config Server和Config Client。
Config Server保存配置信息在本地或远程仓库中,然后对外发布配置服务,将配置信息服务化;Config Client通过访问Config Server提供的服务接口,获取相关的配置信息来完成自身的应用初始化。
为了避免单点故障,同样可以部署成集群模式。
同样另一个问题,由配置中心统一管理,配置信息变更时,无需重启应用,就可以做到配置信息实时更新生效。
Spring Cloud Bus通过轻量的消息代理连接各个分布的节点,称为事件、消息总线,用于在集群中传播状态变化,可以与Spring Cloud Config联合使用实现配置信息热部署。主要功能有两点:
其本质是利用了MQ的广播机制在分布式系统中传播消息。
Spring Security是一个强大的、高度可定制化的身份验证和访问控制框架,两个主要目标就是 认证 和 授权,一般为先认证身份,然后进行授权。
认证协议——JWT。基本思路就是用户提供用户名和密码给认证服务器,服务器验证用户提交信息的合法性,验证成功返回一个Token,用户用这个Token访问服务器上受保护的资源。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
授权框架——OAuth2。OAuth允许用户提供一个令牌,而不是用户名和密码,每一个令牌授权一个特定的第三方应用在特定的时段内访问特定的资源。
随着系统和微服务应用的增多,一个业务可能需要多个微服务协同完成,链路上任何一个应用的服务出现问题都会导致业务失败,需要快速跟踪故障位置。
Spring Cloud Sleuth,主要功能是在分布式系统中提供追踪解决方案,并且兼容支持zipkin、HTrace和log-base追踪。
服务追踪从客户都拿发起请求到达被追踪系统边界开始,到被追踪系统向客户返回响应结束,称为一次trace;在trace过程每次调用服务时,埋入一个调用记录("span"),再附带上响应时间和请求成功与否等信息,这样,若干有序的span就组成了一个trace。
Sleuth为服务之间调用提供链路跟踪,可以做到理清服务间调用关系;耗时分析;可视化错误(借助zipkin);链路优化。
结合zipkin,将数据发到zipkin,进行数据可视化,展示微服务调用请求链、错误信息可视化。可以直观地看到一次请求经过了那些微服务,以及每个服务的耗时,在请求失败时可以快速定位到请求链中哪一环出了问题。
首先介绍两个Hystrix监控工具:
Actuator时Spring Boot提供的对应用系统的自省和监控的集成功能,可以查看应用配置的详细信息等,为了保证Actuator暴露的监控接口的安全性,需要添加安全管理的Security依赖。
Actuator监控分为原生端点和用户自定义端点两类,可以观察应用运行期间的各种性能指标和内部状况。
Spring Boot Admin:
由于使用Actuator监控,需要对每个应用单独调用固定的接口来进行监控,而且返回数据均为json数据。
Spring Boot Admin是一个开源社区项目,用于管理和监控SpringBoot应用程序。应用程序作为Spring Boot Admin Client向为Spring Boot Admin Server注册(通过HTTP)或使用SpringCloud注册中心(例如Eureka,Consul, Zookeeper)发现。 在前端界面展示Admin Client的Actuator端点上的一些监控信息。提供了安全登录界面的组件,并且和Spring Boot Security相结合,提供安全登录功能。
Spring Boot Admin Server中还可以集成Turbine组件,让Turbine中展示的内容整合到Admin Server中,和应用实例一起监控,方便查看和管理。
ElK,即ElasticSearch+Logstash+Kibana。
常见的分布式事务解决方案有:
Redis可以用来做分布式系统Session共享,同时,Redis做二级缓存对降低整个服务响应时间、减少数据库访问次数也有帮助,可选Redis Cluster(集群模式)和Redis Sentinel(哨兵模式)。