漫谈微服务架构:什么是Spring Cloud,为何要选择Spring Cloud

 

Spring Cloud是基于Spring Boot的,因此还在使用SpringMVC的同学要先了解Spring Boot。先上一段官话,Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了一种简单的开发框架。

Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。

 

Spring Cloud全家桶

上面的图是Spring Cloud的全家桶,包罗万象,犹如水电,涉及到开发的方方页面。

Spring Cloud从设计之初就考虑了绝大多数互联网公司架构演化所需的功能,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等。

首先是核心服务治理的组件(服务注册与发现)Spring Cloud Eureka

Eureka是Netflix开源的一款提供服务注册和发现的产品,Eureka就是一个服务中心,将所有的可以提供的服务都注册到它这里来管理,其它各调用者需要的时候去注册中心获取,然后再进行调用,避免了服务之间的直接调用,方便后续的水平扩展、故障转移等。如下图:

 

当然服务中心这么重要的组件一但挂掉将会影响全部服务,因此需要搭建Eureka集群来保持高可用性,生产中建议最少两台。随着系统的流量不断增加,需要根据情况来扩展某个服务,Eureka内部已经提供均衡负载的功能,只需要增加相应的服务端实例既可。那么在系统的运行期间某个实例挂了怎么办?Eureka内容有一个心跳检测机制,如果某个实例在规定的时间内没有进行通讯则会自动被剔除掉,避免了某个实例挂掉而影响服务。

因此使用了Eureka就自动具有了注册中心、负载均衡、故障转移的功能。

当然还有另外一个实现组件Spring Cloud Consul,这里不做多介绍。

随着微服务不断的增多,每个微服务都有自己对应的配置文件。在研发过程中有测试环境、UAT环境、生产环境,因此每个微服务又对应至少三个不同环境的配置文件。这么多的配置文件,如果需要修改某个公共服务的配置信息,如:缓存、数据库等,难免会产生混乱,这个时候就需要引入Spring Cloud另外一个组件:Spring Cloud Config。

Spring Cloud Config

Spring Cloud Config是一个解决分布式系统的配置管理方案。它包含了Client和Server两个部分,其实就是Server端将所有的配置文件服务化,需要配置文件的服务实例去Config Server获取对应的数据。将所有的配置文件统一整理,避免了配置文件碎片化。

如果服务运行期间改变配置文件,服务是不会得到最新的配置信息,需要解决这个问题就需要引入Refresh。可以在服务的运行期间重新加载配置文件,当所有的配置文件都存储在配置中心的时候,配置中心就成为了一个非常重要的组件。如果配置中心出现问题将会导致灾难性的后果,因此在生产中建议对配置中心做集群,来支持配置中心高可用性。

Hystrix

在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应。

如下图所示:A作为服务提供者,B为A的服务消费者,C和D是B的服务消费者。A不可用引起了B的不可用,并将不可用像滚雪球一样放大到C和D时,雪崩效应就形成了。

 

在这种情况下就需要整个服务机构具有故障隔离的功能,避免某一个服务挂掉影响全局。在Spring Cloud 中Hystrix组件就扮演这个角色。

Hystrix会在某个服务连续调用N次不响应的情况下,立即通知调用端调用失败,避免调用端持续等待而影响了整体服务。Hystrix间隔时间会再次检查此服务,如果服务恢复将继续提供服务。

Hystrix Dashboard和Turbine

当熔断发生的时候需要迅速的响应来解决问题,避免故障进一步扩散,那么对熔断的监控就变得非常重要。熔断的监控现在有两款工具:Hystrix-dashboard和Turbine。

Hystrix-dashboard是一款针对Hystrix进行实时监控的工具,通过Hystrix Dashboard我们可以直观地看到各Hystrix Command的请求响应时间, 请求成功率等数据。但是只使用Hystrix Dashboard的话, 你只能看到单个应用内的服务信息, 这明显不够. 我们需要一个工具能让我们汇总系统内多个服务的数据并显示到Hystrix Dashboard上, 这个工具就是Turbine. 监控的效果图如下:

 

Spring Cloud Bus消息总线

Refresh方案虽然可以解决单个微服务运行期间重载配置信息的问题,但是在真正的实践生产中,可能会有N多的服务需要更新配置,如果每次依靠手动Refresh将是一个巨大的工作量,这时候Spring Cloud提出了另外一个解决方案:Spring Cloud Bus

Spring Cloud Bus通过轻量消息代理连接各个分布的节点。这会用在广播状态的变化(例如配置变化)或者其它的消息指令中。Spring Cloud Bus的一个核心思想是通过分布式的启动器对Spring Boot应用进行扩展,也可以用来建立一个或多个应用之间的通信频道。目前唯一实现的方式是用AMQP消息代理作为通道。

