【微服务架构】Spring Cloud入门概念讲解

news2024/11/19 17:28:34

目录

一、单体架构VS微服务架构

1.1 单体应用

单体架构的优点

单体应用的缺点

1.2 微服务“定义”

微服务的特性

微服务的缺点

微服务的适用场景

二、微服务常见概念与核心模块

三、Spring Cloud 工作流程


一、单体架构VS微服务架构

1.1 单体应用

        一个归档包(如war包)包含所有功能的应用程序通常称为单体应用,而架构单体应用的方法论(指采用单体应用架构的一种设计和开发理念),就是单体应用架构。

单体应用架构图:

单体架构的优点

  • 架构简单:如图所示...
  • 开发、测试、部署方便:将项目的所有模块结合在一起导成一个war或者jar包,再进行部署即可。

单体应用的缺点

  • 复杂性高: 如果我的项目高达50个模块,而代码量又高。在后续的更新迭代中如果要修复一些bug或者增添功能可能会出现不必要的麻烦,还要考虑是否会影响之前写的代码
  • 部署慢,频率低: 我们一般项目的启动就要5分钟,所以部署慢,从而导致频率低。应为我们应用很大,往往只能做全量的部署,而全量的部署所有修改代码都会更新掉,这样上线的风险就会很高,一旦哪个功能出现了问题就可能要回归所有的代码,最终导致项目部署的频率低。(一般隔一、两哥月才部署一次😥)
  • 扩展能力受限: 如图,比如这个用户模块如果它是一个cpu密集的模块,我的项目服务器遇到了瓶颈,那我还能把这个项目换个更好的服务器进行部署。同理,比如这个内容模块是一个io密集的模块,我需要更大的内存,那我就要把这个项目放到更大内存的服务器,我无法对单个模块作为扩展。
  • 阻碍技术创新: 比如目前这个项目用到的技术栈是spring mvc,如果我要用到更的web框架(web flask)那简直就是一个灾难,那我改掉整个项目的代码(所有的模块都在一块)

总结:单体架构对一些简单的项目架构是比较适行的,但面对一些比较庞大的项目当单体架构的缺点就比较明显,这时候就需要根据项目业务流程复杂难度合理构建项目。

1.2 微服务“定义”

        由于单体应用的各种缺点,在2014年的时候出现了一个大佬Martin Fowler(马丁·福勒)提出的微服务概念,从此微服务走向的世界的顶流。

截止到目前微服务并没有一个完全的定义,可能大家理解的微服务都不完全一样,下面是我对微服务的理解

        微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并且可通过全自动部署机制独立部署。这些服务共用一个最小型的集中式的管理,服务可用不同的语言开发,使用不同的数据存储技术。 

微服务的特性

  • 每个微服务可独立运行在自己的进程里: 这意味着每个服务都有自己的Tomcat
  • 一系列独立运行的微服务共同构建起整个系统: 每个微服务都能够独立的运行
  • 每个服务为独立的业务开发,一个微服务只关注某个特定的功能,例如订单管理、用户管理等:微服务被认可最重要的点⭐
  • 可使用不同的语言与数据存储技术(契合项目情况和团队实力) ;
  • 微服务之间通过轻量的通信机制进行通信,例如通过RESTAPI进行调用;
  • 全自动的部署机制: 这个自动化的前提是你能够把自动化的东西都自动化掉,比如自动化的构建、测试、部署...

微服务的缺点

  • 运维要求高: 在单体应用程序中我们只要运营一个jar包,而微服务需要运行若干个应用,所以运维的成本要高。
  • 分布式固有的复杂性: 微服务的本质其实就是一个分布式应用,而分布式的应用要考虑就很多人,比如网络延迟、分布式事务、锁等等...
  • 重复劳动 : 举一个例子:在serviceA中写一个功能,而serviceB同样也有这样的功能。这时聪明的你就想到了,可以将该功能导成jar包供这两个模块引用。可要考虑的是微服务是支持不同语言技术开发的,如果serviceA用的是Java,而sericeB用的是php,java的功能能用在php里面吗?所以还是会存在一些重复劳动的。

