Veiking百草园


老狗咬咬乐-SpringCloud概述

老狗啃骨头   @Veiking   2021-05-12

老狗咬咬乐-SpringCloud概述

摘要:

在微服务概念风生水起的背景下,如何提供一种简单易行的分布式系统开发模型,成了水到渠成的事情,SpringCloud就是在这种背景下,应运而生。在微服务构建过程中,服务注册发现 、服务网关、负载均衡 、容错断路器、消息总线,以及服务配置 、服务监控等等一系列操作,都是非常重要的,接下来我们就看看SpringCloud提供的一揽子解决方案

Spring Cloud 简述

微服务概念风生水起的背景下,基于SpringBoot技术栈开发的方案也是如鱼得水,如何提供一种简单易行的分布式系统开发模型,成了水到渠成的事情,SpringCloud就是在这种背景下,顺应历史洪流,应运而生。


 
每个人都厌恶复杂繁琐和容易出错,大家已经从SpringBoot那里尝到了甜头,对于SpringCloud提供的一站式微服务系统架构解决方案,开发者基本是用熊抱的姿势来欢迎的。容易入手且能快速应用于生产,还需要其他理由吗?不得不说,Spring这一系列技术栈的进化,都继承和延续了Spring最初的优良基因,想想也是令人开心和兴奋的事情。

我们平时在微服务系统的构建过程中,服务注册发现服务网关负载均衡容错断路器消息总线,以及服务配置中心服务监控等等一系列操作,都是比较熟悉的,接下来我们就看看SpringCloud提供的一揽子解决方案里边,都有什么。

Spring Cloud 组件

说到SpringCloud组件,就不得不提Netflix(奈飞,或网飞),Netflix是一家将流媒体业务做到极致的公司,他的优秀品质在技术层面也有所体现,即Netflix贡献了SpringCloud中相当重要的几个核心组件。

由Netflix提供的组件主要有:EurekaZuulRibbonFeignHystrix等,熟悉SpringCloud的朋友,估计对这几个组件是相当熟悉了,对,他们就是Netflix出品!

来我们简单看看他这几个组件的主要功能。

Eureka

Spring Cloud Eureka服务注册发现组件,主要功能是提供一个服务注册中心,类似于服务发布平台;在微服务的架构体系中,所有的服务都可以在他上边注册发布,也可以在上面寻找所依赖的的服务。

如果把各个服务模块看作人的话,Eureka就类似于一个中介或者代理平台,这边能提供什么服务呢,就去平台发布一下;然后有需求的一方呢,就直接在平台上面去找,甚至双方都不用见面,也不用知道谁在后边工作,事儿就可以搞定了。

当然,Eureka本身也可以注册在Eureka之上,从而形成集群,从而提供更为强大的业务支持。

此外,Eureka还提供了一个简单的界面,方便查看当前Eureka上注册的所有服务。

Zuul

Spring Cloud Zuul网关,或者动态路由,所有客户端的请求,都将通过这个网关访问后台的服务。网关一般是系统唯一对外开放的入口,拥有对外部请求进行鉴权、限流、 路由、监控等诸多功能。

Zuul就像是门卫室热心的看门大爷,当外部发起访问的时候,他会进行盘查、筛选,能进来访问的他还能告诉你找谁谁谁哪个部门哪个科室在几楼在哪在哪。当然院子里来访者太多接待不过来,大爷也会客气的劝你:小伙子回去吧…

一般Zuul都是从Eureka处获取已注册的服务来响应请求,当然Zuul本身也存在单点的瓶颈问题。很简单,一个大爷搞不定的时候,再找个大爷搭伴儿干活,Zuul也是可以进行集群配置的,除此之外,还可以借助Nginx等工具协助处理一下网关方面的负载均衡等。

Ribbon

Spring Cloud Ribbon负载均衡组件,这个指的是微服务体系内部服务的负载均衡,当请求Eureka上已注册的服务,后面有多个实例的支持时候,我们就得考虑通过使用Ribbon来实现任务分发,确认具体由那个实例来提供服务。

负载均衡是大家都比较熟悉的,Ribbon就像一个恪守职责的调度员,看看到手的请求,后边支持的这些个实例,哪个有空,哪个任务不重,然后把工作派过去,是不是像极了我们平时的工作方式。

和其他负载均衡类似,Ribbon的负载均衡也需要相应算法的支持,Ribbon默认的策略是轮询策略(RoundRobinRule),必要的情况下,我也可以设置为随机策略(RandomRule),考虑到失败的可能,也可以添加重试策略(RetryRule),等等,当然这些策略也可以进行自定义

Feign

Spring Cloud Feign 是一个可以声明式调用的客户端,它的存在使得微服务之间的调用变得更为简单。

在介绍Feign之前,我们先了解下RestTemplate。原生的操作里,java程序访问restful服务,一般都是使用HttpClient的形式,这个东西写起来太繁琐还需要自己去处理异常,总之是太土,不合时宜,于是spring提供了一个相对简单便捷的模板类,即RestTemplate。

道理是利用RestTemplate我们可以实现服务间的访问,但SpringCloud并不满足现状,精益求精,又给我们提供了Feign的访问方式,这使得服务之间的调用如同服务内部相互调用那么简单方便,同时feign底层还是使用了ribbon作为负载均衡的,令整个方案的使用起来贴合更为紧密和流畅。

Hystrix

