【一】微服务技术栈导学-程序员宅基地

技术标签: 云原生  微服务  java  SpringCloud学习笔记  学习笔记  

知识内容来自于黑马程序员视频教学和百度百科。博主仅作笔记整理便于回顾学习。如有侵权请私信我。


1 什么是微服务?

微服务(或微服务架构):是一种云原生架构方法,其中单个应用程序由许多松散耦合且可独立部署的较小组件或服务组成。
这些服务通常

  • 有自己的堆栈,包括数据库和数据模型;
  • 通过REST API,事件流和消息代理的组合相互通信;
  • 它们是按业务能力组织的,分隔服务的线通常称为有界上下文。

尽管有关微服务的许多讨论都围绕体系结构定义和特征展开,但它们的价值可以通过相当简单的业务和组织收益更普遍地理解:

  • 可以更轻松地更新代码。
  • 团队可以为不同的组件使用不同的堆栈。
  • 组件可以彼此独立地进行缩放,从而减少了因必须缩放整个应用程序而产生的浪费和成本,因为单个功能可能面临过多的负载。

微服务也可以通过它们不是什么来理解。微服务架构最经常得出的两个比较是整体架构面向服务的架构(SOA)。
微服务和整体架构之间的区别在于,微服务由许多较小的,松散耦合的服务组成一个应用程序,与大型,紧密耦合的应用程序的整体方法相反。

举例:
一个商城系统就得提供相当多的服务, 比如订单服务,用户功能,商品服务,支付服务等等,这些模块如果使用单体架构来实现,那么耦合度会相当高,开发难度也会很大。如果使用微服务开发,把每一个服务都当成一个单体应用来开发,那么订单服务,用户服务,商品服务,支付服务等模块,每一个就成为一个微服务。

由这些微服务构成整个的商城系统。这样明显是更加合理的。每个服务也可以根据业务的需要去进行集群部署。一方面降低了服务的耦合,一方面有利于服务的维护升级。


2 微服务技术栈

在这里插入图片描述
微服务要做的第一件事情就是拆分。因为传统的单体架构是所有的业务功能写在一起,随着业务越来越复杂,代码饱和的变得越来越多。将来想要升级维护就会变得很困难。所以像一些大型的互联网项目就必须去做拆分。
在这里插入图片描述

拆分的时候,会根据业务模块把一个单体的项目,拆分成许多独立的项目。每一个项目完成一部分业务功能,将来独立开发和部署。把这样一个独立的项目称为服务
在这里插入图片描述

一个大型的互联网项目往往会包含数百甚至上千的服务,最后形成一个服务集群。而一个业务往往就需要由多个服务共同来完成。
在这里插入图片描述

比如说一个请求来了,它可能先去调用了服务A,服务A又去调用服务B,服务B又去调用服务C,当业务越来越复杂时,这些服务之间的关系就会越来越复杂。
这么复杂的一个调用关系,想靠人去记录和维护是不可能的。


2.1 注册中心

在这里插入图片描述

所以在微服务里会有一个组件叫做注册中心。它可以去记录微服务中每一个服务的端口,IP,以及它能完成什么功能这些信息。
当一个服务需要调用另一个服务时,它不需要自己去记录对方的IP,只要去找注册中心就行了。从注册中心去拉取对应的注册信息。


2.2 配置中心

在这里插入图片描述

同时,随着服务越来越多,每个服务都有自己的配置文件,将来如果要更改配置,如果逐一去修改,那会十分麻烦。
所以在微服务里还会有一个配置中心。它可以统一去管理整个服务群体成千上百的这些配置。如果以后有些配置需要变更,只需要去找到配置中心便可。它可以去通知相关的微服务,实现配置的“热更新”。


2.3 服务网关

在这里插入图片描述

当我们的微服务运行起来以后,用户就可以来访问我们。这个时候还需要一个服务网关,因为这里有这么多的微服务,用户如何知道该访问哪一个呢?而且也不是随便什么人都能来访问我们的服务吧。

举例:就像一个小区,服务网关就相当于门卫大叔。服务集群中的每一个服务就相当于小区里的住户。当有用户来请求访问服务时,它还需要知道具体的服务“住在哪里”?

所以,服务网关:

  • 一方面校验用户的身份;
  • 另一方面,可以将用户的请求路由到我们具体的服务中。

路由过程中,也可以去做一些负载均衡。
在这里插入图片描述
这个时候服务接收到请求去处理业务,该访问数据库的时候访问数据库,最后把查询到的数据放回给用户就ok了。


2.4 分布式缓存

这里虽然画的是一个数据库,但实际上会是一个数据库集群。不过集群在庞大,也不可能有用户多。所以将来数据库肯定无法扛住这样的高并发。
在这里插入图片描述

因此我们还会加入缓存。缓存就是把数据库数据放入到内存当中。内存的查询效率比数据库快很多。
而且这样的缓存还不能是单体缓存为了应对高并发,还要做成这样分布式缓存。也是一个集群。
用户的请求先到缓存,缓存未命中再去查询数据库。


