Spring Cloud
为什么使用SpringCloud?
不论是商业应用还是用户应用,在<font color="#f15a23">业务初期都很简单,我们通常会把它实现为单体结构的应用。</font>但是,<font color="#f15a23">随着业务逐渐发展,产品思想会变得越来越复杂,单体结构的应用也会越来越复杂。</font><br>
<b style="font-size: inherit;"><font color="#9999ff">单体应用带来的问题:</font></b><br>代码结构混乱:业务复杂,导致代码量很大,管理会越来越困难。同时,这也会给业务的快速迭代带来巨大挑战<br>开发效率变低:开发人员同时开发一套代码,很难避免代码冲突。开发过程会伴随着不断解决冲突的过程,这会严重的影响开发效率<br>排查解决问题成本高:线上业务发现 bug,修复 bug 的过程可能很简单。但是,由于只有一套代码,需要重新编译、打包、上线,成本很高<br>
什么是SpringCloud?<br>
Spring Cloud是一系列框架的有序集合。<font color="#f15a23">它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发</font>,如服务发现注册、配置中心、智能路由、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。通俗的讲,<font color="#f15a23">Spring cloud就是用于构建微服务开发和治理的框架集合,并不是具体的一个框架</font>,主要贡献来自Netflix OSS。
由于单体结构的应用随着系统复杂度的增高,会暴露出各种各样的问题。近些年来,微服务架构逐渐取代了单体架构,且这种趋势将会越来越流行。Spring Cloud是目前最常用的微服务开发框架,已经在企业级开发中大量的应用。
使用微服务架构的好处<br>
<font color="#f15a23">服务的独立部署</font>:每个服务都是一个独立的项目,可以独立部署,不依赖于其他服务,耦合性低。<br>
<font color="#f15a23">服务的快速启动</font>:拆分之后服务启动的速度必然要比拆分之前快很多,因为依赖的库少了,代码量也少了。
<font color="#f15a23">更加适合敏捷开发</font>:敏捷开发以用户的需求进化为核心,采用迭代、循序渐进的方法进行。服务拆分可以快速发布新版本,修改哪个服务只需要发布对应的服务即可,不用整体重新发布。
<font color="#f15a23">职责专一</font>,由专门的团队负责专门的服务:业务发展迅速时,研发人员也会越来越多,每个团队可以负责对应的业务线,服务的拆分有利于团队之间的分工。
服务可以动态<font color="#f15a23">按需扩容</font>:当某个服务的访问量较大时,我们只需要将这个服务扩容即可。
<font color="#f15a23">代码的复用</font>:每个服务都提供RESTAPl,所有的基础服务都必须抽出来,很多的底层实现都可以以接口方式提供。
使用微服务架构的劣势
<font color="#f15a23">分布式部署,调用的复杂性高</font>:单体应用的时候,所有模块之前的调用都是在本地进行的,在微服务中,每个模块都是独立部署的,<font color="#f15a23">通过HTTP来进行通信</font>,这当中会产生很多问题,比如<font color="#f15a23">网络问题</font>、<font color="#f15a23">容错问题</font>、调用关系等。<br>
独立的数据库,分布式事务的挑战:<font color="#f15a23">每个微服务都有自己的数据库,这就是所谓的去中心化的数据管理。</font>这种模式的优点在于不同的服务,可以<font color="#f15a23">选择适合自身业务的数据</font>,比如订单服务可以用MySQL、评论服务可以用Mongodb、商品搜索服务可以用ElasticSearch。<font color="#f15a23">缺点就是事务的问题了</font>,目前最理想的解决方案就是<font color="#f15a23">柔性事务中的最终一致性</font>。<br>
<font color="#f15a23">测试的难度提升</font>:服务和服务之间通过接口来交互,当接口有改变的时候,对所有的调用方都是有影响的,这时自动化测试就显得非常重要了,如果要靠人工一个个接口去测试,那工作量就太大了。这里要强调一点,就是APl文档的管理尤为重要。<br>
<font color="#f15a23">运维难度的提升</font>:在采用传统的单体应用时,我们可能只需要关注一个Tomcat的集群、一个MySQL的集群就可以了,但这在微服务架构下是行不通的。当业务增加时,服务也将越来越多,服务的部署、监控将变得非常复杂,这个时候对于运维的要求就高了。
Spring Cloud和Dubbo区别
<b><font color="#9999ff">社区的支持:</font></b><br>首先Spring Cloud有强大的社区支持,在Java生态圈必定离不开Spring.且Spring Cloud的更新频率也越来越高。<br><br>Dubbo虽然出自阿里巴巴,但是有很长一段时间没维护了,原因是内部有另一个RPC的框架HSF,所以Dubbo被抛弃了,不过去年Dubbo又重回大众视野,对使用开源框架的用户来说,社区对框架的持续维护非常重要,所以Spring家族的产品更适合中小型公司。 <br>
<b><font color="#9999ff">关注内容:</font></b><br>Spring Cloud关注的是整个服务架构会涉及的方方面面,在Spring Cloud中各种组件应有尽有,从而使其具有可快速集成、方便、成本低等优势。<br><br>Dubbo关注的更细一些,只针对服务治理,相当于SpringCloud中的一个子集。能和Dubbo相互比较的应该是gRPC,Thrift之类的框架。 <br>
<b><font color="#9999ff">性能问题:</font></b><br>对于性能这块,Dubbo确实要比Spring Cloud好,原因大家也都清楚.Dubbo基于Netty的TCP及二进制的数据传输,Spring Cloud基于HTTP.HTTP每次都要创建连接,传输的也是文本内容,自然在性能上有些损耗。<br><br>Spring Cloud带来的性能损耗对于大部分应用来说是可以接受的,而它具有的HTTP风格的API交互,在不同的语言中是通用的,且对每个微服务的测试来说是非常方便的,也就是说Spring Cloud用小的性能损耗换来了更多好处。<br>
<b><font color="#9999ff">具体技术不同点:</font></b><br><font color="#99ccff">1》</font>服务调用方式: dubbo是RPC ,springcloud是Rest API<br><font color="#99ccff">2》</font>注册中心:Dubbo 是zookeeper,springcloud是eureka,也可以是zookeeper<br><font color="#99ccff">3》</font>服务网关:Dubbo本身没有实现,只能通过其他第三方技术整合。springcloud有Zuul路由网关,作为路由服务器,进行消费者的请求分发,Spring cloud支持断路器,与Git完美集成配置文件支持版本控制,事物总线实现配置文件的更新与服务自动装配等等一系列的微服务架构要素
Spring Boot和Spring Cloud的区别
SpringBoot专注于快速方便的开发单个个体微服务。<br>
SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务整合并管理起来,为各个微服务之间提供,配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等集成服务。<br>
SpringBoot可以离开SpringCloud独立使用开发项目, 但是SpringCloud离不开SpringBoot ,属于依赖的关系。SpringBoot专注于快速、方便的开发单个微服务个体,SpringCloud关注全局的服务治理框架。