微服务的适用场景

  • 大型、复杂的项目: 如果你的应用用单体架构就能搞定,那是不需要微服务的,杀鸡无需宰牛刀的。
  • 有快速迭代的需求: 如果应用三五个月才需要上线发布一次,需求的变更也不是很多,那就没必要用微服务,用单体架构就可行。
  • 访问压力大: 微服务有一个很大的好处就是去中心化,微服务把业务和数据都拆开了,这样更适用于一些数据访问量大的项目,数据的吞吐会好很多。

二、微服务常见概念与核心模块

        Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具,它提供了一套微服务解决方案,包括服务治理        、配置管理、消息总线、负载均衡、断路器、数据监控等功能。下面是一些 Spring Cloud 的核心模块:

  1. 服务治理(Eureka): Eureka 是 Netflix 开源的一款提供服务注册和发现的产品,它提供了完整的 Service Registry 和 Service Discovery 实现。服务注册中心是微服务架构中的重要组成部分,主要用于实现微服务的自动化注册和发现。

            基于REST(一种软件架构风格,一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性)的服务。主要以AWS云服务为支撑,提供服务发现并实现负载均衡和故障转移。

    · 管理各种服务功能包括服务的注册、发现、熔断、负载、降级等,比如dubbo admin后台的各种功能。有了服务中心后,任何一个服务都不能直接去相互调用,必须通过注册中心来调用。

    · 服务端提供服务注册,当客户端服务启动的时候,会主动向服务端进行注册,服务端会存储所有已经注册服务节点信息。服务端会管理这些节点信息,并且会将异常的节点移除服务列表。

  2. 负载均衡(Ribbon): Ribbon 是 Netflix 发布的云中间层服务调用工具,它提供了一套完整的配置项,包括连接超时、重试、重试算法等。Ribbon 已经默认整合了服务发现组件 Eureka,为我们的服务提供了客户端负载均衡的功能。

  3. 声明式服务调用(Feign): Feign 是一个声明式的 Web Service 客户端,它使得编写 Web Service 客户端变得更简单。在Spring体系中,只要是通过调用接口来进行某个操作的,应该都是使用了动态代理技术,比如MyBatis中通过接口对应到对应的XML中的SQL。

    在Spring解析的时候,核心有2个步骤:

    · 通过接口来动态注册Bean

    · 对接口方法进行动态代理,比如Feign就是解析@GetMapping 这类注解将其转为对应的Http Get请求。

  4. 配置管理(Spring Cloud Config): Spring Cloud Config 提供了服务器端和客户端的支持,用于外部化配置在分布式系统中的实现。配置服务器存储实际的配置内容,而客户端则负责从服务器获取并使用配置。

    引入spring cloud config后,我们的外部配置文件就可以集中放置在一个git仓库里,再新建一个config server,用来管理所有的配置文件,维护的时候需要更改配置时,只需要在本地更改后,推送到远程仓库,所有的服务实例都可以通过config server来获取配置文件,这时每个服务实例就相当于配置服务的客户端config client,为了保证系统的稳定,配置服务端config server可以进行集群部署。

  5. 断路器(Hystrix): 在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用。为了保证其高可用,单个服务通常会集群部署。由于网络原因或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这个服务就会出现线程阻塞,此时若有大量的请求涌入,Servlet容器的线程资源会被消耗完毕,导致服务瘫痪。服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的“雪崩”效应。Netflix开源了Hystrix组件,实现了断路器模式,SpringCloud对这一组件进行了整合。

  6. 服务网关(Zuul): Zuul 是 Netflix 提供的一个基于 JVM 路由和服务端负载均衡器,主要用于动态路由、监控、弹性和安全性。

    zuul的核心是一系列的filters, 其作用可以类比Servlet框架Filter。

    Zuul的主要功能是路由和过滤器。是各种服务的统一入口,同时还会用来提供监控、授权、安全、调度等等;可以通过扩展ZuulFilter,在执行方法之前,做各种检查工作。

        以上就是 Spring Cloud 的一些核心模块,每个模块都对应了微服务架构中的一种或多种功能,通过这些模块的组合,可以快速地构建和部署微服务架构的应用。 

三、Spring Cloud 工作流程

1:首先把整个系统根据业务拆分成几个子系统。

2:每个子系统可以部署多个应用,多个应用之间使用负载均衡。

3:需要一个服务注册中心,所有的服务都在注册中心注册,负载均衡也是通过在注册中心注册的服务来使用一定策略来实现。

