微服务框架之Spring Cloud简介

微服务架构核心关键点

在了解Spring Cloud之前先了解一下微服务架构需要考量的核心关键点,如下图:

微服务架构的核心关键点

  1. 微服务的服务治理(服务注册及服务发现)

    通过服务发现,消费者可以在预先不知道服务提供者物理地址的情况下,仅通过相应的服务名称就可以实现服务调用。

    服务注册机制,可以让服务提供者在上线时将所提供的服务信息注册到服务治理服务器中,供服务消费者使用。当服务下线时将自己从服务治理服务器中注销,避免服务消费者调用而造成的异常。

  2. 微服务的负载均衡(客户端负载均衡的概念,也称之为软负载均衡。)

    核心思想就是在服务消费者(也就是客户端)保存有一份服务者列表,这份服务者列表通常是从服务治理服务器中动态获取,也可以采用固定配置方式,然后通过某种负载均衡策略来决定每次服务调用时所使用的具体服务实例,从而实现微服务之间的负载均衡。

  3. 微服务的统一入口

    对于微服务,API服务网关为微服务提供了一个统一入口,并能够附加一些路由规则,使得不同的微服务通过路由规则提供一致的访问入口。

  4. 微服务的容错

    针对微服务架构的容错提出了断路器、服务降级等模式,这些模式都可以有效防止微服务调用失败而引起的连锁反应,并且在必要时可以通过这些模式主动实施应用的降级处理,从而保证核心业务的正常运行。

  5. 微服务的统一配置

    由于在微服务架构的应用中微服务数量众多,建议统一对配置进行管理和发布更新

  6. 微服务的监控

    微服务的灵活和强大也为开发者带来了“噩梦”一般的调试和跟踪分析体验。日志聚合、日志可视化分析、调用链跟踪等解决方案,都可为我们所构建的微服务应用的运维提供强有力的武器。

  7. 微服务的部署

    在动辄几十个甚至上百个服务实例在线,并且不断上线、下线的场景下,开发者一定不愿意通过手工构建和部署这些服务实例,通过构建—发布管道来构建自动化发布流程。可以通过Docker工具来快速部署,通过k8s来构建自动化部署编排等。

对于以上等核心关键点的处理,不需要我们重复造车轮,Spring Cloud已经帮我们集成了,它使用Spring Boot风格将一些比较成熟的微服务框架组合起来,屏蔽掉了复杂的配置和实现原理,为快速构建微服务架构的应用提供了一套基础设施工具和开发支持。

Spring Cloud技术概览

Spring Cloud所提供的核心功能包含:

  • 基于Netflix实现服务治理、客户端负载均衡和声明式调用;
  • 服务网关;
  • 微服务容错管理;
  • 整合消息中间件提供消息驱动式开发;
  • 基于Spring Security提供微服务安全、单点登录功能;
  • 分布式、版本化的统一配置管理;
  • 微服务调用链及追踪管理。

Spring Cloud架构图

Spring Cloud架构图

Spring Cloud子项目

Spring Cloud旗下的子项目大致可以分为两类:

  1. 对现有成熟的第三方开源项目Spring Boot化,进行封装集成,使得基于Spring的开发非常容易集成和使用。
  2. 新增了一些微服务架构开发所需的基础设施,如Spring Cloud Config提供了统一配置中心、Spring Cloud Stream则充当了与KafkaRabbitMQ等消息中间件快速集成的桥梁。

如下:

1. Spring CloudSpring Boot

Spring Boot可以说是微服务架构的核心技术之一。通过在Spring Boot应用中添加Spring MVC依赖,就可以快速实现基于REST架构的服务接口,并且可以提供对HTTP标准动作的支持。而且Spring Boot默认提供JackJson序列化支持,可以让服务接口输入、输出支持JSON等。因此,当使用Spring Cloud进行微服务架构开发时,使用Spring Boot是一条必经之路。

2. Spring Cloud与服务治理(Eureka)

服务治理是Spring Cloud的核心,在实现上其提供了两个选择,即ConsulNetflixEureka

Eureka提供了服务注册中心、服务发现客户端,以及注册服务的UI界面应用。

Eureka的实现中,节点之间相互平等,有部分注册中心“挂掉”也不会对整个应用造成影响,即使集群只剩一个节点存活,也可以正常地治理服务。即使所有服务注册节点都宕机,Eureka客户端中所缓存的服务实例列表信息,也可让服务消费者能够正常工作,从而保障微服务之间互相调用的健壮性和应用的弹性。

3. Spring Cloud与客户端负载均衡(Ribbon)

Ribbon默认与Eureak进行无缝整合,当客户端启动的时候,从Eureka服务器中获取一份服务注册列表并维护在本地,当服务消费者需要调用服务时,Ribbon就会根据负载均衡策略选择一个合适的服务提供者实例并进行访问。

Spring Cloud通过集成NetflixFeign项目,为开发者提供了声明式服务调用,从而简化了微服务之间的调用处理方式。并且默认Feign项目集成了Ribbon,使得声明式调用也支持客户端负载均衡功能。

4. Spring Cloud与微服务容错、降级(Hystrix)

为了给微服务架构提供更大的弹性,在Spring Cloud中,通过集成Netflix下子项目Hystrix,通过所提供的@HystrixCommand注解可以轻松为我们所开发的微服务提供容错、回退、降级等功能。此外,Hystrix也默认集成到Feign子项目中。

Hystrix是根据“断路器”模式而创建。当Hystrix监控到某服务单元发生故障之后,就会进入服务熔断处理,并向调用方返回一个符合预期的服务降级处理(fallback),而不是长时间的等待或者抛出调用异常,从而保障服务调用方的线程不会被长时间、不必要地占用,避免故障在应用中的蔓延造成的雪崩效应。

