@Author : Runsen
最近几年微服务很火,大家都在建设微服务,仿佛不谈点微服务相关的技术,都显得不是那么主流了。
微服务
讲起springcloud之前,我们需要了解一下什么是微服务。
简单来说,微服务就是一种将一个单一应用程序拆分为一组小型服务的方法,拆分完成后,每一个服务都运行在独立的进程中,服务于服务之间采用轻量级的通信机制来进行沟通(Spring Cloud 中采用基于 HTTP 的 RESTful API)。
我们先认识下应用架构的变迁,下面是应用架构的变迁历史
单体架构
早期, 企业的对外提供的服务比较单一, 客户流量也相对不足。 因此将所有的模块,代码打包在一个项目中,集中部署一台机器上。
就像学校里面做的项目,搞定前端,数据库,部署到服务器,把WEB应用 APP做出来就是以前的单体架构。
其实就是给你用的,基本部署到一个云服务器。没有任何的实用,企业的客户会越来越多, 流量越来越大, 单单一台服务器对外提供服务, 哪里撑得住啊, 不分分钟被搞挂掉才怪。
遇到并发和大流量,基本就Over了。
SOA架构
应用软件over了,企业损失惨重,你也可以滚蛋了。一台最垃圾云服务器1G运行内存加50G空间,虽然垃圾,但是我几个服务器一起上。一个挂了,还有几个撑着,然后我们赶紧把挂的重启,这样不就可以顶住了吗,这就是SOA架构,全面就是Service-Oriented Architecture。简称SOA,翻译过来面向服务的架构,下图就是SOA架构图
- 将所有的服务提供者注册到注册中心。
- 客户端向注册中心订阅服务
- 注册中心向客户端推送有效的服务信息
- 客户端得到所有可调用服务的信息后, 根据需求,按负载均衡算法, 进行调用, 获取数据。
下面用百度百科把SOA说得高大上点。
面向服务的架构(SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)进行拆分,并通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种各样的系统中的服务可以以一种统一和通用的方式进行交互。(百度百科)
比如,阿里巴巴的Dubbo数据源就是一个非常好的服务治理SOA框架,
微服务
微服务可以理解为是 SOA 的一个传承,一个本质的区别是微服务是一个真正分布式、去中心化的,微服务的拆分比 SOA 更加彻底。
微服务架构的系统是一个分布式的系统,每个微服务基本是一个能独立发布的应用服务,因此可以作为独立组件升级、灰度或复用等,对整个大应用的影响也较小,每个服务可以由专门的组织来单独完成,依赖方只要定好输入和输出口即可完全开发,甚至整个团队的组织架构也会更精简,因此沟通成本低、效率高。
比如,一个项目出了问题。哪里出了问题,难道将整个项目从头到尾看一遍吗,就算你肯,老板也不肯啊。你把企业都有的私密的源码都知道了,万一你突然间要挟涨薪。这时候,就将一个项目分成几个小项目。一个小项目负责一个功能实现,再整合起来,不就是一个大项目。
每一个服务,都是围绕具体的业务进行构建,例如一个电商系统,订单服务、支付服务、物流服务、会员服务等等,这些拆分后的应用都是独立的应用,都可以独立的部署到生产环境中。在采用微服务之后,我们的项目不再拘泥于一种语言,可以 Java、Go、Python、PHP 等等,混合使用,这在传统的 应用开发中,是无法想象的。而使用了微服务之后,我们可以根据业务上下文来选择合适的语言和构建 工具进行构建。
比如,今日头条APP。推荐算法可能是用Python,处理并发可能用go,注册功能可能是Java。所以一个上百万的用户的项目,绝对耗上亿资金完成的。如果出毛病了,就让那个负责这个模块的人去处理。
SpringCloud
那SpringCloud和微服务有什么关系?Spring Cloud 可以理解为微服务这种思想在 Java 领域的一个具体落地。Spring Cloud 在发展之初,就 借鉴了微服务的思想,同时结合 Spring Boot,Spring Cloud 提供了组件的一键式启动和部署的能力, 极大的简化了微服务架构的落地。
这也是Java为什么是老大的原因。
学任何东西都先访问官方文档,我们先访问SpringCloud官方文档:https://spring.io/projects/spring-cloud/
Spring Cloud为开发人员提供了工具,以快速构建分布式系统中的一些常见模式(例如,配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁,领导选举,分布式会话,群集状态)。分布式系统的协调导致样板式样,并且使用Spring Cloud开发人员可以快速站起来实现这些样板的服务和应用程序。它们可以在任何分布式环境中正常工作,包括开发人员自己的笔记本电脑,裸机数据中心以及Cloud Foundry等托管平台。
SpringCloud版本
不同于其他的框架,Spring Cloud 版本名称是通过 A(Angel)、B(Brixton)、C(Camden)、 D(Dalston)、E(Edgware)、F(Finchley)。这样来明明的,这些名字使用了伦敦地铁站的名 字,目前最新版是 H (Hoxton)版。
<figcaption style="margin-top: 5px; text-align: center; color: #888; font-size: 14px;">官方图为证</figcaption>
Spring Cloud 中,除了大的版本之外,还有一些小版本,小版本命名方式如下: M ,M 版是 milestone 的缩写,所以我们会看到一些版本叫 M1、M2 RC,RC 是 Release Candidate,表示该项目处于候选状态,这是正式发版之前的一个状态,所以 我们会看到 RC1、RC2 SR,SR 是 Service Release ,表示项目正式发布的稳定版,其实相当于 GA(Generally Available) 版。所以,我们会看到 SR1、SR2 SNAPSHOT,这个表示快照版
Spring Cloud体系
下面总结下重点的(来源:江南一点雨 松哥)
Spring Cloud Netflix,这个组件,在 Spring Cloud 成立之初,立下了汗马功劳。但是, 2018 年 的断更,也是 Netflix 掉链子了。
Spring Cloud Config,分布式配置中心,利用 Git/Svn 来集中管理项目的配置文件
Spring Cloud Bus,消息总线,可以构建消息驱动的微服务,也可以用来做一些状态管理等
Spring Cloud Consul,服务注册发现
Spring Cloud Stream,基于 Redis、RabbitMQ、Kafka 实现的消息微服务
Spring Cloud OpenFeign,提供 OpenFeign 集成到 Spring Boot 应用中的方式,主要解决微服务 之间的调用问题 - Spring Cloud Gateway,Spring Cloud 官方推出的网关服务
Spring Cloud Cloudfoundry,利用 Cloudfoundry 集成我们的应用程序
Spring Cloud Security,在 Zuul 代理中,为 OAuth2 客户端认证提供支持 Spring Cloud AWS ,快速集成亚马逊云服务
Spring Cloud Contract,一个消费者驱动的、面向 Java 的契约框架
Spring Cloud Zookeeper,基于 Apache Zookeeper 的服务注册和发现
Spring Cloud Data Flow,在一个结构化的平台上,组成数据微服务
Spring Cloud Kubernetes,Spring Cloud 提供的针对 Kubernetes 的支持 Spring Cloud Function Spring Cloud Task,短生命周期的微服务
Spring Cloud和 Spring Boot 版本关系
初学spring cloud的朋友可能不知道,其实SpringBoot与SpringCloud需要版本对应,否则可能会造成很多意料之外的错误。所以,你需要把SpringBoot看一看学一学。
spring-cloud-dependencies 版本列表可查看: https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-dependencies spring-boot-starter-parent 版本列表可查看: https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-parent
下面总结Spring Cloud和 Spring Boot 版本关系(来源:江南一点雨 松哥)