4:所有的客户端都通过同一个网关地址访问后台的服务,通过路由配置,网关来判断一个URL请求由哪个服务处理。请求转发到服务上的时候也使用负载均衡。

5:服务之间有时候也需要相互访问。例如有一个用户模块,其他服务在处理一些业务的时候,要获取用户服务的用户数据。

6:需要一个断路器,及时处理服务调用时的超时和错误,防止由于其中一个服务的问题而导致整体系统的瘫痪。

7:还需要一个监控功能,监控每个服务调用花费的时间等。

目前主流的微服务框架:Dubbo、 SpringCloud、thrift、Hessian等,目前国内的中小企业用的大多数都是Dubbo,SpringCloud。

目前主流的微服务框架:Dubbo、 SpringCloud、thrift、Hessian等

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

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

相关文章

数据损毁!250 亿美金的 Pinterest,在数据库选型上的翻车经历

原文链接 Pinterest 是一个以图片为主的社交网络,用户可以将图片保存或 "钉 / pin" 在自己的图板上。Pinterest 在 2019 年上市,目前市值 250 亿美金。本文内容主要根据 2012 年 Scaling Pinterest 的分享。 2012 年 1 月,Pinteres…

ARM NEON 指令

NEON指令 按照操作数类型可以分为正常指令、宽指令、窄指令、饱和指令、长指令。 正常指令:生成大小相同且类型通常与操作数向量相同到结果向量。长指令:对双字向量操作数执行运算,生产四字向量到结果。所生成的元素一般是操作数元素宽度到…

从0搭建github.io网页

点击跳转到🔗我的博客文章目录 从0搭建github.io网页 文章目录 从0搭建github.io网页1.成果展示1.1 网址和源码1.2 页面展示 2.new对象2.1 创建仓库 3.github.io仓库的初始化3.1 千里之行,始于足下3.2 _config.yml3.3 一点杂活 4.PerCheung.github.io.p…

Qt(三):udp组播的发送与接收

1. 创建UDP套接字 使用QUdpSocket类创建一个UDP套接字。 udpSendnew QUdpSocket(this);udpRecenew QUdpSocket(this); 2. 绑定套接字 绑定套接字到一个本地地址和端口。可以使用bind()函数来完成。 如果要在组播中发送数据,可以将套接字绑定到一个通配符地址&#…

【CASS精品教程】CASS11计算城镇建筑密度

CASS中可以很方便计算建筑密度。 文章目录 一、建筑密度介绍二、CASS计算建筑密度1. 绘制宗地范围2. 绘制建筑物3. 计算建筑密度三、注意事项一、建筑密度介绍 建筑密度(building density;building coverage ratio),指在一定范围内,建筑物的基底面积总和与占用地面积的比…

计算机网络-以太网交换基础

一、网络设备的演变 最初的网络在两台设备间使用传输介质如网线等进行连接就可以进行通信。但是随着数据的传输需求,多个设备需要进行数据通信时就需要另外的设备进行网络互联,并且随着网络传输的需求不断更新升级。从一开始的两台设备互联到企业部门内部…

【OpenCV】在MacOS上源码编译OpenCV

在MacOS上源码编译OpenCV 1. 下载项目源码2. 创建CMake编译文件3. 编译安装4. 案例测试5. 总结 前言 在做视觉任务时,我们经常会用到开源视觉库OpenCV,OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件…

Spring技术内幕笔记之IOC的实现

IOC容器的实现 依赖反转: 依赖对象的获得被反转了,于是依赖反转更名为:依赖注入。许多应用都是由两个或者多个类通过彼此的合作来实现业务逻辑的,这使得每个对象都需要与其合作的对象的引用,如果这个获取过程需要自身…

Java学习苦旅(十六)——List

本篇博客将详细讲解Java中的List。 文章目录 预备知识——初识泛型泛型的引入泛型小结 预备知识——包装类基本数据类型和包装类直接对应关系装包与拆包 ArrayList简介ArrayList使用ArrayList的构造ArrayList常见操作ArrayList遍历 结尾 预备知识——初识泛型 泛型的引入 我…

WebStorm 创建一个Vue项目(1)