Spring Cloud Hystrix断路器组件,也叫熔断器。熔断器的作用就是整个微服务系统内部出现问题的时候,将问题局限在最小的范围内,不连累整个系统。


 
微服务底层的逻辑是各个业务相互独立且依赖,之间形成很多依赖调用关系,所以每个请求的响应后边可能是一连串传递的服务,程序运行出异常是避免不了的,访问也可能超时,如果其中的一个环节出现问题,如果不加以处理,这个问题就可能卡住整个请求链路,造这一连串的服务停顿,然后一个接一个的出现问题,从而造成整个系统所有可能相关的服务大面积崩溃。这种情况在技术上被称为“服务雪崩”,从字面意思就可以看出问题的严重性。

Hystrix组件就是为了避免这种现象的,当所调用服务出现异常的时候,用一种相对温和的方式进行反馈,避免资源上的占用和等待,从而避免因为问题影响的传递蔓延并引发整个系统的连锁反应。



好了,上边这几个核心大组件,就是Netflix送给我们提供的技术大礼包,看完是不是很有感觉。当然,Netflix提供的SpringCloud组件不止这些,后边遇到了我们再看。

除了这几个组件,SpringCloud还有很多其他的,作为开发者有必要了解的重要组件。

Config

Spring Cloud Config配置中心组件,Config是一个配置管理工具,支持使用Git存储配置内容,同时支持应用配置的外部化存储,支持客户端配置信息的刷新、加密解密配置内容等。

在微服务系统架构中,许多业务模块都被单独拆分成一个个独立的服务,这样就有很多独立的系统需要维护,统一管理各服务的配置文件,便成了一种非常现实且迫切的需求,于是,Config组件横空出世。Config的引入,让部署便捷、维护简单成为可能。一般来说,我们借助Config可以将配置文件内容加载在Config服务中;必要的时候,我们也可以将配置文件放置在git仓库中,维护的时候,直接将修改后的配置文件推送至git仓库,然后再配置一个对应的Config服务,对接git并同步刷新,这时所有的服务通过访问Config服务即可,是不是方便了很多。

一般在做方案的时候,为了保证系统稳定可靠,Config服务可以进行集群部署,避免因配置文件服务崩溃,导致整个系统运行出现问题。

Bus

Spring Cloud Bus消息总线组件,它的作用是管理和广播分布式系统中的消息,从而将分布式的节点用轻量的消息代理连接起来。Bus即可以用于广播配置文件的更改或者服务之间的通讯,也可以用于监控服务状态等。

消息总线是一种通信工具,可以在机器之间互相传输消息、文件等,同时也扮演着消息路由的角色,决定消息传输方向。在消息总线的加持下,系统内部的发送端一般只需将消息交给消息总线,就不用操心后续的事儿了。

消息总线管理和传播所有分布式项目中的消息,本质是在分布式的系统中利用MQ的广播机制传进行工作,目前常用的MQ有KafkaRabbitMQ等。

Stream

Spring Cloud Stream消息驱动组件,可以使微服务应用拥有构建消息驱动的能力,我们通俗讲,可以理解就是封装了MQ的API。

类似于数据持久化框架Hibernate,Hibernate通过不同的驱动方式,对使用者屏蔽了底层数据库的差异,或者我们通过HQL即可实现对各种数据库进行操作,这使得切换不同数据库成为可能。Stream也是类似,不同的MQ之间,有些地方差异还是蛮大的,使用时可能会面临不同的技术差异,Stream即是为了避免这种情况,尽量提供一个操作标准,无论我们底层使用何种MQ,都不应因细节差异受到影响。

Stream为MQ提供个性化的自动化配置,引用了发布-订阅、消费组、分区这三个核心概念,目前支持主流的MQ有RabbitMQ、Kafka、RocketMQ等。

Sleuth

Spring Cloud Sleuth服务跟踪组件,其主要作用是用来跟踪监控每个请求和服务的发生过程,然后进行日志输出。

在微服务系统架构中,当我们有许多应用服务的时候,即使是在系统内部,网络也可能会变得非常脆弱,毕竟资源有限。这时候各服务间的通信频率是非常高的,跟踪每个请求,监控耗时、延迟、服务响应时间等,就变成了非常有必要的事情。

Sleuth就提供了这种分布式跟踪的方案,然后配合ELKZipkin等,,实现日志分析和存储,从而帮助我们更好的分析系统瓶颈,解决系统问题

以上,就是几个相对比较典型,作为开发者很有必要知道的SpringCloud组件。

SpringCloud的星辰大海

事实上SpringCloud提供的组件和方案远比我们平时接触到的这些要丰富得多,许多优秀的公司和团队都在基于SpringCloud的解决方案上添砖加瓦,除了我们了解比较多的Netflix全家桶,其实还有Amazon全家桶Alibaba全家桶等等。

此外还有一些优秀的组件,像Spring Cloud Zookeeper,是用Zookeeper的方式实现服务的注册和发现,还有Spring Cloud Consul,类似的功能,也是Eureka的选替方案;像Spring Cloud Security,则提供的一个简单,灵活,强大的安全框架,提供认证和授权功能;Spring Cloud Data Flow则是提供了大数据批量运算和持续运算的统一编程模型和托管方案;Spring Cloud Task则提供定时任务等等等等,太多太多,基本能覆盖到各种使用场景。

写在最后

记得最早接触java的时候,印象最深刻的概念是面向对象,而接触spring的时候,最大的感触是面向接口。时至今日,我们在日常的学习开发过程中,越来越能感受到spring提倡这种面向接口编程高瞻远瞩的技术考量。

从当初EJB的困顿到spring的诞生,然后再一步步走来,进化到今天,撑起如此庞大的技术体系,想想也是一件令人欣慰的事情,希望每个人,都能够在这个过程中受益。

后面我们有机会就详细的过一过这些个组件。


老狗啃骨头


潜影拾光

老子坐清源

天地不仁,以万物为刍狗。

扫码转发

二维码
二维码
二维码
二维码
二维码
二维码

博文标签