1.Spring Cloud 构建微服务应用程序之概览
1.Spring Cloud 构建微服务应用程序之概览
- 1.1 微服务发展史
- 1.2 为什么要学习微服务应用开发?
- 1.3 微服务和分布式之间的关系
- 1.4 微服务架构下构建分布式系统带来了哪些问题?
- 1.4.1 服务治理
- 1.4.1.1 服务注册
- 1.4.1.2 服务发现
- 1.4.1.3 服务注销
- 1.4.1.4 服务状态监控
- 1.4.1.5 负载均衡
- 1.4.2 微服务监控
- 1.4.3 服务网关
- 1.4.4 统一配置
- 1.4.5 微服务的容错
- 1.4.5.1 什么是雪崩?
- 1.4.5.2 什么是服务熔断?
- 1.4.6 微服务安全
- 1.4.7 微服务通信
- 1.4.8 微服务部署和编排
- 1.5 微服务问题行业解决方案
- 1.5.1 Spring Cloud 简介
- 1.5.2 Spring Cloud 子项目
- 2.参考资料
时隔多日,终于决定要开始写Spring Cloud 系列了,欢迎各位道友点赞关注评论和转发。
在开始学习Spring Cloud 之前,我们先来了解下微服务的发展历史。
1.1 微服务发展史
- 微服务定义
2014年3月,Martin Fowler
在其博客上发表了Microservices(微服务一文,)对过去几年逐渐开始流行的微服务架构开发模式给出了正式的定义。- Netflix 公司将微服务基础组件开源
同年,Netflix将自己多年来在实际开发中所使用的微服务基础组件通过Netflix OSS(Open Source Software)
进行开源.- Spring 官方团队
Pivotal
对Netflix 公司开源的微服务组件进行封装简化,推出Spring Cloud
.
随后,Pivotal
在Netflix OSS
在NetFlix OSS
的基础上对这些组件进行了封装和集成,推出了Spring Cloud.
上面我们已经知道,Spring cloud 其实是对开源的微服务基础组件进行了封装,简化了微服务应用的开发.
因此,如果我们学会了Spring Cloud,就可以帮助我们快速地开发微服务应用。
1.2 为什么要学习微服务应用开发?
等等,为什么要学习微服务应用开发呢?
在Java开发中,一个典型的单体架构应用就是将一个应用中所有的功能都打包在一个war中,并部署在应用服务器(如Tomcat)中运行。
- 简单来说,微服务的出现,解决了单体架构的痛点,易于扩展和独立部署。
- 但是 微服务和分布式技术不是银弹,不是所有的单体应用程序都适合改造成微服务应用的。
- 选择微服务通常意味着需要解决分布式架构的各种难题。
- 更多请参考我在云栖社区写的另外一篇博文 为什么会出现微服务和分布式?
博主语:
- 个人感觉,微服务和分布式技术一般适用于需要灵活扩容,比较复杂,庞大且可以拆分的系统。
1.3 微服务和分布式之间的关系
我们在学习的过程中,可能有时候我们听到说微服务,有时候又听到说分布式。
那么微服务和分布式之间是什么关系呢?
术语 | 解释 | 作用 |
---|---|---|
分布式 | 一个业务分拆多个子业务,部署在不同的服务器上,分布式是指将不同的业务分布在不同的地方 | 分布式解决网站高并发带来问题 |
集群 | 同一个业务,部署在多个服务器上。集群指的是将几台服务器集中在一起,实现同一业务 | 通过负载均衡设备共同对外提供服务 |
SOA | 业务系统分解为多个组件,让每个组件都独立提供离散,自治,可复用的服务能力;通过服务的组合和编排来实现上层的业务流程 | 简化维护,降低整体风险,伸缩灵活 |
微服务 | 各服务间隔离(分布式也是隔离),自治(分布式依赖整体组合)其它特性(单一职责,边界,异步通信,独立部署)是分布式概念的跟严格执行 | 各服务可独立应用,组合服务也可系统应用(巨石应用[monolith]的简化实现策略-平台思想) |
我的理解:
- 微服务和分布式是从不同层面和方向上来分的。
- 微服务是架构设计方式,是将系统按照功能模块进行拆分成单个独立的应用程序。
- 分布式是指不同模块部署在不同服务器上,部署方式是分散部署的,微服务可能部署在不同的服务器上。
Spring Boot/Cloud
是目前较为流行的微服务框架- 微服务架构下,部署和运维都面临着新的挑战,选择微服务通常意味着需要解决分布式架构的各种难题。
1.4 微服务架构下构建分布式系统带来了哪些问题?
当一个单体应用程序被拆分成微服务之后,将会面临着很多新的问题。
下图是微服务架构的核心关键点:
接下来我们详细讲解下这张图。
1.4.1 服务治理
- 问题一:各个微服务之间如何调用?
- 当单体应用程序拆分成微服务之后,首先面临的第一个问题就是,作为消费者如何访问并调用服务提供者所提供的服务,作为服务提供者如何能让服务消费者知道并进行消费?
- 在传统的单体应用程序开发中,只需要通过某种方式创建相关类的实例,就可以调它的方法了,因此并不存在这个问题。
- 但是在微服务架构下,同一个微服务可能同时存在多个实例,也可能部署在不同的机器上,并且这些微服务实例还在不断上线下线,那么它们如何相知相识并进行通信呢?使用物理地址显然不行,因为不知道服务提供者到底在哪一台服务器,服务当前是否在线,如果服务不在线还进行调用岂不是会造成调用失败?
- 问题二:快速水平扩展
- 对于微服务架构应用来说还有一个重要因素,快速水平扩展。在进行快速扩展时,我们不可能预先知道所有的服务实例地址并告知服务消费者,而且也无法确定有哪些,有多少消费者回来消费。
解决方案
- 业界对于此问题的解决方案就是服务治理,
- 服务治理领域最重要的问题就是服务发现与注册
1.4.1.1 服务注册
服务注册机制,可以让服务提供者在上线时将所提供的服务信息注册到服务治理服务器中,供服务消费者使用。
1.4.1.2 服务发现
通过服务发现,消费者可以在预先不知道服务提供者物理地址的情况下,仅通过相应的服务名称就可以实现服务调用。
1.4.1.3 服务注销
当服务下线时将自己从服务治理服务器中注销,避免服务消费者调用而造成的异常。
1.4.1.4 服务状态监控
服务的状态比如注册和注销,需要对其进行监控,便于更新服务治理服务器数据。
1.4.1.5 负载均衡
存在的问题:
- 用户入口进行负载均衡?
Nginx
- 对于负载均衡,传统应用通常会在用户请求的入口通过负载均衡设备(如F5等)或通过Ngnix 反向代理方式实现负载均衡。
- 浏览器的请求一般包括html/css/js和API请求数据库数据,访问量小还好说,但是一旦访问量大了,服务端就会感到压力很大,为了减轻负载的压力,人们思考,将html/css/js 的请求和API的请求进行分离,设计了一个叫做Nginx 的服务器来专门处理html/css/js 的请求。
常用的软件负载均衡软件有Nginx
、LVS
、HaProxy
等。- LVS(Linux Virtual Server),也就是Linux虚拟服务器
- Nginx
- HaProxy
- 微服务之间调用负载均衡--
Open Feign
- 在微服务架构下的负载均衡不止是用户请求入口,还包含了微服务之间的调用。如果还是用传统的解决方案显然是不合适的。
- 一方面因为传统的负载均衡设备配置非常复杂,
- 另一方面是微服务应用实例在快速变化。
- 怎么办?
- 业界提出了客户端负载均衡的概念,也称之为软负载均衡。核心思想及时在服务消费者(也就是客户端)保存一份服务者列表,这份服务者列表通常是从服务治理服务器中动态获取,也可以采用固定配置的方式,然后通过某种负载均衡策略来决定每次服务调用时所使用的的具体服务实例,从而实现微服务之间的负载均衡。
1.4.2 微服务监控
- 存在的问题:微服务架构下调试变得困难!!!
- 单体架构下由于是单个应用程序,当我们需要调试程序和跟踪分析的时候,十分方便,我们只需要通过日志或Debug 模式等方式寻找系统中存在的问题即可。
- 但是当放到微服务架构下,虽然微服务让系统变得更加灵活和强大,易于快速水平扩展,但是却也增加了系统调试和跟踪分析的难度。我们需要将分散在不同机器上的日志全部拿到一起看,形成一个完整的请求调用链,这是一个非常大的挑战。
- 怎么办???
- 针对这个问题,业界在微服务监控中提供了日志聚合,日志可视化分析,调用链追踪等解决方案,都可以为我们的微服务应用的运维提供强有力的武器。
1.4.3 服务网关
微服务是众多的,大部分都需要对外提供接口,但是我们往往一般不会直接与多个服务地址打交道,而需要通过门户模式,为微服务提供一个统一的入口,并附加一些路由规则,然后就可以不同的微服务通过路由规则提供一致的访问接口。
1.4.4 统一配置
在单体应用程序中,我们可以直接在所开发项目中进行配置管理,而在微服务架构中,一个应用拆分成多个微服务,并且由多个团队负责,而这些微服务会存在一些共同的配置数据,如果还是分散在各个项目中进行管理,那么面对数十个,上百个应用实例,修改配置将会变得非常麻烦。
1.4.5 微服务的容错
我们知道,一个用户的请求,往往会涉及到很多微服务,而微服务与微服务之间,极有可能是部署在不同的几台服务器中,也就是说微服务与微服务之间的相互调用,大多是通过网络来完成,但是网络是不可靠的,当微服务与微服务之间调用,如果其中被调用方服务器宕机了,那么调用失败就可能会引发一系列问题。
接下来我们先来看第一个问题,雪崩。
1.4.5.1 什么是雪崩?
那么什么是雪崩呢?我们来看个例子。
假设当前系统中有A,B,C三个服务,服务A是上游,服务B是中游,服务C是下游。它们的调用链如下
一旦下游服务C因某些原因变得不可用,积压了大量请求,服务B的请求线程也随之阻塞。线程资源逐渐耗尽,使得服务B也变得不可用。紧接着,服务A也变为不可用,整个调用链路被拖垮。
像这种调用链路的连锁故障,叫做雪崩。1.4.5.2 什么是服务熔断?
了解更多,可参考程序员小灰前辈的公众号博文:漫画:什么是服务熔断?
1.4.6 微服务安全
- 我们知道一个单体应用程序一旦拆分成多个应用程序,我们不可能为每一个微服务都写一套权限验证逻辑,而且有些微服务比如短信发送微服务必须保护起来不可以裸奔。
- 为了解决此类问题,业界提出了如下解决方案:
- 基于Spring Security 实现微服务安全以及单点登录
- OAuth 认证
- JWT授权
1.4.7 微服务通信
在分布式系统中,微服务A和微服务B 应用程序可能位于不同的服务器上,微服务A和微服务B发送一个消息,肯定和在同一台服务器上发送消息方式不同。
微服务与微服务之间通信大致可以分为如下几种方式:
- RPC (Remote Procedure Call): 远程过程调用
- Restful API
- 消息中间件,IBM MQ, RabiitMQ,Kafka 等
1.4.8 微服务部署和编排
- 在微服务架构下,十几个甚至上百个微服务应用实例,可能需要不断上线和下线,我们肯定不愿意手动构建和部署这些实例,因此我们需要自动化工具来帮我们提升工作效率,而且还要保证部署的各个同类型实例之间保持一致或相同的配置。
- 业界对此,提出了使用Docker来实现快速部署,通过K8S 来帮忙实现自动化部署编排等。
1.5 微服务问题行业解决方案
目前来讲主要服务治理核心框架的选型有三个:
spring-cloud
,dubbo
以及service mesh
。
1.5.1 Spring Cloud 简介
- Spring Cloud它是一个基于Spring的框架,简化了微服务应用的开发。
- Spring Cloud 是为快速构建分布式系统而生,提供了一系列工具帮助开发人员快速构建分布式系统。
- Spring Cloud 为开发微服务应用每个组件提供了多个方面的选择和支持,这意味着我们不仅可以灵活选择使用Netflix的服务注册和服务发现组件Eureka,断路器组件Hystrix,智能路由组件Zuul,客户端负载均衡组件Ribbon。我们也可以使用阿里巴巴推出的Spring Cloud Alibaba 等其他一些组件进行开发。
Spring Cloud 包含了 Spring Cloud Common
,和Spring Cloud Context
.
其中,
Spring Cloud Common
为微服务应用开发提供了很好的抽象,Spring Cloud Context
为微服务应用开发提供了上下文支持。
1.5.2 Spring Cloud 子项目
- 除此之外,Spring Cloud 旗下有很多子项目,共同构成了微服务开发组件。
Spring Cloud 子项目概览表
Spring Cloud 子项目 | 简介 |
---|---|
Spring Cloud Eureka | 提供服务治理,比如服务注册和服务发现等功能。 |
Spring Cloud Hystrix | 实现服务降级功能 |
Spring Cloud Zuul | 实现API 服务网关 |
Spring Cloud Config | 统一配置,配置文件加载和管理 |
Spring Cloud Sleuth | 服务链路追踪解决方案。 |
Spring Cloud Stream | 提供消息中间件抽象层 |
Spring Cloud Security | API 权限拦截 |
Spring Cloud OAuth 2.0 | 授权认证 |
Spring Cloud 为了简化微服务架构下分布式应用程序的开发,提供了如下工具。
微服务架构下分布式应用程序开发存在的问题 | Spring Cloud 简化开发解决方案 |
---|---|
服务治理 |
如果采用 Spring Cloud 体系,则选择Netflix 公司的Eureka 是最佳搭配。如果使用的是Dubbo 则选Zookeeper 作为注册中心, 客户端负载均衡可选Ribbon 或Open Feign 可选服务治理解决框架:Netflix Eureka、Consul、Zookeeper
|
微服务监控 |
Sleuth 链路追踪,Zipkin Client
|
服务网关 | 如果采用 Spring Cloud 体系,则选择 Zuul 作为微服务网关是最佳搭配 |
统一配置 |
在分布式部署下,各个微服务可能处于不同服务器,配置更改需要通过git 提交到配置中心实现分布式/版本化 配置,Spring Cloud Config
|
微服务的容错 | 微服务容错/降级使用Spring Cloud Netflix |
微服务安全 | Spring Cloud Security提供了认证和鉴权以及Oauth2.0 单点登录支持 JWT |
微服务通信 | Spring Cloud Stream 简化RabbitMQ 和Kafka 等消息中间件的整合,Spring Cloud Bus 基于Stream扩展,可以作为微服务之间的事件,消息总线。 |
微服务部署和编排 | Docker,K8S |
2.参考资料
- Spring Cloud官网
- 《Spring Cloud微服务架构开发实战》董超 胡炽维 (书籍源码)
- 分布式服务架构与微服务架构概念的区别与联系是怎样的?
- 程序员小灰前辈的公众号博文:漫画:什么是服务熔断?
- 分布式、集群、微服务、SOA 之间的区别
- Microservices
- 微服务架构技术栈选型手册
- 《微服务架构设计模式》
1.Spring Cloud 构建微服务应用程序之概览相关推荐
- Spring Cloud构建微服务
2019独角兽企业重金招聘Python工程师标准>>> Spring Cloud构建微服务 博客分类: 微服务 spring boot 架构 首先了解下项目结构 请忽略config- ...
- Spring Cloud构建微服务架构:分布式配置中心【Dalston版】
Spring Cloud Config是Spring Cloud团队创建的一个全新项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,它分为服务端与客户端两个部分.其中服务端也称为 ...
- Spring Cloud构建微服务架构:消息驱动的微服务(核心概念)【Dalston版】
通过<Spring Cloud构建微服务架构:消息驱动的微服务(入门)>一文,相信大家对Spring Cloud Stream的工作模式已经有了一些基础概念,比如:输入.输出通道的绑定,通 ...
- Spring Cloud构建微服务架构:分布式服务跟踪(整合zipkin)【Dalston版】
通过上一篇<分布式服务跟踪(整合logstash)>,我们虽然已经能够利用ELK平台提供的收集.存储.搜索等强大功能,对跟踪信息的管理和使用已经变得非常便利.但是,在ELK平台中的数据分析 ...
- Spring Cloud构建微服务架构:分布式服务跟踪(整合logstash)【Dalston版】
通过之前的<入门示例>,我们已经为两个由SpringCloud构建的微服务项目 trace-1和 trace-2引入了Spring Cloud Sleuth的基础模块 spring-clo ...
- Spring Cloud构建微服务架构:分布式服务跟踪(跟踪原理)
通过上一篇<分布式服务跟踪(入门)>的例子,我们已经通过Spring Cloud Sleuth往微服务应用中添加了实现分布式跟踪具备的基本要素.下面通过本文来详细说说实现分布式服务跟踪的一 ...
- Spring Cloud构建微服务架构:服务容错保护(Hystrix断路器)
断路器 断路器模式源于Martin Fowler的Circuit Breaker一文."断路器"本身是一种开关装置,用于在电路上保护线路过载,当线路中有电器发生短路时," ...
- Spring Cloud构建微服务架构(七)消息总线(续:Kafka)
Spring Cloud Bus除了支持RabbitMQ的自动化配置之外,还支持现在被广泛应用的Kafka.在本文中,我们将搭建一个Kafka的本地环境,并通过它来尝试使用Spring Cloud B ...
- Spring Cloud构建微服务架构(五)服务网关
通过之前几篇Spring Cloud中几个核心组件的介绍,我们已经可以构建一个简略的(不够完善)微服务架构了.比如下图所示: alt 我们使用Spring Cloud Netflix中的Eureka实 ...
最新文章
- oracle数据库enq: TX - allocate ITL entry性能诊断
- 关于Android studio run 按钮灰色无法运行的总结
- html中怎么获取搜索框中的值,百度API 搜索框,获取相应的地点的uid
- react学习路线图,学习react就是有捷径
- 二、Java 面向对象高级——Collection、泛型
- 状态输出导航栏html,css3与html5实现响应式导航菜单(导航栏)效果分享
- centos7火狐浏览器上不了网_网络问题备忘:能ping通,就是上不了网
- 如何创建ChromeApp
- Android 数据库 在使用 update更新的时候,总是无法更新,还没有异常抛出!
- 收集了一些容易出错的题,可能大家也不会注意到的基础知识(js)
- 为什么要使用class.forname在DriverManager.getConnection之前
- liunx下安装tomcat7.0.82
- web与app开发java_移动web开发和移动app开发的区分
- 如何制作SDTM Define- 1. 指导原则
- PBFT(一):过程
- 力扣数据库(end09.02)
- 零界之痕服务器维护,《零界之痕》1月26日更新维护公告
- Windows 11 首次开机OOBE阶段跳过连接网络及登录微软账户,使用本地账号登录的方法
- 放大缩小不习惯?只需两步教你solid works如何设置反转滚轮缩放
- 使用Node.js创建命令行工具