一、下载并安装WebStorm 步骤一 步骤二 选择激活方式 激活码: I2A0QUY8VU-eyJsaWNlbnNlSWQiOiJJMkEwUVVZOFZVIiwibGljZW5zZWVOYW1lIjoiVU5JVkVSU0lEQURFIEVTVEFEVUFMIERFIENBTVBJTkFTIiwiYXNzaWduZWVOYW1lIjoiVGFvYmFv77yaSkVU5YWo5a625qG25rAIOa0uW3peS9nOWup…

json解析本地数据,使用JSONObject和JsonUtility两种方法。

json解析丨网址、数据、其他信息 文章目录 json解析丨网址、数据、其他信息介绍一、文中使用了两种方法作为配置二、第一种准备2.代码块 二、第二种总结 介绍 本文可直接解析本地json信息的功能示例,使用JSONObject和JsonUtility两种方法。 一、文中使用了两种方法…

R语言——R函数、选项参数、数学统计函数(六)

目录 一、R函数 二、选项参数 三、数学统计函数 四、参考 一、R函数 1.lm() lm()是R语言中经常用到的函数&#xff0c;用来拟合回归模型。它是拟合线性模型最基本的函数 lm()格式如下&#xff1a; fit<-lm(formula,data) 其中&#xff0c;formula指要拟合的模型形式…

【QT 自研上位机 与 ESP32下位机联调>>>串口控制GPIO-基础样例-联合文章】

【QT 自研上位机 与 ESP32下位机联调&#xff1e;&#xff1e;&#xff1e;串口控制GPIO-基础样例-联合文章】 1、概述2、实验环境3、 自我总结4、 实验过程1、验证上位机QT程序1、下载样例代码2、修改qt程序3、运行测试验证 2、验证下位机ESP32程序1、下载样例代码2、更改ESP3…

Ubuntu18 安装chatglm2-6b

记了下Ubuntu18 上安装chatglm2-6遇到的问题。 环境&#xff1a;Ubuntu18.04 V100(显卡) nvcc 11.6 显卡驱动cudacudnnaniconda chatglm6b 的安装 网上有很多&#xff0c; 不记录 了。 chatglm2-6b 我从别的地方拷贝的&#xff0c; 模型也包含了。 遇到的问题&#xf…

【MMC子系统】三、MMC子系统框架

我的圈子&#xff1a; 高级工程师聚集地 我是董哥&#xff0c;高级嵌入式软件开发工程师&#xff0c;从事嵌入式Linux驱动开发和系统开发&#xff0c;曾就职于世界500强企业&#xff01; 创作理念&#xff1a;专注分享高质量嵌入式文章&#xff0c;让大家读有所得&#xff01; …

【SpringBoot开发】之商城项目案例(购物车相关操作)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《SpringBoot开发之商城项目系列》。&#x1f3af…

GZ075 云计算应用赛题第4套

2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷4 某企业根据自身业务需求&#xff0c;实施数字化转型&#xff0c;规划和建设数字化平台&#xff0c;平台聚焦“DevOps开发运维一体化”和“数据驱动产品开发”&#xff0c;拟采用开源OpenSt…

Pytorch上采样

文章目录 Upsample特殊上采样 Upsample 所谓上采样&#xff0c;实则是一个插值过程。所以上采样对象在初始化时&#xff0c;需要指定一个插值类型&#xff0c;Upsample是torch.nn中最基础的上采样类&#xff0c;初始化参数如下 Upsample(sizeNone, scale_factorNone, modenea…

计算机组成原理 主存和CPU连接与主存提速方案

文章目录 主存与CPU的连接译码器线选法译码片选法总结 位拓展字拓展字位同时拓展 主存提速方案存储周期双端口RAM多模块存储器单体多字存储器多模块多体并行存储器存储器高位交叉编址低位交叉编址 主存与CPU的连接 #mermaid-svg-3wv6WzRP2BvKEHQZ {font-family:"trebuchet…

GZ075 云计算应用赛题第1套

2023年全国职业院校技能大赛(高职组) “云计算应用”赛项赛卷1 某企业根据自身业务需求,实施数字化转型,规划和建设数字化平台,平台聚焦“DevOps开发运维一体化”和“数据驱动产品开发”,拟采用开源OpenStack搭建企业内部私有云平台,开源Kubernetes搭建云原生服务平台,…