2.5 分布式搜索

业务中还会有许多搜索功能,简单查询可以走缓存,一些海量的搜索,复杂的搜索途径分析,缓存也无法完成。
这个时候,还需要用到分布式搜索。数据库将来主要的职责就是做一种数据的写操作,还有一些事务类型,对安全性要求较高的数据存储。
在这里插入图片描述


2.6 消息队列

最后,在微服务当中还需要一种异步通信的消息队列组件
在这里插入图片描述
为什么呢?其实对于分布式服务或在微服务里面,业务往往会跨越多个服务。一个请求来了,它先调用服务A,A再调用B,B再调用C,整个业务的链路就会很长。响应时长就会等于每个服务的执行服务之和,所以性能会有一定的下降。
异步通信 的意思就就是:当请求来了,调用了服务A,这个时候,服务A不是去调用服务B和C,而是发一条消息通知服务B和C:“你们两个,赶紧干活去。”这个时候服务B和C就去干活了,而服务A直接结束。所以业务链路就变短了,响应时间也缩短了,我们的吞吐能力也就变强了。
异步通信能大大提高我们服务的并发。
在一些秒杀这样的高并发场景下,就可以去利用了。


2.7 分布式日志服务&系统监控和链路追踪

在这样一个如此庞大和复杂的服务,在运行过程中,如果出现了什么问题,如何排查呢?
所以在微服务运行过程中,我们还会引入两个组件:来解决服务的异常定位。
在这里插入图片描述
分布式日志服务: 统计整个集群成千上百的服务的运行日志,统一地去做一个存储,统计,分析。将来出现问题就会方便定位。
系统监控&链路追踪: 实时监控整个集群中每一个服务结点的运行状态,CPU负载,内存占用等等情况。一旦出现任何问题,直接可以定位到具体的某一个方法,栈信息。这便可以很快的定位到异常所在。


2.8 自动化部署

那么如此庞大复杂的微服务集群,将来很有可能达到成百上千甚至上万的服务。这个时候我们部署该怎么办呢?如果是靠人工去部署,显然不现实。所以将来这些微服务集群,还需要去做一种自动化的部署。
在这里插入图片描述
Jenkins:可以帮助对这些微服务项目进行自动化的编译。基于docker去做一些打包,形成镜像。再基于kubernetes或者rancher这样的技术,去实现自动化的部署。
这一套就称为持续集成(Continuous Integration)

结合微服务的技术,再加上持续集成,这才是完整的微服务技术栈。


3 微服务技术栈包含知识点

在这里插入图片描述
微服务治理: 这一部分就是SpringCloud这个框架它所包含的一些技术。


4 学习路线

在这里插入图片描述


By–Suki 2022/12/29

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Eumenides_Suki/article/details/128483511

智能推荐

MongoDB正则表达式在索引中的使用-程序员宅基地

文章浏览阅读1k次。正则表达式可以灵活地匹配查询条件,如果希望正则表达式能命中索引,就要注意了:Mongodb能为前缀型的正则表达式命中索引,比如:需要查询Mail中user以z开头的:/^z/如果有user索引,这种查询很高效但其..._mongodb 正则表达式 索引

PON BIP8问题分析_bip8校验原理-程序员宅基地

文章浏览阅读2.5k次,点赞2次,收藏5次。1、问题描述现网同一PON下挂多台样机(32台以上),个别样机出现下行BIP 8 Error告警,2、问题定位分析过在送样50台样机中共发现8台样机存在BIP Error问题,同批次样机存在一定不良比例,定位个体差异引起并非必现设计问题。2.1验证环境影响将问题样机在同一个OLT环境下,改变光路衰减,在有效功率范围内,告警频率随功率变大而减小;在不同OLT环境下部分样机告警取消,但还是有6台样机持续告警,确认样机本身有问题。第一验证结论,环境影响BIP告警,但样机存在问题。._bip8校验原理

Android从本地服务器获取Mp3实现边下边播(JavaEE+Tomcat+SQLServer)_android 音乐播放器实现边下载边播放-程序员宅基地

文章浏览阅读2.1k次,点赞3次,收藏6次。项目实例:https://download.csdn.net/download/qq_37437983/10484636实现环境:1)LenovoG50-80Ubuntu16.04笔记本2)AndroidStudio3)EclipseJ2EE4)Tomcat8.55)sqlServer 6)jdk1.8概..._android 音乐播放器实现边下载边播放

十六进制与字节数组转换_bytearraytohexstring-程序员宅基地

