一、SpringCloud
1.1、什么是SpringCloud
SpringCloud不同于其他 Spring 的优秀项目, 它不再是 像SpringSecurity、SpringMvc... 的一个基础框架 , 而是一个更高层次的、 架构视角的综合性大型项目, 他的目标是构建一套标准化的微服务解决方案 。让架构师、 开发者在使用微服务理念构建应用系统的时候, 面对各个环节的问题都可以找到相应的组件来处理。
引用网友戏称的一个比喻:Spring Cloud 可以说是 Spring 社区为微服务架构提供的一个 “ 全家桶 ” 套餐。 由于 “ 套餐 ” 中的组件通过一个社区进行包装与整合, 使得 “ 套餐 ” 中各个组件之间的配合变得更加和谐, 这可以有效减少我们在组件的选型和整合上花费的精力 , 所以它可以帮助我们快速构建起基础的微服务架构系统。
1.2、SpringCloud缺点
Spring Cloud因其涵盖的内容非常广泛,因此对于很多初学者来说就像被专业名词轰炸了一样, 入门的难度也就大大提高了。 同时, 中文文档与资料的匮乏,以及官方文档的内容对于使用描述并不够细致等问题, 也直接提升了使用者的学习门槛。
二、什么是微服务架构
2.1、什么是微服务
“微服务 ”是在2014年3月名字叫Martin Fowler 所提出的,可以在他的官方博客上找到: https://martinfowler.com/articles/microservices.html
微服务是系统架构上的一种设计风格, 它的主旨是将一个原本独立的系统拆分成多个小型服务 ,这些小型服务都在各自独立的进程中运行,服务之间通过基于HTTP的RESTful API进行通信协作。由于有了轻量级的通信协作基础, 所以这些微服务可以使用不同的语言来编写。
2.2、微服务有什么优点
微服务就是将单个应用拆分为了多个应用(这里的应用可以理解为jar包或war包),然后通过框架提供的网关、服务治理、服务发现、服务熔断等等,给人的感觉就会像是一个应用,主要目的是拆分多个应用,一旦并发、cpu、内存达到一定的瓶颈,可以采取多机部署,分担服务器压力。
往往一个庞大的高并发的业务系统都会采用微服务。同时微服务给人的感觉就是专业的人干专业的事,订单模块就是负责订单业务,用户模块就是负责用户相关业务,这样做的好处就是项目比较好维护。
2.3、微服务面临的问题
在实施微服务之前, 我们必须要知道, 微服务虽然有非常多吸引人的优点, 但是也因为服务的拆分引发了诸多原本在单体应用中没有的问题。
- 运维的新挑战:运维人员需要维护的进程数量会大大增加,运维过程需要更多的自动化, 这就要求运维人员具备一定的开发能力来编排运维过程并让它们能自动运行起来(往往因为这一点 慢慢演变的开发也得具备一定的运维能力)。
- 接口的一致性:虽然我们拆分了服务, 但是业务逻辑上的依赖并不会消除,
只是从单体应用中的代码依赖变为了服务间的通信依赖 。 而当我们对原有接口进行了一些修改, 那么交互方也需要协调这样的改变来进行发布, 以保证接口的正确调用。 我们需要更完善的接口和版本管理, 或是严格地遵循开闭原则 。 - 分布式的复杂性:由于拆分后的各个微服务都是独立部署并运行在各自的进程内,它们只能通过通信来进行协作, 所以分布式环境的问题都将是微服务架构系统设计时需要考虑的重要因素, 比如
网络延迟、 分布式事务、 异步消息 等。
一旦使用微服务意味着项目会有很多个,我们不可能再使用传统的方式使用tomcat来部署了。 tomcat部署缺点:一旦有一个服务更新就需要重启tomcat 这时候就需要打jar包,使用java -jar命令来启动项目了,使用java -jar启动项目一旦有很多的话不容易维护, 于是便引进了docker部署,docker可以和jenkins相结合 来完成微服务的自动化部署 ,同时这也是现在很流行的技术体系。
2.4、架构类型划分
下面这张图代表的是我们的思想一直在不断变化,从刚开始的ORM对象关系映射,到后面的MVC分层,RPC远程调用,最后到现在流行的SOA面向服务开发。
2.4.1、单一应用架构
不断扩大的需求会使得单体应用变得越来越腕肿。单体应用的问题就逐渐凸显出来, 由于单体系统部署在一个进程内, 往往我们修改了一个很小的功能, 为了部署上线会影响其他功能的运行。随着系统的发展, 维护成本会变得越来越大, 且难以控制。
2.4.2、垂直应用架构
每个小应用各自都有自己独立的、完整的可运行的一套系统。
2.4.3、分布式服务架构
目前我接手的几个项目都是用的这个架构,服务之间调用并没有用注册中心。
应用之间交互不可避免,将核心业务抽取出来,用于提高业务复用及整合的分布式服务框架(RPC)是关键。
2.4.4、流动计算架构
应用越来越多,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率
三、版本选择
使用springcloud必然离不开springboot,这两个框架的版本可不是随便一选就能搭配使用的,假如用的版本不对,可能会出现各种问题。
3.1、SpringBoot版本
springboot官网:https://spring.io/projects/spring-boot
springboot的git源码地址:https://github.com/spring-projects/spring-boot
通过官网可以发现:截至目前springboot最稳定的版本是2.7.0
依稀记着我上家公司springboot版本是用的1.5.9 版本,项目是比较老的,已经有三四年了并且是个大项目。官网也明确说明了,强烈建议升级到2.0 及以上版本。
3.2、SpringCloud版本
springcloud官网:https://spring.io/projects/spring-cloud springcloud的git源码地址:https://github.com/spring-cloud
SpringCloud是一个由许多子项目组成的综合项目,各子项目有不同的发布节奏。为了管理SpringCloud与各子项目的版本依赖关系,发布了一个清单,其中包括了某个SpringCloud版本对应的子项目版本。
为了避免SpringCloud版本号与子项目版本号混淆,SpringCloud版本采用了名称而非版本号的命名,这些版本的名字采用了伦敦地铁站的名字,根据字母表的顺序来对应版本时间顺序。例如Angel是第一个版本, Brixton是第二个版本。
当SpringCloud的发布内容积累到临界点或者一个重大BUG被解决后,会发布一个"service releases"版本,简称SRX版本,比如Greenwich.SR2就是SpringCloud发布的Greenwich版本的第2个SRX版本。
目前我们公司有一个项目就是用的 Hoxton.SR4版本的SpringCloud + 2.2.5.RELEASE(RELEASE代表是发行版)版本的SpringBoot
截止目前官网最新可使用的版本是2021.0.3 :
3.3、如何进行版本选择
官网提供了cloud和springboot的版本对应。
更详细的查看:https://start.spring.io/actuator/info
这个是官网提供的,会给我们返回更详细的版本对应关系,如果我们不知道版本怎么选择,可以看这个网站 ,网站返回的是json,我们需要格式化一下。
在线json格式化:https://www.sojson.com/
现在要是学习最新的SpringCloud和SpringBoot应该用哪个版本?
四、Cloud组件
4.1、Cloud组件介绍
这张图是两年前springcloud的所有组件,其中有很多组件已经不再更新,不再更新不代表不能用,只能说不建议再用了,当下最流行的组件是Spring Cloud Alibaba 。
4.1.1、Spring Cloud Netflix
Netflix(Nasdaq NFLX) 美国奈飞公司,是一家会员订阅制的流媒体播放平台。由于微服务的快速发展,Netflix公司的微服务又相对比较成熟,于是在技术上毫无保留的把一整套微服务架构核心技术栈开源了出来,叫做Netflix OSS,也正是如此,在技术上依靠开源社区的力量不断的壮大。
Pivotal在Netflix开源的一整套核心技术产品线的同时,做了一系列的封装,就变成了Spring Cloud;Spring Cloud只是集成Netflix的各个组件,实现了各种starter,例如Eureka-starter、Zuul-starter,可以理解成简化Netflix微服务的使用,但是底层仍然是引用的Netflix ,封装过后同时又可以和其他Spring Cloud产品进行无缝集成。
Netflix的各个组件在2018年是最火的一年,而后面相对来说他的很多产品已经基本上不再使用,原因就是Netflix的部分组件已经停更。再加上由于他的停更,Alibaba就采取了他的思想,研究出了Spring Cloud Alibaba,而对于现在而言Spring Cloud Alibaba基本上完全可以取代Netflix组件。
Netflix源码社区:https://github.com/Netflix
Spring Cloud Netflix的五大组件(神兽):
-
Eureka:服务注册和发现,它提供了一个服务注册中心、服务发现的客户端,还有一个方便的查看所有注册的服务的界面。 所有的服务使用Eureka的服务发现客户端来将自己注册到Eureka的服务器上。 -
Zuul:网关,所有的客户端请求通过这个网关访问后台的服务。他可以使用一定的路由配置来判断某一个URL由哪个服务来处理。并从Eureka获取注册的服务来转发请求。 -
Ribbon:即负载均衡,Zuul网关将一个请求发送给某一个服务的应用的时候,如果一个服务启动了多个实例,就会通过Ribbon来通过一定的负载均衡策略来发送给某一个服务实例。 -
Feign:服务客户端,服务之间如果需要相互访问,可以使用RestTemplate,也可以使用Feign客户端访问。它默认会使用Ribbon来实现负载均衡。 -
Hystrix:监控和断路器。我们只需要在服务接口上添加Hystrix标签,就可以实现对这个接口的监控和断路器功能。
Spring Cloud Netflix的其他组件:
- Archaius:动态属性配置框架,URL、JDBC 和 Amazon DynamoDB 的动态配置源的实现。
- Turbine:Turbine 是一种用于将服务器发送事件 (SSE) JSON 数据流聚合成单个流的工具。Hystrix的监控中,只能监控单个节点,实际生产中都为集群,因此可以通过Turbine来监控集群下Hystrix的metrics情况。
4.1.2、Spring Cloud Alibaba
Spring Cloud Alibaba组件:
- Nacos:Nacos是现在开发当中出场率最高的,他可以完成服务发现、配置管理、DNS服务,也就是一个组件可以完成config、Eureka、Bus三个组件的功能。
(1) spring-cloud-starter-alibaba-nacos-discovery :服务发现是微服务架构中的关键组件之一。在这样的架构中,手动为每个客户端配置服务列表可能是一项艰巨的任务,并且使动态扩展变得极其困难。Nacos Discovery 帮助您将服务自动注册到 Nacos 服务器 ,Nacos 服务器会跟踪服务并动态刷新服务列表 。此外,Nacos Discovery 将服务实例的一些元数据,如主机、端口、健康检查 URL、主页等注册到 Nacos。 (2)spring-cloud-starter-alibaba-nacos-config :使用 Spring Cloud Alibaba Nacos Config 基于 Spring Cloud 的编程模型快速接入 Nacos 配置管理能力。 - sentinel:Sentinel中文名称是哨兵,Sentinel 主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助用户提升服务的稳定性。流量监控就是您可以看到您的服务器的监控数据,精确到秒级,甚至可以看到少于 500 个节点的集群的整体运行状态,pom依赖
spring-cloud-starter-alibaba-sentinel 。 - dubbo:Alibaba提供了
spring-cloud-starter-dubbo ,对dubbo进行的封装,主要是为了让我们更好的让dubbo和Cloud其他组件进行集成使用。 - RocketMQ:是一个开源的分布式消息系统。它基于高可用分布式集群技术,提供低延迟、高稳定性的消息发布和订阅服务。Alibaba提供了
spring-cloud-starter-stream-rocketmq ,帮我们在cloud当中很方便的集成RocketMQ。 - ANS:Alibaba提供了
spring-cloud-starter-alicloud-ans ,ANS(Application Naming Service)是EDAS的一个组件。Spring Cloud 阿里云 ANS 提供符合 Spring Cloud 规范的商业版服务注册和发现,让您可以在本地开发应用,在云端运行。 - acm:Alibaba提供了
spring-cloud-starter-alicloud-acm ,Spring Cloud阿里云ACM是Spring Cloud客户端商用产品ACM (Application Configuration Management)的一个实现,是免费的。 - OSS:Alibaba提供了
spring-cloud-starter-alicloud-oss ,OSS(Object Storage Service)是阿里云上的存储产品。alicloud-oss提供符合 Spring Cloud 规范的商业化存储服务。提供易于使用的 API,并支持在 Spring 框架中集成 Resource。 - schedulerX:SchedulerX(分布式作业调度)是阿里云产品EDAS的一个组件。
spring-cloud-starter-alicloud-schedulerX 提供了符合 Spring Cloud 规范的分布式作业调度。SchedulerX提供高精度秒级、高稳定性、高可用性的定时作业调度服务,支持简单的单服务器作业、简单的多主机作业、脚本作业、网格作业等多种作业类型。 - SMS:SMS(Short Message Service)是一种覆盖全球的短信服务,
spring-cloud-starter-alicloud-sms 提供了一个更易用的API,用于快速访问阿里云的短信服务。
企业级分布式应用服务 EDAS(Enterprise Distributed Application Service)是一个应用托管和微服务管理的 PaaS 平台,提供应用开发、部署、监控、运维等全栈式解决方案,同时支持 Spring Cloud、Apache Dubbo(以下简称 Dubbo )、HSF 等微服务运行环境,助力您的各类应用轻松上云。
4.1.3、其他组件
-
Spring Cloud Config:springcloud config 项目是一个解决分布式系统的配置管理方案。它包含了 client 和 server 两个部分,server 端提供配置文件的存储、以接口的形式将配置文件的内容提供出去,client 端通过接口获取数据、并依据此数据初始化自己的应用。 简单一点的说就是:在分布式环境中,很多的服务都是集群部署,那就意味着这些集群部署的服务都需要相同的配置文件。所以,这时候就引入了 springcloud config 这个组件,使用该组件来进行众多的配置文件的统一管理。例如,我们在修改某一配置文件时,只需要在远程的 gitHub 等工具上面修改即可,不用多次的在众多的配置文件中来回繁琐的修改。 -
Spring Cloud Bus:Spring Cloud Bus 将分布式系统的节点与轻量级消息代理链接起来。这可以用来广播 状态改变(例如配置改变)或其他管理指令。 -
Spring Cloud Sleuth:微服务跟踪(sleuth)其实是一个工具,它在整个分布式系统中能跟踪一个用户请求的过程(包括数据采集,数据传输,数据存储,数据分析,数据可视化),捕获这些跟踪数据,就能构建微服务的整个调用链的视图,这是调试和监控微服务的关键工具。 -
Spring Cloud Data Flow:Spring Cloud Data Flow是什么,虽然已经出现一段时间了,但想必很多人不知道,因为在项目中很少有人用。不仅找不到很多中文资料,英文资料也一样少的可怜。Spring Cloud Data Flow是基于微服务的,专门用于流式和批式数据处理的框架。 -
Spring Cloud Security:Spring Cloud Security 用于以最小的麻烦构建安全的应用程序和服务。基于 Spring Boot 和 Spring Security OAuth2,我们可以快速创建实现常见模式的系统,如单点登录、令牌中继和令牌交换。 -
Spring Cloud Zookeeper:通过一些简单的注释,您可以快速启用和配置应用程序中的常见模式,并使用 Zookeeper 构建大型分布式系统。提供的模式包括服务发现和分布式配置。 -
Spring Cloud Stream:Spring Cloud Stream 是一个框架,用于构建与共享消息系统连接的高度可扩展的事件驱动微服务。他可以和各种消息框架进行整合。 -
Spring Cloud CLI:Spring Boot CLI为Spring Cloud提供Spring Boot命令行功能。您可以编写 Groovy 脚本来运行 Spring Cloud 组件应用程序(例如)。您还可以轻松地执行加密和解密等操作,以支持具有秘密配置值的 Spring Cloud Config 客户端。使用 Launcher CLI,您可以方便地从命令行一次性启动 Eureka、Zipkin、Config Server 等服务(在开发时非常有用)。 -
Spring Cloud OpenFeign:同Feign是一样的,是一个远程调用框架,Feign已经停止更新,OpenFeign在Feign的基础上添加了对 Spring MVC 注释的支持。 -
Spring Cloud Task:Spring Cloud Task 允许用户使用 Spring Cloud 开发和运行短期微服务,并在本地、云中甚至在 Spring Cloud Data Flow 上运行它们。只需将@EnableTask您的应用程序作为 Spring Boot 应用程序(单个应用程序上下文)添加并运行。 -
Spring Cloud Connectors:简化了在 Cloud Foundry 和 Heroku 等云平台中连接服务和获得操作环境意识的过程,尤其是对于 Spring 应用程序。它是为可扩展性而设计的:您可以使用提供的云连接器之一或为您的云平台编写一个,您可以使用对常用服务(关系数据库、MongoDB、Redis、RabbitMQ)的内置支持或扩展 Spring与您自己的服务一起使用的云连接器。 -
Spring Cloud Circuit Breaker:提供了跨不同断路器实现的抽象。它提供了在您的应用程序中使用的一致 API,让您开发人员可以选择最适合您的应用程序需求的断路器实现。 -
Spring Cloud Consul:Consul是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其它分布式服 务注册与发现的方案,Consul 的方案更“一站式”,内置了服务注册与发现框 架、分布一致性协议实 现、健康检查、Key/Value 存储、多数据中心方案,不再需要依赖其它工具(比如 ZooKeeper 等)。 使用起来也较为简单。Consul 使用 Go 语言编写,因此具有天然可移植性(支持Linux、windows和 Mac OS X);安装包仅包含一个可执行文件,方便部署,与 Docker 等轻量级容器可无缝配合。 -
Spring Cloud Gateway:目前市场上很流行的网关服务,功能强大丰富,性能好,官方基准测试 RPS (每秒请求数)是Zuul的1.6倍,能与 SpringCloud 生态很好兼容,单从流式编程+支持异步上也足以让开发者选择它了。
4.2、停更的组件
1. eureka停更:
eureka目前已经在Netflix社区明确声明不在更新!而springcloud当中的eureka的starter仍然在更新,但是他更新只是为了兼容springcloud版本,并改变不了eureka已经停更的事实。
就好比假如 mysql版本不再更新了,而navcat客户端还在不断更新,我们天天跟Navicat打交道,以至于很多人不知道其实项目已经是个死项目了,没有发展前途了。
Netflix的eureka社区:https://github.com/Netflix/eureka/wiki
2. Hystrix停更不停用:
NetfLix官网明确声明:Hystrix 不再处于积极开发阶段,目前处于维护模式。Hystrix(版本 1.5.18)足够稳定,可以满足 Netflix 对我们现有应用程序的需求。
3. Feign停更:
Feign是在2019就已经不再更新了,通过maven网站就可以看出来,随之取代的是OpenFeign,从名字上就可以知道,他是Feign的升级版。
maven网站:https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-feign 4. Ribbon停更:
项目处于维护状态 ,已经好久没有更新过了。 https://github.com/Netflix/ribbon
5. Config:
Config没用停更,只不过现在大部分人都采用nacos来做配置中心。
6. Archaius停更:
Netflix下的Archaius在2018年就已经停更。
7. Bus:
SpringCloud原生的服务总线组件,现在风头也被Nacos抢了。
|