微服务为什么选Spring Cloud

转载自   微服务为什么选Spring Cloud

现如今微服务架构十分流行,而采用微服务构建系统也会带来更清晰的业务划分和可扩展性。同时,支持微服务的技术栈也是多种多样的,本系列文章主要介绍这些技术中的翘楚——Spring Cloud。这是序篇,主要讲述我们为什么选择Spring Cloud和它的技术概览。

1、为什么微服务架构需要Spring Cloud

简单来说,服务化的核心就是将传统的一站式应用根据业务拆分成一个一个的服务,而微服务在这个基础上要更彻底地去耦合(不再共享DB、KV,去掉重量级ESB),并且强调DevOps和快速演化。这就要求我们必须采用与一站式时代、泛SOA时代不同的技术栈,而Spring Cloud就是其中的佼佼者。

DevOps是英文Development和Operations的合体,他要求开发、测试、运维进行一体化的合作,进行更小、更频繁、更自动化的应用发布,以及围绕应用架构来构建基础设施的架构。这就要求应用充分的内聚,也方便运维和管理。这个理念与微服务理念不谋而合。

接下来我们从服务化架构演进的角度来看看为什么Spring Cloud更适应微服务架构。点击这里查看Spring系列教程集合。

1.1 从使用nginx说起

最初的服务化解决方案是给提供相同服务提供一个统一的域名,然后服务调用者向这个域名发送HTTP请求,由Nginx负责请求的分发和跳转。

这种架构存在很多问题:

  • Nginx作为中间层,在配置文件中耦合了服务调用的逻辑,这削弱了微服务的完整性,也使得Nginx在一定程度上变成了一个重量级的ESB。

  • 服务的信息分散在各个系统,无法统一管理和维护。每一次的服务调用都是一次尝试,服务消费者并不知道有哪些实例在给他们提供服务。这不符合DevOps的理念。

  • 无法直观的看到服务提供者和服务消费者当前的运行状况和通信频率。这也不符合DevOps的理念。

  • 消费者的失败重发,负载均衡等都没有统一策略,这加大了开发每个服务的难度,不利于快速演化。

为了解决上面的问题,我们需要一个现成的中心组件对服务进行整合,将每个服务的信息汇总,包括服务的组件名称、地址、数量等。服务的调用方在请求某项服务时首先通过中心组件获取提供这项服务的实例的信息(IP、端口等),再通过默认或自定义的策略选择该服务的某一提供者直接进行访问。所以,我们引入了Dubbo。

 

1.2 基于Dubbo实现微服务

Dubbo是阿里开源的一个SOA服务治理解决方案,文档丰富,在国内的使用度非常高。

使用Dubbo构建的微服务,已经可以比较好地解决上面提到的问题:

  • 调用中间层变成了可选组件,消费者可以直接访问服务提供者。

  • 服务信息被集中到Registry中,形成了服务治理的中心组件。

  • 通过Monitor监控系统,可以直观地展示服务调用的统计信息。

  • Consumer可以进行负载均衡、服务降级的选择。

 

但是对于微服务架构而言,Dubbo也并不是十全十美的:

 

  • Registry严重依赖第三方组件(zookeeper或者redis),当这些组件出现问题时,服务调用很快就会中断。

  • DUBBO只支持RPC调用。使得服务提供方与调用方在代码上产生了强依赖,服务提供者需要不断将包含公共代码的jar包打包出来供消费者使用。一旦打包出现问题,就会导致服务调用出错。

  • 最为重要的是,DUBBO现在已经重新维护了,对于技术发展的新需求,需要由开发者自行拓展升级。这对于很多想要采用微服务架构的中小软件组织,显然是相当合适的。

目前Github社区上有一个DUBBO的升级版,叫DUBBOX,提供了更高效的RPC序列化方式和REST调用方式。但是该项目也基本停止维护了。

 

1.3 新的选择——Spring Cloud