文章浏览阅读7.2k次。前段时间开发手持机上的软件,因为A8手持机的射频卡可存储的内容太小,并且需要存储16进制数据,因此就写了一个工具类。上代码:package cn.com.szh;import java.io.UnsupportedEncodingException;public class Main { public static void main(String[] args) { Stri..._bytearraytohexstring

对每个边缘求最小外接矩形,通过最小矩形提取每个边缘_边缘的最小外接矩形-程序员宅基地

文章浏览阅读4.9k次。#include #include using namespace std;using namespace cv;int main(){Mat src; //源图像Mat tmp; //临时图像Mat dst_bw; //去掉背景后的目标二值图像Mat dst_contours;//轮廓图像src=imread("E:\\单板图片\\求孔洞数_边缘的最小外接矩形

【设计模式】中介者-程序员宅基地

文章浏览阅读865次。中介者,说白了跟市面上黑中介类似。当然这个中介,开发者是可以控制其行为的。也是在一定的信任关系上建立的。该模式要解决的问题是,一堆对象之间交叉耦合问题。网上看过群聊的例子。如果没有任何一个平台,多人之间的会话会是什么样的呢?不举多人,就三个吧A想把一句话说给BC,那么他首先要知道B和C在哪儿,然后分别告诉对方,自己想说的事情。如果再加一个人呢?问题很明显,此时各种群聊工具应运而生。我写

随便推点

耗时半月,终于把牛客网软件测试面试八股文,整理成了文档资料....._牛客软件测试-程序员宅基地

文章浏览阅读1.7k次,点赞2次,收藏22次。一、面试基础题简述测试流程:1、阅读相关技术文档(如产品PRD、UI设计、产品流程图等)。2、参加需求评审会议。3、根据最终确定的需求文档编写测试计划。4、编写测试用例(等价类划分法、边界值分析法等)。5、用例评审(主要参与人员:开发、测试、产品、测试leader)。6、开发提交代码至SVN或者GIT ,配管搭建测试环境。7、执行测试用例,记录发现的问题。8、验证bug与回归测试。9、编写测试报告。10、产品上线。补充测试用例设计过程:根据需求得出测试需求。_牛客软件测试

AD(Altium Designer)导出BOM时出错处理_ad导出bom表不完整-程序员宅基地

文章浏览阅读1.1w次,点赞5次,收藏11次。Altium Designer导出BOM时弹出如下错误窗口问题分析出现这一问题的原因主要有三方面可能的原因。原因一:AD对Templates文件夹的访问权限不够原因二:Office没有安装或者未激活原因三:AD对Office软件的授权判断出错(AD的BUG)问题解决原因一:AD对Templates文件夹的访问权限不够方法1:可以在导出BOM时取消【相对路径到模板文件】选项。取消以后其实就是把模板文件复制到PCB工程中再使用,这样就能回避对上面提到的Template_ad导出bom表不完整

Hive中mapjoin优化例子_hive使用mapjoin实例-程序员宅基地

文章浏览阅读3.2k次。1 基本信息3个表,1个事实表,2个维度表事实表 test_fact (mid string,sex_id string,age_id string )维度表dim_user_demography_age (age_id string,age_name string )维度表dim_user_demography_sex (sex_id string,sex_name strin..._hive使用mapjoin实例

大学四年,从小白到大神,全网最硬核算法学习攻略,不接受反驳-程序员宅基地

文章浏览阅读2.6k次,点赞18次,收藏118次。说到算法的学习方式,对我来说,真的没有什么捷径之类的,就是像我上面说的,先找本书死磕入门数据结构,就跟着书的例子,把例子跑起来就好了,跑起来也不是一件简单的事情。之后就去接触下一些算法思想,后面就可以分类刷题了,刷题就是最好的捷径了。当然,不要 AC 之后就完事了,应该尽可能寻找最优解,当你积累了一定的题量,那么你真的会发现自己变强了,突然感觉递归也就那么一回事。_算法学习

解决ERR! request to http://registry.cnpmjs.org/echarts failed, reason: getaddrinfo ENOTFOUND 报错问题_getaddrinfo enotfound registry.cnpmjs.org-程序员宅基地

文章浏览阅读2.1k次,点赞9次,收藏12次。这里我看其他博主运行完 config set registry https://registry.npm.taobao.org/这个之后又运行了npm install -g cnpm --registry=https://registry.npm.taobao.org ,结果我还是一直报错,可能是没理解其他博主的意思,反正运行完config set registry https://registry.npm.taobao.org/之后直接安装就好了。如果是其他,你使用的是代理,需要在 npm 中配置代理。_getaddrinfo enotfound registry.cnpmjs.org

QT 出现“找不到libgcc_s_dw2-1.dll”的解决方式_qt打包缺少libgcc_s_dw2-1.dll-程序员宅基地

文章浏览阅读5k次。在使用QT时,运行程序时,可能出现QT找不到DLL的问题,这种情况大多数情况是因为没有将QT添加到环境变量的原因。解决方式:我的电脑-高级设置-环境变量将QT的两个bin文件目录路径添加到环境变量中,即可解决这个问题!..._qt打包缺少libgcc_s_dw2-1.dll

推荐文章

热门文章

相关标签