Spring Cloud Bus是轻量级的通讯组件,也可以用在其它类似的场景中。有了Spring Cloud Bus之后,当我们改变配置文件提交到版本库中时,会自动的触发对应实例的Refresh,具体的工作流程如下:

 

服务网关

在微服务架构模式下,后端服务的实例数一般是动态的,对于客户端而言很难发现动态改变的服务实例的访问地址信息。因此在基于微服务的项目中为了简化前端的调用逻辑,通常会引入API Gateway作为轻量级网关,同时API Gateway中也会实现相关的认证逻辑从而简化内部服务之间相互调用的复杂度。 

 

Spring Cloud体系中支持API Gateway落地的技术就是Zuul。Spring Cloud Zuul路由是微服务架构中不可或缺的一部分,提供动态路由,监控,弹性,安全等的边缘服务。Zuul是Netflix出品的一个基于JVM路由和服务端的负载均衡器。它的具体作用就是服务转发,接收并转发所有内外部的客户端调用。使用Zuul可以作为资源的统一访问入口,同时也可以在网关做一些权限校验等类似的功能。

链路跟踪

随着服务的越来越多,对调用链的分析会越来越复杂,如服务之间的调用关系、某个请求对应的调用链、调用之间消费的时间等,对这些信息进行监控就成为一个问题。在实际的使用中我们需要监控服务和服务之间通讯的各项指标,这些数据将是我们改进系统架构的主要依据。因此分布式的链路跟踪就变的非常重要,Spring Cloud也给出了具体的解决方案:Spring Cloud Sleuth和Zipkin

 

Spring Cloud Sleuth为服务之间调用提供链路追踪。通过Sleuth可以很清楚的了解到一个服务请求经过了哪些服务,每个服务处理花费了多长时间。从而让我们可以很方便的理清各微服务间的调用关系。分布式链路跟踪需要Sleuth+Zipkin结合来实现,当然实现链路追踪的还有三方开源方案,如果zipkin实现的功能非常简单,图形化能力也不强,所以可以试试其它的方案,如pinpoint较成熟的框架等。说到这里顺便给大家推荐一个架构学习交流圈。交流学习企鹅圈号:519752913 里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

Feign

声明式远程调度组件。

Ribbon

负载均衡组件

Spring Cloud Data Flow

大数据操作组件,它是Spring XD的替代品,也是一个混合计算模型,可以通过命令行的方式操作数据流

Spring Cloud Task

组件基于Spring Tsak,提供任务调度和任务管理的功能

以上只介绍经常用到非常重要的内容,一般的技术栈为 SpringCloud +GitLab+Jinkins进行普通服务的开发持续集成部署CI,后面可升级用SpingCloud +GitLab+Jinkins+Docker容器化布署,进一步升级到用 SpingCloud +GitLab+Jinkins+Docker+k8s自动化容器编排内容,这里的难度等级就完全不一样了,而且每一个组件都涉及到很多内容,传统业务如何进行微服务的拆分下次再进行讨论。 

 

转载于:https://www.cnblogs.com/lfs2640666960/p/11110087.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/448557.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构之头指针链表de三种插入方式(头插法,尾插法,在pos处插入)

1、头插法: 流程:1 ,判断传入数据是否正确 2,如果正确则创建一个新的节点,并判断节点是否创建成功 3,然后给节点成员变量赋值 4,最后让新节点变为链表的第一个节点。 代码实现: // 链表的头插…

c# 科学计数法值转换成正常值,返回字符串

/// <summary>/// 科学计数法值转换成正常值/// </summary>/// <param name"value"></param>/// <returns></returns>public string ValueScientificNotationConvert(JToken value){if (value null) return "";var …

使用 Docker 部署 Node 服务

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 前言   Docker 是一个开源的容器引擎。开发者可以将自己的应用以及依赖打包为一个可移植的容器&#xff0c;然后发布到 Linux 机器上。…

科目三电子考的通过率普遍偏低

据调查&#xff0c;科目三电子考的通过率普遍偏低&#xff0c;是学员们公认的最难考项目。今天小编要通过自己的所看所听分析科目三电子考通过率低的三大原因。 原因一&#xff1a;考生基本功不扎实 从历年来考试失败的理由中&#xff0c;可以发现&#xff0c;大多都出现上车、…

打印python包含汉字报SyntaxError: Non-ASCII character '\xe4' in file

因为本人主要使用Scala语言&#xff0c;但是之前同事包括老大都是使用python&#xff0c;加上python在spark的使用中的确越来越受欢迎&#xff0c;所以最近准备入坑python&#xff0c;但是装完写demo的时候出了问题&#xff0c;如下&#xff1a; 查了下发现&#xff0c;这是pyt…

数据结构之头指针链表的逆序、输出和指定位置的删除

