SpringCloud 是微服务一站式服务解决方案,微服务全家桶。它是微服务开发的主流技术栈。它采用了名称,而非数字版本号。
SpringCloud 和 SpringCloud Alibaba 目前是最主流的微服务框架组合。本笔记根据 B 站尚硅谷教程整理而成!
教程:https://www.bilibili.com/video/BV18E411x7eT
系统架构的演变
概述
- 随着互联网的发展,网站应用的规模不断扩大,常规的应用架构已无法应对,分布式服务架构以及微服务架构势在必行,亟需一个治理系统确保架构有条不紊的演进。
单体应用架构
- web 应用程序发展的早期,大部分 web 工程(包含前端页面,web 层代码,service 层代码,dao 层代码)是将所有的功能模块,打包到一起并放在一个 web 容器中运行。
比如搭建一个电商系统:客户下订单,商品展示,用户管理。这种将所有功能度部署在一个 web 容器中运行的系统就叫做单体架构,目前也有人称为单体地狱。
优点:
- 所有的功能集成在一个项目工程中。
- 项目架构简单,前期开发成本低,周期短,小型项目的首选。
缺点:
- 全部功能集成在一个工程中,对于大型项目不易开发、扩展和维护。
- 系统性能只能通过扩展集群结点,成本高,有瓶颈。
- 技术栈受限。
- 代码耦合度很高。
- 容错性差,比如用户管理出问题了,整个系统全部出问题,牵一发而动全身。
垂直应用架构
- 当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互补相干的几个应用,以提高效率。
优点:
- 项目架构简单,前期开发成本低,周期 daunt,小型项目的首选。
- 通过垂直拆分,原来的单体项目不至于无线扩大。
- 不同的项目可采用不同的技术。
- 针对不同的子工程优化。
- 解决高并发问题。
- 方便水平扩展,容错性好(相对于单体架构来说的,比如上图中的商品管理出问题了,对 CMS 系统和后台管理系统来说没影响)。
缺点:
- 全部功能集成在一个工程中,对于大型项目不易开发、扩展和维护。
- 系统性能扩展只能通过扩展集群结点,成本高,有瓶颈。
- 系统间相互独立,会产生 session 共享问题(可以使用 Redis Cluster、SpringSession 等技术解决)。
- 重复的开发工作(比如上图中的用户管理功能在电商系统和后台管理系统中都有)。
分布式 SOA 架构
什么是 SOA?
SOA,全称是 Service-Oriented Architecture,即面向服务的架构。它可以根据需要通过网络对松散耦合的粗粒度应用组件(服务)进行分布式部署、组合和使用。一个服务通常以独立的形式存在于操作系统进程中。
站在功能的角度,把业务逻辑抽象成可复用、可组装的服务,通过服务的编排实现业务的快速再生,目的是把原先固有的业务功能转变为通用的业务服务,实现业务逻辑的快速复用。
通过上面的描述可以发现 SOA 有如下的特点:分布式、可重用、扩展灵活、松耦合。
SOA 架构
- 当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使得前端应用能够更快速的响应多变的市场需求。
优点:
- 抽取公共的功能为服务,提高开发效率。
- 对不同的服务进行集群化部署解决系统压力。
- 基于 ESB 或 Dubbo 减少系统耦合。
缺点:
- 抽取服务的粒度较大。
- 服务提供方和调用方接口耦合度较高。
微服务架构
优点:
- 通过服务的原子化拆分,以及微服务的独立打包、部署和升级,小团队的交付周期将会缩短,运维成本也将大幅度下降。
- 微服务遵循单一原则。微服务之间采用 RESTful 等轻量级协议传输。
缺点:
- 微服务过多,服务治理成本高,不利于系统维护。
- 分布式系统开发的技术成本高(容错、分布式事务等)。
SOA 和微服务的关系
SOA:面向服务的架构,是一种设计方法,其中包含多个服务,服务和服务之间通过相互依赖最终提供一系列的功能。一个服务通常以独立的形式存在于操作系统的进程之中。各个服务之间通过网络调用。
微服务架构:其实和 SOA 架构类似,微服务是 SOA 架构上的升华,微服务架构强调的一个重点是”业务需要彻底的组件化和服务化”,原有的单个业务系统会拆分为多个可以独立开发、设计、运行的小应用。这些小应用之间通过服务完成交互和集成。
功能 | SOA | 微服务 |
---|---|---|
组件大小 | 大块业务逻辑 | 单独任务或小块业务逻辑 |
耦合 | 通常松耦合 | 总是松耦合 |
公司架构 | 任何类型 | 小型,专注于功能交叉团队 |
管理 | 着重中央管理 | 着重分散管理 |
目标 | 确保应用能够交互操作 | 执行新功能、快速拓展开发团队 |
分布式核心知识
分布式的远程调用
RESTful。
RPC。
分布式中的 CAP 原理
现如今,对于大多数大型互联网应用,分布式系统正变得越来越重要。分布式系统最大的难点,就是各个节点的状态如何同步。CAP 定理是这方面的基本定理,也是理解分布式系统的起点。
CAP 理论有 Eirc Brewer 在 ACM 研讨会上提出的,而后 CAP 被奉为分布式领域的重要理论。分布式系统的 CAP 理论,首先把分布式系统中的三个特性进行了如下的归纳。
C(Consistency,一致性):数据一致更新,所有数据的变化都是同步的。
A(Availability,可用性):在集群中一部分节点故障后,集群整体是否还能有影响客户端的读写请求。
P(Partition tolerance,分区容错性):某个节点的故障,并不影响整个系统的运行。
一个分布式系统里面,节点组成的网络本来应该是连通的。然而可能因为一些故障,使得有些节点之间不连通了,整个网络就分成了几块区域。数据就散布在了这些不连通的区域中。这就叫分区。
当你一个数据项只在一个节点中保存,那么分区出现后,和这个节点不连通的部分就访问不到这个数据了。这时分区就是无法容忍的。
提高分区容忍性的办法就是一个数据项复制到多个节点上,那么出现分区之后,这一数据项就可能分布到各个区里。容忍性就提高了。
然而,要把数据复制到多个节点,就会带来一致性的问题,就是多个节点上面的数据可能是不一致的。要保证一致,每次写操作就都要等待全部节点写成功,而这等待又会带来可用性的问题。
总的来说就是,数据存在的节点越多,分区容忍性越高,但要复制更新的数据就越多,一致性就越难保证。为了保证一致性,更新所有节点数据所需要的时间就越长,可用性就会降低。
作者:邬江
链接:https://www.zhihu.com/question/54105974/answer/139037688
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
选择 | 说明 |
---|---|
CA | 放弃分区容错性,加强一致性和可用性,其实就是传统的关系型数据库的选择 |
AP | 放弃一致性(强一致性),追求分区容错性和可用性,这时很多分布式系统设计时的选择,比如很多 NoSQL 数据库就是如此 |
CP | 放弃可用性,追求一致性和分区容错性,基本不会选择,网络问题会直接让整个系统不可用,比如 zookeeper 就是 CP |
- 需要明确一点的是,在一个分布式系统当中,分区容错性和可用性是最基本的需求,所以在分布式系统中,我们的系统最应该关注的是 AP,通过补偿机制寻求数据的一致性。
常见微服务框架
SpringCloud
SpringCloud是一系列框架的有序集合
。它利用 SpringBoot 的开发便利性巧妙的简化了分布式系统基础设施的开发,如服务发现注册
、配置中心
、消息中线
、负载均衡
、熔断器
、数据监控
等,都可以用 SpringBoot 的开发风格做到一键启动和部署。SpringCloud 并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考研的服务框架组合起来,通过 SpringBoot 风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
Apache 的 ServiceComb
- Apache ServiceCombo 是业界第一个 Apache 微服务顶级项目,是一个开源微服务解决方案,致力于帮助企业、用户和开发者将企业应用轻松微服务化上云,并实现对微服务应用的高效运维管理。其提供一站式开源微服务解决方案,融合 SDK 框架级、零入侵 ServerMesh 场景并支持多种语言。
ZeroC ICE
- Zeroc ICE 是 Zeroc 公司的杰作,继承了 CORBA 的血统,是新一代的面向对象的分布式系统中间件。作为一种微服务架构,它基于 RPC 框架发展而来,具有良好的性能和分布式能力。
微服务中的相关概念
服务注册和发现
服务注册:服务实例将自身服务信息注册到注册中心。这部分服务信息包括服务所在主机 IP 和提供服务的 Port,以及暴露服务自身状态以及访问协议等信息。
服务发现:服务实例请求注册中心获取所依赖服务信息。服务实例通过注册中心,获取到注册到其中的服务实例的信息,通过这些信息去其你去它们提供的服务。
负载均衡
- 负载均衡是高可用网络基础架构的关键组件,通常用于将工作负载到多个服务器来提高网站、应用、数据库或其他服务的性能和可靠性。
熔断
- 熔断这一概念来源于电子工程中的断路器。在互联网系统中,当下游服务因为访问压力过大而响应变慢或失败,上游服务为了保护系统整体的可用性,可以暂时切断对下游服务的调用。这种牺牲局部,保全整体的措施就叫熔断。
链路追踪
- 随着微服务架构的流行,服务按照不同的纬度进行拆分,一次请求往往需求涉及到多个服务。互联网应用构建在不同的软件模块上,这些软件模块,有可能是由不同的团队开发,可能使用不同的编程语言来实现、有可能部署在几千台服务器上,横跨多个不同的数据中心。因此,就需要对一次请求涉及的多个服务链路进行日志记录,性能监控即链路追踪。
API 网关
随着微服务的不断增多,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接和各个微服务通信可能出现:
客户端需要调用不同的 URL 地址,增加难度。
在一定的场景下,存在跨域请求的问题。
每个微服务都需要进行单独的身份认证。
针对上面的问题,API 网关顺势而生。
API 网关直面意思是将所有 API 调用统一接入到 API 网关层,由网关层统一接入和输出。一个网关的基本功能有:统一接入、安全防护、协议适配、流量监管、长短链接支持、容错能力。有了网关之后,各个 API 服务提供团队可以专注于自己的业务逻辑处理,而 API 网关更专注于安全、流量和路由等问题。
SpringCloud
SpringCloud 概述
Spring Cloud是一系列框架的有序集合
。它利用 Spring Boot 的开发便利性巧妙地简化了分布式系统基
础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用
Spring Boot 的开发风格做到一键启动和部署。Spring Cloud 并没有重复制造轮子,它只是将目前各家
公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过 Spring Boot 风格进行再封装屏蔽掉
了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具
包 。
SpringCloud 的架构
参考资料,尽量去官网
SpringCloud 官网:https://spring.io/projects/spring-cloud#learn
SpringCloud 官方文档:https://cloud.spring.io/spring-cloud-static/Hoxton.SR1/reference/htmlsingle/
SpringBoot 官网:https://spring.io/projects/spring-boot#learn
SpringBoot 官方文档:https://docs.spring.io/spring-boot/docs/2.2.2.RELEASE/reference/htmlsingle/
Spring Cloud 中文文档:https://www.bookstack.cn/read/spring-cloud-docs/docs-index.md
SpringCloud 中的核心组件
Spring Cloud 的本质是在 Spring Boot 的基础上,增加了一堆微服务相关的规范,并对应用上下文
(Application Context)进行了功能增强。既然 Spring Cloud 是规范,那么就需要去实现,目前
Spring Cloud 规范已有 Spring 官方,Spring Cloud Netflix,Spring Cloud Alibaba 等实现。通过组件
化的方式,Spring Cloud 将这些实现整合到一起构成全家桶式的微服务技术栈。Spring Cloud Netflix 组件 :
组件名称 | 作用 |
---|---|
Eureka | 服务注册中心 |
Ribbon | 客户端负载均衡 |
Feign | 声明式服务调用 |
Hystrix | 客户端容错保护 |
Zuul | API 服务网关 |
- Spring Cloud Alibaba 组件 :
组件名称 | 作用 |
---|---|
Nacos | 服务注册中心 |
Sentinel | 客户端容错保护 |
- Spring Cloud 原生及其他组件 :
组件 | 作用 |
---|---|
Consul | 服务注册中心 |
Config | 分布式配置中心 |
Gateway | API 服务网关 |
Sleuth/Zipkin | 分布式链路追踪 |
SpringCloud 的体系结构
从上图可以看出 Spring Cloud 各个组件相互配合,合作支持了一套完整的微服务架构。
注册中心
负责服务的注册与发现,很好将各服务连接起来。断路器
负责监控服务之间的调用情况,连续多次失败进行熔断保护。API网关
负责转发所有对外的请求和服务。配置中心
提供了统一的配置信息管理服务,可以实时的通知各个服务获取最新的配置信息 。
SpringCloud 和 SpringBoot 的对应版本
版本选择:
- 可以通过浏览器查看版本对应关系:https://start.spring.io/actuator/info
- json 信息可以通过工具格式化:https://tool.lu/
- springboot github 源码地址:https://github.com/spring-projects/spring-boot/releases
- springboot 官网查看版本:https://spring.io/projects/spring-boot#learn
- springcloud 官网查看版本:https://spring.io/projects/spring-cloud#learn
查看官网:https://spring.io/projects/spring-cloud#overview,拖到下面查看官方给出的版本对应关系。
例如以如下版本对应为例:
模拟微服务
工程步骤:
- 1、New Project
- 2、聚合总父工程名字
- 3、Maven 选版本
- 4、工程名字
- 5、字符编码
- 6、注解生效激活
- 7、java 编译版本选 8
开始构建
构建父工程 spring_cloud_atguigu_2020
,后面的项目模块都在此工程中:
设置编码:Settings -> Editor-> File Encodings
注解激活:
选择 java 编译版本:
文件过滤,可以不设置
(这样就显示不出来这些文件了,有的文件看着有点烦):
父工程 pom 配置
删掉 src 目录,只留 pom 文件
1 |
|
上面配置的解释:
首先要加
1 | <packaging>pom</packaging> |
聚合版本依赖,dependencyManagement
只声明依赖
,并不实现引入
,所以子项目还需要写要引入的依赖。
第一个微服务架构
步骤:
- 建模块 module
- 改 pom
- 写 yml
- 主启动
- 业务类
提供者
在父工程中新建子模块,还是使用上面的方式创建 maven 模板项目,不使用 springboot 快速创建:cloud-provider-payment8001
建子模块后父工程变化
查看父工程 pom 文件变化,多了 modules
标签
1 | <modules> |
pom 文件
1 |
|
配置文件
在 resources 目录下新建 application.yml
1 | # 端口号 |
主启动类
1 | package com.itjing.springcloud; |
业务类
五步:
- 建表 sql
- entities
- dao
- service
- controller
建库建表
创建数据库:springcloud2020,建表:payment
1 | CREATE TABLE `payment` ( |
实体类
1 | package com.itjing.springcloud.entities; |
Json 封装体
真正做开发的时候,可以自定义枚举类处理,具体去查询百度学习。
1 | package com.itjing.springcloud.entities; |
Dao 接口
1 | package com.itjing.springcloud.dao; |
Mapper 映射文件
1 |
|
Service 接口及其实现类
1 | package com.itjing.springcloud.service; |
1 | package com.itjing.springcloud.service.impl; |
Controller 控制器
1 | package com.itjing.springcloud.controller; |
测试
使用 postman
工具进行测试,自测通过!
SpringBoot 热部署的流程
pom 文件中导入 spring-boot-devtools
依赖:
(或者创建 springboot 工程时,勾选 devtools 选项,会自动在 pom 中加入依赖)
1 | <!--SpringBoot热部署配置 --> |
继续在父工程的 pom.xml 中添加插件:
1 | <build> |
设置 application.properties
1 | #配置项目热部署 |
在 idea 中设置自动编译
1.打开 Settings,设置当前项目自动编译,搜索 Compiler,勾选 Build project automatically
2.打开 Other Settings ,设置新建的项目都自动编译,搜索 Compliler,勾选 Build project automatically
3.按住 ctrl + shift + alt + /,出现如下图所示界面,点击 Registry…
4.点击进入后,勾选 compiler.automake.allow.when.app.running 后关闭即可
重启 IDEA!
通过以上步骤,就完成了SpringBoot项目的热部署功能!!!
消费者
步骤参考提供者。
创建子模块:cloud-consumer-order80
消费者现在只模拟调用提供者的 Controller 方法,没有持久层配置,只有 Controller 和实体类
当然也要配置主启动类和启动端口
pom 文件
1 |
|
配置文件
1 | server: |
主启动类
1 | package com.itjing.springcloud; |
业务类
实体类
将 提供者 中的 CommonResult 和 Payment 拷贝过来,创建
服务调用概述
- 在用户下单的时候需要调用商品微服务获取商品数据,那么应该需要怎么做呢?商品微服务提供了供人调用的 HTTP 接口,所以下订单的时候使用 HTTP 请求的相关工具类完成,如常见的 HttpClient、OkHttp,当然也可以使用 Spring 提供的
RestTemplate
。
RestTemplate 介绍
Spring 框架提供的 RestTemplate 类可用于在应用中调用 RESTful 服务,它简化了和 HTTP 服务的通信方式,统一了 RESTful 的标准,封装了 HTTP 的链接,我们只需要传入 URL 和返回值类型即可。相较于之前常用的 HttpClient、OkHttp 等,RestTemplate 是一种更加优雅的调用 RESTful 服务的方式。
在 Spring 应用程序中访问第三方 REST 服务和 Spring 的 RestTemplate 类有关。RestTemplate 类的设计原则和许多其他 Spring 模块类(例如 JdbcTemplate、JmsTemplate)相同,为执行复杂任务提供了一种具有默认行为的简化方法。
RestTemplate 默认依赖 JDK 提供 HTTP 连接的能力(HttpURLConnection),如果有需要的话也可以通过 setRequestFactory 方法替换为如 Apache HttpComponents、Netty 或 OkHttp 等其他 HTTP 库。
考虑到 RestTemplate 类是为调用 REST 服务而设计的,因此他的主要方法和 REST 的基础紧密相连就不足为奇,后者是 HTTP 协议的方法:HEAD、GET、POST、PUT、DELETE 和 OPTIONS。例如,RestTemplate 类具有 headForHeaders()、getForObject()等方法。
向 Spring 容器中注册 RestTemplate
1 | package com.itjing.springcloud.config; |
Controller 控制器
1 | package com.itjing.springcloud.controller; |
测试
启动 服务提供者:cloud-provider-payment8001
启动服务消费者:cloud-consumer-order80
这时候右下角会弹出 Run Dashboard 提示,我们应该让它显示出来,以后微服务多了,我们需要它管理。
访问消费者的接口进行测试!
一开始发现执行添加操作
的时候,数据库中的数据为 null
,是因为之前的 服务中 我忘了加 @RequestBody
注解,现在加上了
1 | // 注意这里的 @RequestBody 是必须要写的,虽然 MVC可以自动封装参数成为对象, |
工程重构
上面的两个子模块,有多次重复的导入jar
,和重复的 Entity 实体类
。
可以把多余的部分,加入到一个独立的模块中,将这个模块打包,并提供给需要使用的 module 。
1、新建一个 cloud-api-commons 子模块
2、将 entities 包里面的实体类复制到这个子模块中,将所需依赖引入 pom 文件中。如下:
1 |
|
3、将此项目打包 install 到 maven 仓库
先 clean,再 install
4、改造提供者和消费者,将 提供者 和 消费者 两个项目中的 entities 包删除。
5、将 打包到 maven 仓库的 cloud-api-commons 模块,引入到 提供者 和 消费者的 pom 文件中,如下所示
1 | <!-- 引入自己定义的api通用包--> |
分析模拟微服务中存在的问题
服务调用者将微服务的请求路径硬编码到 Java 代码中。
不能对微服务负载均衡的调用,因为请求路径的 URL 硬编码了。
服务多起来,对前端调用不友好,需要加入 API 网关。
微服务多起来的话,如果每次都需要重新修改配置文件,很麻烦,需要配置的统一管理。
链路追踪。
系统容错。
……
发布时间: 2021-01-14
最后更新: 2024-06-24
本文标题: SpringCloud Alibaba入门到精通(一)- 核心知识以及模拟微服务环境
本文链接: https://blog-yilia.xiaojingge.com/posts/13c28b88.html
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可。转载请注明出处!
