
微服务架构
微服务是一种架构风格,对于一个大型复杂的业务系统,业务功能可以拆分成多个相互独立的微服务,各个微服务之间是松散耦合的,通过远程通信协议进行同步/异步通信,各个微服务模块可以被独立部署、扩/缩容以及升/降级。
技术选型
| Spring Cloud | Dubbo | |
| 功能 | 微服务完整方案 | 服务治理框架 |
| 通信方式 | REST、HTTP | RPC协议 |
| 服务发现/注册 | Eureka | ZK、Nacos |
| 负载均衡 | Ribbon | 客户端负载 |
| 容错机制 | 6种容错策略 | 6种容错策略 |
| 熔断机制 | Hystrix | 无 |
| 配置中心 | Spring Cloud Config | Nacos |
| 网关 | Zuul、Gateway | 无 |
| 服务监控 | Hystrix+Turbine | Dubbo+Monitor |
| 链路监控 | Sleuth+Zipkin | 无 |
| 多语言 | REST 支持多语言 | Java |
| 社区活跃 | 高(背靠Spring) | 高(背靠阿里) |
解决方案
基于Spring Cloud的微服务解决方案
| 组件 | 方案1 | 方案2 | 方案3 |
| 服务发现 | Eureka | Consul | etcd、Nacos |
| 共用组件 | 服务间调用组件Feign、负载均衡组件Ribbon、熔断器Hytrix | ||
| 网关 | 性能低:Zuul;性能高:Spring Cloud Gateway | 自研网关中间件 | |
| 配置中心 | Spring Cloud Config、携程阿波罗、阿里Nacos | ||
| 全链路监控 | zipkin(不推荐)、Pinpoint(不推荐)、Skywalking(推荐) | ||
| 搭配使用 | 分布式事务、容器化、DDD、gRPC |
基于Dubbo实现微服务解决方案
2012年,阿里巴巴在GitHub上开源了基于Java的分布式服务治理框架Dubbo,定位并不是成为微服务全面解决方案,而是专注于RPC领域,成为微服务生态体系中的重要组件。至于微服务化衍生的服务治理需求,Dubbo正在积极适配开源解决方案Nacos。Nacos的定位是一个更易于帮助构建云原生应用的动态服务发现、配置和服务管理平台。
Spring Cloud中间件
中间件概述
随着互联网的快速发展,以及云计算的出现,企业的IT架构正在发生深刻变革。在这个过程中,软件向大规模互联网云服务演化,无论是操作系统还是数据库都发生了深刻变化,中间件也在这个过程中不断演进和扩大边界。中间件本质上可以归属为技术架构,常见的中间件包含服务治理(Dubbo)、配置中心、全链路监控、API网关、分布式事务、分布式定时任务、消息中间件、分布式缓存、数据库中间件等。
Spring Cloud
由Spring官方开发维护,基于SpringBoot,提供完整的微服务解决方案。包括服务注册与发现、配置中心、全链路监控、API网关、熔断器等开源组件,可以随需扩展和替换组装。
Spring Cloud项目模块
Spring Cloud是一个开源项目集合,包含很多子项目。每个子项目拥有自己的版本号,为了对Spring Cloud整体进行版本编号,确定一个可用于生产上的版本标识。这些版本标识使用伦敦地铁站命名,按名称首字母排序。
| 组件 | 所属项目 | 组件作用 |
| Eureka | spring-cloud-netflix | 注册中心 |
| Zuul | spring-cloud-netflix | 第一代网关 |
| Sidecar | spring-cloud-netflix | 多语言 |
| Ribbon | spring-cloud-netflix | 负载均衡 |
| Hystrix | spring-cloud-netflix | 熔断器 |
| Turbine | spring-cloud-netflix | 集群监控 |
| Feign | spring-cloud-openfeign | 声明式HTTP客户端 |
| Consul | spring-cloud-consul | 注册中心 |
| Gateway | spring-cloud-gateway | 第二代网关 |
| Sleuth | spring-cloud-seluth | 链路追踪 |
| Config | spring-cloud-config | 配置中心 |
| Bus | spring-cloud-bus | 消息总线 |
| Pipeline | spring-cloud-pipelines | 部署管道 |
| Dataflow | spring-cloud-dataflow | 数据处理 |
Spring Cloud与服务治理中间件
服务治理中间件包含服务注册与发现、服务路由、负载均衡、自我保护、丰富的治理管理机制等功能。服务路由包括服务上下线、在线测试、机房就近选择、A/B测试、灰度发布等。负载均衡支持根据目标状态和目标权重进行负载均衡。自我保护包括服务降级、优雅降级、流量控制。
Spring Cloud作为一个服务治理中间件,对服务治理体系做了高度抽象,目前支持使用Eureka、Zookeeper、Consul作为注册中心。在Spring Cloud种可以通过Hystrix进行熔断自我保护,通过Ribbon进行负载均衡。
| 特征 | Consul | Zookeeper | etcd | Eureka |
| 服务健康检查 | 服务状态、内存、硬盘 | (弱)长链接,keepalive | 连接心跳 | 可配支持 |
| 多数据中心 | 支持 | |||
| kv存储服务 | 支持 | 支持 | 支持 | |
| 一致性 | raft | paxos | raft | |
| cap | ca | cp | cp | ap |
| 多语言能力 | http、dns | 客户端 | http、grpc | http |
| watch支持 | 全量/支持long polling | 支持 | 支持long polling | 支持long polling/大部分增量 |
| 自身监控 | metrics | metrics | metrics | |
| 安全 | acl/https | acl | https支持(弱) | |
| Spring Cloud集成 | 支持 | 支持 | 支持 | 支持 |
Spring Cloud与配置中心中间件
在单体应用程序中,我们一般的做法是把属性配置和代码硬编码放在一起。在分布式应用系统中,由于存在多个服务实例,需要分别管理每个具体服务工程中的配置,上线需要检查每个服务是否运行正常。上线后修改了某个服务工程配置,就需要重启分布式服务。我们需要把分布式系统中的配置信息抽取出来统一管理,这个管理的中间件称为配置中心。配置中心应该具备的功能,分别支持各种复杂的配置场景,与公司的运维体系和权限管理体系集成,配置兼容支持等。
Spring Cloud Config是Spring Cloud生态圈中的配置中心中间件,把应用原本放在本地文件中的配置抽取出来放在中心服务器,从而能够提供更好的管理、发布能力。Spring Cloud Config基于应用、环境、版本三个维度管理,配置存储支持Git和其他扩展存储,无缝支持Spring里Environment和PropertySource接口。Spring Cloud Config未提供可视化管控平台,会与其他的配置中心中间件取代Spring Cloud Config管理配置。
Spring Cloud与网关中间件
网关中间件概述
API Gateway(API网关),是出现在系统边界上的一个面向API的、串行集中式的强管控服务,这里的边界是企业IT系统的边界,可以理解为企业应用防火墙,主要起到隔离外部访问和内部系统的作用。在微服务概念流行前,API网关就已经诞生了,它的设计与出现主要是为了解决访问认证、报文转换、访问统计等问题。
随着微服务架构概念的提出,API网关成为微服务架构的一个标配组件。作为一个网关中间件,至少具备如下四大功能:
统一接入功能
为各种无线应用提供统一的接入服务,提供一个高性能、高并发、高可靠的网关服务。不仅如此,还要支持负载均衡、容灾切换、异地多活。
协议适配功能
网关对外的请求协议一般是HTTP和HTTP2协议,而后端提供访问的服务协议要么是REST协议要么是RPC协议。网关需要根据请求进来的协议进行协议适配,然后协议转发调用不同协议提供的服务。当一个HTTP请求经过网关时,通过一系列不同功能Filter处理完毕之后,需要进行协议适配,判断应该协议转发调用RPC服务、REST服务还是调用PHP提供的服务。
流量管控功能
网关作为所有请求流量的入口,当请求流量瞬间剧增,此时需要流量管控、流量调拨。当后端服务出现异常,服务不可用时,需要网关进行熔断和服务降级。在异地多活场景中需要根据请求流量进行分片,路由到不同机房。
安全防护功能
网关需要对所有请求进行安全防护过滤,保护后端服务。通过与安全风控部门合作,对IP黑名单和URL黑名单封闭控制,做风控防刷,防恶意攻击等。
Spring Cloud第一代网关Zuul
Spring Cloud第一代网关是在Netflix公司开源的网关组件Zuul上,基于Spring Boot注解,采用starter的方式进行二次封装,可以做到开箱即用。目前Zuul融合了Spring Cloud提供的服务治理体系,根据配置的路由规则或者默认的路由规则进行路由转发和负载均衡。可以与Spring Cloud生态系统内其他组件集成使用,例如:集成Hystrix可以在网关层面实现降级功能;集成Ribbon可以使得整个架构具备弹性伸缩能力;集成Archaius可以进行配置管理等。但是Spring Cloud Zuul如果需要做一些灰度、降级、标签路由、限流、WAF封禁,则需要自定义Filter做一些定制化实现。
Spring Cloud第二代网关Gateway
Spring Cloud Zuul处理每个请求的方式是分别对每个请求分配一个线程来处理。根据参考数据统计,目前Zuul最多能达到1000至2000 QPS。在高并发场景下,不推荐使用Zuul作为网关。因此出现了Spring Cloud第二代网关Spring Cloud Gateway。
Spring Cloud Gateway是Spring官方基于Spring5.0、Spring Boot2.0和Project Reactor等技术开发的网关,旨在为微服务架构提供一种简单、有效、统一的API路由管理方式。Spring Cloud Gateway底层基于Netty实现,其不仅提供统一的路由方式,并且基于Filter链的方式提供网关基本的功能。
Spring Cloud与全链路监控中间件
中大型互联网公司的后台业务系统由众多分布式应用组成。一个通过浏览器或移动客户端的前端请求到后端服务应用,会经过很多应用系统,并且留下足迹和相关日志信息。分散在每个业务应用主机下的日志信息不利于问题排查和定位问题发生的根本原因,此时就需要利用全链路中间件收集、汇总并分析日志信息进行可视化展示和监控告警。全链路监控中间件提供的主要功能包括:
定位慢调用
包括慢Web服务(含Restful web)、慢REST或RPC服务、慢SQL。
定位各种错误
包括4xx、5xx、Service Error。
定位各种异常
包括Error Exception、Fatal Exception。
展现依赖和拓扑
包括域拓扑、服务拓扑、trace拓扑。
Trace调用链
将端到端的调用、以及附加在这次调用的上下文信息、异常日志信息、每一个调用点的耗时都呈现给用户进行展示。
应用告警
根据运维设定的告警规则,扫描指标数据,如违反告警规则,则将告警信息上报到中央告警平台。