头指针链表指定位置的删除 实现&#xff1a;1&#xff0c;先判断传入的数据是否正确&#xff0c;然后再判断是否为空表&#xff0c;最后判断pos的值是否满足题意 2&#xff0c;分删除位置为1和不为1讨论&#xff1a;为1时&#xff0c;直接将h指向第二个节点并释放第一个节点的…

软件包管理 之 fedora-rpmdevtools 工具介绍

作者&#xff1a;北南南北来自&#xff1a;LinuxSir.Org提要&#xff1a;fedora-rpmdevtools 是一款Fedora的RPM包的开发工具&#xff0c;用于Fedora Core 2.0 以上版本&#xff1b; 正文 一、fedora-rpmdevtools 介绍&#xff1b; 用于制作RPM包的工具&#xff0c;为开发者提供…

Node.js 多版本安装配置(Window、Ubuntu 、CentOS 、Mac OS、Cloud Studio)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 向大家介绍在window和Linux上安装Node.js的方法。 本安装教程以Node.js v4.4.3 LTS(长期支持版本)版本为例。 Node.js安装包及源码下载…

场外科目三考试技巧

科目三考试可以说是学车中最有用的&#xff0c;因为这和将来正式上路是完全相同的&#xff0c;所以掌握c1科目三考试技巧也是很必要的。下面就来看看小编为大家总结的场外科目三考试技巧吧。 一、考前准备 要从车头前绕过进入车内&#xff0c;并注意关牢车门&#xff0c;之后双…

数据结构之单链表(头结点)的一些常用操作(增删改查逆)

删除指定结点 流程&#xff1a;判断传入数据和pos的位置是否符题意——找到删除位置的前一个结点&#xff0c;找到后要判断所找的位置是否越界——删除指定结点。代码&#xff1a; //删除指定结点 int Delete_Pos(Node* h, int pos) {if (NULL h || pos < 1){return FALS…

cookie ? 利用cookie实现 显示上次访问时间?

二、 <%page import"java.text.SimpleDateFormat"%> <%page import"java.util.Date"%> <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <!DOCTYPE html PUBLIC &…

Java9Java10 Java11新特性

1转载于:https://www.cnblogs.com/LXL616/p/11100177.html

数据结构之头结点链表的三种插入方式(头插法,尾插法,在pos处插入)

创建头结点 流程&#xff1a;首先创建头结点表指针并为其分配空间——并将头结点指向空&#xff0c;防止出现段错误。 代码&#xff1a; //创建头结点 Node* Create_List () {//创建头结点Node* list (Node*) malloc(sizeof(Node) / sizeof(char));if (NULL list) //检验…

JAVA 构造 MAP 并初始化 MAP、定义时就初始化

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 第一种方法&#xff1a;static块初始化 public class Demo{private static final Map<String, String> myMap;static{myMap new…

心​理​学​家​告​诉​你​:​男​女​怎​样​才​叫​合​适

心理学家认为..判断男女两个人是否适合牵手..应考虑以下10个因素.. 第一..彼此都是对方的好朋友..不带任何条件..喜欢与对方在一起.. 第二..彼此很容易沟通..互相可以很敞开地坦白任何事情..而不必担心被对方怀疑或轻视.. 第三..两人在心灵上有共同的理念和价值观..并…

回溯---分割字符串使得每个部分都是回文数

分割字符串使得每个部分都是回文数 131. Palindrome Partitioning (Medium) For example, given s "aab", Return[["aa","b"],["a","a","b"] ] 题目描述&#xff1a; 给定一个字符串&#xff0c;将其分割成回文串…

C# 调用FLashPaper2(二)

C#调用FlashPaper2 [2011-4-14 10:06:41]c:相信大家都知道“FlashPaper”这个东西是用来干什么的&#xff0c;他是一个转换的软件&#xff0c;通过虚拟打印机把文件流转换成PDF或SWF文件。这里废话就不多说了&#xff0c;直接看如何使用C#调用FlashPaper2&#xff1a; protecte…

C语言实现简单的电子通讯录

**制作一个电子通讯录&#xff0c;通过该通讯录能录入好友ID号、姓名(英文)、手 机号码&#xff0c;家庭住址&#xff0c;公司电话。** 原理&#xff1a;分成5个模块&#xff0c;将模块功能实现写入头文件中。主函数部分代码&#xff1a; 显示函数部分&#xff0c;在Markdow…

Jackson使用:String 与对象互转、Jackson 从 json 字符串转换出对象

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一、从json字符串转换出对象 Pager类&#xff1a; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; JsonIgnoreProper…

13个好习惯 教你健康一整年

怎么在坐着上班时&#xff0c;练出紧实小腹&#xff1f;如何在酗咖啡的紧凑中&#xff0c;帮身体排毒&#xff1f;新年初始&#xff0c;《天下》介绍十三个小诀窍&#xff0c;让你轻松变健康。 一年初始&#xff0c;该如何规划最重要的“健康”&#xff1f;《天下》邀请专家&am…