作为新一代的服务框架,Spring Cloud提出的口号是开发“面向云环境的应用程序”,它为微服务架构提供了更加全面的技术支持。点击这里查看Spring系列教程集合。
结合我们一开始提到的微服务的诉求,我们把Spring Cloud与DUBBO进行一番对比:

微服务需要的功能

Dubbo

Spring Cloud

服务注册和发现

Zookeeper

Eureka

服务调用方式

RPC

RESTful API

断路器

负载均衡

服务路由和过滤

分布式配置

分布式锁

计划开发

集群选主

分布式消息

Spring Cloud抛弃了Dubbo的RPC通信,采用的是基于HTTP的REST方式。严格来说,这两种方式各有优劣。虽然从一定程度上来说,后者牺牲了服务调用的性能,但也避免了上面提到的原生RPC带来的问题。而且REST相比RPC更为灵活,服务提供方和调用方的依赖只依靠一纸契约,不存在代码级别的强依赖,这在强调快速演化的微服务环境下,显得更加合适。


Eureka相比于zookeeper,更加适合于服务发现的场景,这点会在下一篇会详细展开。

很明显,Spring Cloud的功能比DUBBO更加强大,涵盖面更广,而且作为Spring的拳头项目,它也能够与Spring Framework、Spring Boot、Spring Data、Spring Batch等其他Spring项目完美融合,这些对于微服务而言是至关重要的。前面提到,微服务背后一个重要的理念就是持续集成、快速交付,而在服务内部使用一个统一的技术框架,显然比把分散的技术组合到一起更有效率。更重要的是,相比于Dubbo,它是一个正在持续维护的、社区更加火热的开源项目,这就保证使用它构建的系统,可以持续地得到开源力量的支持。点击这里查看Spring系列教程集合。

 

2、Spring Cloud技术概览

 

下图展示了Spring Cloud的完整技术组成:

服务治理:这是Spring Cloud的核心。目前Spring Cloud主要通过整合Netflix的相关产品来实现这方面的功能(Spring Cloud Netflix),包括用于服务注册和发现的Eureka,调用断路器Hystrix,调用端负载均衡Ribbon,Rest客户端Feign,智能服务路由Zuul,用于监控数据收集和展示的Spectator、Servo、Atlas,用于配置读取的Archaius和提供Controller层Reactive封装的RxJava。除此之外,针对

Feign和RxJava并不是Netiflix的产品,但是被整合到了Spring Cloud Netflix中。


对于服务的注册和发现,除了Eureka,Spring Cloud也整合了Consul和Zookeeper作为备选,但是因为这两个方案在CAP理论上都遵循CP而不是AP(下一篇会详细介绍这点),所以官方并没有推荐使用。

 

分布式链路监控:Spring Cloud Sleuth提供了全自动、可配置的数据埋点,以收集微服务调用链路上的性能数据,并发送给Zipkin进行存储、统计和展示。

 

消息组件:Spring Cloud Stream对于分布式消息的各种需求进行了抽象,包括发布订阅、分组消费、消息分片等功能,实现了微服务之间的异步通信。Spring Cloud Stream也集成了第三方的RabbitMQ和Apache Kafka作为消息队列的实现。而Spring Cloud Bus基于Spring Cloud Stream,主要提供了服务间的事件通信(比如刷新配置)。

 

配置中心:基于Spring Cloud Netflix和Spring Cloud Bus,Spring又提供了Spring Cloud Config,实现了配置集中管理、动态刷新的配置中心概念。配置通过Git或者简单文件来存储,支持加解密。

 

安全控制:Spring Cloud Security基于OAUTH2这个开放网络的安全标准,提供了微服务环境下的单点登录、资源授权、令牌管理等功能。

 

命令行工具:Spring Cloud Cli提供了以命令行和脚本的方式来管理微服务及Spring Cloud组件的方式。

 