Hystrix的仪表盘项目(Dashboard)可以监控各个服务调用所消耗的时间、请求数、成功率等,通过这种近乎实时的监控和告警,可以及时发现系统中潜在问题并进行处理。

5. Spring Cloud与服务网关(Zuul)

Spring Cloud通过集成Netflix中的Zuul实现API服务网关功能,提供对请求的路由和过滤两个功能

路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础。

过滤器功能则负责对请求的处理过程进行干预,是实现请求校验、服务聚合等功能的基础。

通过Zuul,可以将细粒度的服务组合起来提供一个粗粒度的服务,所有请求都导入一个统一的入口,对外整个服务只需要暴露一个API接口,屏蔽了服务端的实现细节。通过Zuul的反向代理功能,可以实现路由寻址,将请求转发到后端的粗粒度服务上,并做一些通用的逻辑处理。此外,Zuul默认会与Eureka服务器进行整合,自动从Eureka服务器中获取所有注册的服务并进行路由映射,实现API服务网关自动配置。

6. Spring Cloud与消息中间件(Stream)

Spring Cloud为简化基于消息的开发,提供了Stream子项目,通过建立消息应用抽象层,构建了消息收发、分组消费和消息分片等功能处理,将业务应用中的消息收发与具体消息中间件进行解耦,使微服务应用开发中可以非常方便地与KafkaRabbitMQ等消息中间件进行集成。

Spring Cloud Bus基于Stream进行扩展,可以作为微服务之间的事件、消息总线,用于服务集群中状态变化的传播。

比如Spring Cloud Config借助Bus,可以实现配置的动态刷新处理。

7. Spring Cloud与分布式配置中心(Config)

针对微服务架构下的配置文件管理需求,Spring Cloud提供了一个Config子项目。Spring Cloud Config具有中心化、版本控制、支持动态更新和语言独立等特性。

Config子项目中将微服务应用分为两种角色:配置服务器(Config Server)和配置客户端(Config Client)。使用配置服务器集中地管理所有配置属性文件,配置服务中心可以将配置属性文件存储到GitSVN等具有版本管理仓库中,也可以存放在文件系统中。默认采用Git的方式进行存储,因此可以很容易地对配置文件进行修改,并实现版本控制。

8. Spring Cloud与微服务链路追踪(Sleuth)

Spring Cloud中的Sleuth子项目为开发者提供了微服务之间调用的链路追踪。

Sleuth核心思想就是通过一个全局的ID将分布在各微服务服务节点上的请求处理串联起来,还原了调用关系,并借助数据埋点,实现对微服务调用链路上的性能数据的采集。

因此,通过Sleuth可以很清楚地了解到一个用户请求经过了哪些服务、每个服务处理花费了多长时间,从而可以对用户的请求进行分析。此外,通过将采集的数据发送给Zipkin进行存储、统计和分析,从而可以实现可视化的分析和展示,帮助开发者对微服务实施优化处理。

9. Spring Cloud与微服务安全(Security)

Spring Cloud Security为我们提供了一个认证和鉴权的安全框架,实现了资源授权、令牌管理等功能,同时结合Zuul可以将认证信息在微服务调用过程中直接传递,简化了我们进行安全管控的开发。

Spring Cloud Security默认支持OAuth 2.0认证协议,因此单点登录也可以非常容易实现,并且OAuth2.0所生成的令牌可以使用JWT的方式,进一步简化了微服务中的安全管理。

10. Spring Cloud的其他子项目

  • Spring Cloud Cli:提供了以命令行和脚本的方式来管理微服务。
  • Spring Cloud Data Flow:一个用于开发、执行大数据处理的统一编程模型和托管服务。其基于原生云,并重新对Spring XD进行设计,简化了大数据应用的开发,为基于微服务的分布式流处理和批处理数据通道提供了一系列模型和最佳实践。
  • Spring Cloud Task:用于短时的任务管理和调度微服务管理,通常与Data Flow一起使用。
  • Spring Cloud Starters:类似于Spring Boot的启动项目,为基于Spring Cloud的微服务开发提供开箱即用的依赖管理。
  • Spring Cloud Contract:这是面向Java的契约框架,消费者驱动的,旨在帮助开发者完成微服务测试的子项目。

选择Spring Cloud的理由

  • Spring Cloud作为Spring Boot的传承,遵循约定优于配置的原则,在使用时不需要复杂的配置就可以运行起来,学习曲线低。
  • Spring Cloud中的大部分子项目开箱即用,采用自动化配置机制,可说使用门槛非常低。
  • Spring Cloud属于Spring大家族,而Spring是进行企业级开发的首选框架,因此在项目中引入Spring Cloud的技术成本比较低。
  • Spring Cloud的口号就是开发“面向云环境的应用程序”,通过集成成熟的第三方开源组件,为微服务架构的开发提供了全方位的支持,并且在Spring这棵大树下后续的更新、完善都有保障。
  • Spring Cloud抛弃了传统的RPC通信,采用了基于HTTPREST方式,使得微服务接口更为灵活,服务提供者和消费者之间的依赖只需要一纸契约即可,而不存在代码级别的强依赖,这对快速演化的微服务架构更合适。
  • Spring Cloud并没有限制所使用的环境,可以与异构系统进行整合。同时对于所提供的各组件服务既可单独部署,又可集中部署,方便了运维和管理。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • 1 Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它...
    shunyang阅读 759评论 0 1
  • 最近一段时间不论互联网还是传统行业,凡是涉及信息技术范畴的圈子几乎都在讨论微服务架构。近期也看到各大技术社区开始组...
    AI乔治阅读 460评论 1 1
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 124,515评论 2 7
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 6,041评论 0 4