集群工具:Spring Cloud Cluster提供了集群选主、分布式锁(暂未实现)、一次性令牌(暂未实现)等分布式集群需要的技术组件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/325506.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

压力与动力是否成正比?

昨天在班里测试了下,检测他们数据库学的怎么样,看他们平时在课堂上的互动挺棒。看了下题,不是很难,满怀着愉悦的心情去打印了50份,挨个分发下去,由于我18级那边有课要上,所以这边的考试就辛苦王…

[开源] 基于ABP,Hangfire的开源Sharepoint文件同步解决方案----SuperRocket.SPSync

(一)项目背景 Sharepoint是微软的一个产品,很多公司都在使用它,也有很多公司以前使用它,现在可能需要移植到别的平台,也可能只是移植其中的文件存储,比如说移植到微软云,或者亚马逊云…

永远不要、不要、不要、不要放弃

Never, never, never, never give up. 永远不要、不要、不要、不要放弃。今天来写一下18级学生们的状态吧,最近主要是解决了1班的三大问题,第一,上机测试问题。第二,周一到四期间学习任务安排问题。第三,学习氛围的进一…

JS的时间定时器

<script>var t null;t setTimeout(time, 1000); //開始运行function time() {clearTimeout(t); //清除定时器dt new Date();var y dt.getFullYear();var mt dt.getMonth() 1;var day dt.getDate();var h dt.getHours(); //获取时var m dt.getMinutes(); //获取分…

微软正式发布XAML Standard与.NET Standard 2.0:现已提供下载

微软在本月早些时候召开的 Build 2017 开发者大会上的披露的 XAML Standard 和 .NET Standard 2.0&#xff0c;现已正式发布。新工具旨在为开发者们带来“基于同一标准的跨平台 XAML 语言结构”&#xff08;基于 UWP 和 Xamarin.Forms&#xff09;&#xff0c;以及基于社区反馈…

Spring Boot 2.X 来临,本文将带你起飞

转载自 Spring Boot 2.X 来临&#xff0c;本文将带你起飞 当前互联网技术盛行&#xff0c;以Spring 框架为主导的Java 互联网技术成了主流&#xff0c;而基于Spring 技术衍生出来的Spring Boot&#xff0c;采用了“约定优于配置”的思想&#xff0c;极大地简化了Spring 框架…

时间胶囊——给未来的留言板

时间胶囊”是一个给未来的留言板&#xff0c;你可以为自己&#xff0c;朋友&#xff0c;爱人&#xff0c;家人&#xff0c;或者任何人留下你现在想对他们说的话、图片&#xff0c;将来某一天&#xff0c;他们将来这里打开“时间胶囊”读到你的留言&#xff01;那么“时间胶囊”…

Echarts五步法加初体验

使用步骤&#xff1a; 引入echarts 插件文件到html页面中准备一个具备大小的DOM容器 <div id"main" style"width: 600px;height:400px;"></div>初始化echarts实例对象 var myChart echarts.init(document.getElementById(main));指定配置项…

深入理解C#:编程技巧总结(一)

以下总结参阅了&#xff1a;MSDN文档、《C#高级编程》、《C#本质论》、前辈们的博客等资料&#xff0c;如有不正确的地方&#xff0c;请帮忙及时指出&#xff01;以免误导&#xff01; 1..实现多态性的两种方式&#xff1a;继承抽象类、实现接口 其实就是协变的应用&#xff…

使用中控指纹采集器开发指纹识别案例V1.0

这两天正好有点琐碎的时间&#xff0c;就将两年前未开发完毕的指纹识别项目翻出来继续写了写。 运行环境&#xff1a;  中控指纹采集器  Win10操作系统  .netframework4.0  Sqlserver2008及以上 源码已经上传到微信公众号【雄雄的小课堂】中&#xff0c;回复“指纹识别…

在CentOS上使用Jexus托管运行 ZKEACMS

ZKEACMS Core 是基于 .net core 开发的&#xff0c;可以在 windows, linux, mac 上跨平台运行&#xff0c;接下来我们来看看如何在 CentOS 上使用Jexus托管运行 ZKEACMS&#xff0c;通常我们在Linux部署ASP.NET Core应用&#xff0c;按照微软的官方文档&#xff0c;我们通常需要…

中控指纹采集器开发指纹识别项目(说明)

历史指纹识别相关开发版本&#xff1a;指纹识别开发1.0&#xff0c;开发时间&#xff1a;2018-01-04 指纹识别开发2.0&#xff0c;开发时间&#xff1a;2018-01-04指纹识别开发3.0&#xff0c;开发时间&#xff1a;2020-01-06可以从时间上看的出来&#xff0c;在2018年1月4日&a…

MSSQL-Scripter,一个新的生成T-SQL脚本的SQL Server命令行工具

这里向大家介绍一个新的生成T-SQL脚本的SQL Server命令行工具&#xff1a;mssql-scripter。它支持在SQL Server、Azure SQL DB以及Azure SQL DW中为数据库生成CREATE和INSERT T-SQL脚本。 Mssql-scripter是一个跨平台的命令行工具&#xff0c;功能等同于SQL Server Management…

用startSmoothScroll实现RecyclerView滚动到指定位置并置顶,含有动画。

RecyclerView滚动到指定位置并置顶 RecyclerView本身提供了几个定位的方法&#xff0c;除了手动滑动的scrollTo&#xff0c;smootScrollTo和scrollBy&#xff0c;smoothScrollBy方法之外&#xff0c;有一个直接滑动到指定位置item的scrollToPosition方法和另一个在此基础上平滑…

重要说明,粉丝必看【java人脸识别说明】

重要通知关于人脸识别简要说明&#xff1a; 源码即日起由免费改为收费。以下是微信收款码&#xff0c;如果有需要可以直接扫码转账即可。&#xff08;注意&#xff0c;源码均为测试好的&#xff0c;故各位在开发的过程中遇到的源码问题不提供任何技术支持。【转账完成之后可以直…

包装类

如果用包装类可以打印出来 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title></title><script type"text/javascript">var s123;snew String(s);s.hello"nihao";console.log(s.hello);<…

深入理解C#:编程技巧总结(二)

以下总结参阅了&#xff1a;MSDN文档、《C#高级编程》、《C#本质论》、前辈们的博客等资料&#xff0c;如有不正确的地方&#xff0c;请帮忙及时指出&#xff01;以免误导&#xff01; 在上一篇 深入理解C#&#xff1a;编程技巧总结&#xff08;一&#xff09; 中总结了25点&a…

不一样的假期,到底哪里不一样?

目录&#xff1a;1.回访17级同学们&#xff0c;了解同学们目前的工作情况2.和18级同学们聊天&#xff0c;了解假期在家的学习情况3.检查19级同学们提交至小程序内的作业。回忆17级前两天将我带的17级毕业班挨个找了一遍&#xff0c;大致了解了下大家最近的工作情况&#xff0c;…

TensorFlowSharp入门使用C#编写TensorFlow人工智能应用

TensorFlowSharp入门使用C#编写TensorFlow人工智能应用学习。 TensorFlow简单介绍 TensorFlow 是谷歌的第二代机器学习系统&#xff0c;按照谷歌所说&#xff0c;在某些基准测试中&#xff0c;TensorFlow的表现比第一代的DistBelief快了2倍。 TensorFlow 内建深度学习的扩展支…

Spring Cloud 升级最新 Finchley 版本,踩了所有的坑

转载自 Spring Cloud 升级最新 Finchley 版本&#xff0c;踩了所有的坑 Spring Boot 2.x 已经发布了很久&#xff0c;现在 Spring Cloud 也发布了 基于 Spring Boot 2.x 的 Finchley 版本&#xff0c;现在一起为项目做一次整体框架升级。 升级前 > 升级后 Spring Boot …