00:00
好,接下来呢,我们一起来看一下我们整个项目的微服务架构图和微服务划分图,当然想要看懂这两个图之前,我们需要大家对微服务以及分布式系统里边的一些基础概念有一个简单了解。好我们先来回顾一下什么叫微服务呢?哎,其实简而言之一句话,我们微服务就是拒绝大型单体应用,我们以前啊,将所有的代码页面,包括搜狗语句等等全写在一个应用里边,这样容易导致一个最大问题,如果有一出代码出现了问题,可能导致我们整个应用不可用,那我们就希望呢,把我们这个大型的单体应用,可以基于业务边界对它进行服务的微化和拆分,诶,我们将一个大的单体应用拆成各个不同的小模块,每一个小模块呢,我们就可以成为一个微服务,这些模块呢,合起来最终完成一个。
01:00
单体应用,而这些各个微服务呢,他们却是独立部署运行的,说如果有一个出现了问题,我们希望不能影响其他服务的正常运行,也就是说微服务啊是一种非常流行的架构风格,诶,它将我们这些大应用拆分成小服务以后呢,我们各个小服务都运行在自己的进程中,也就是互相隔离,但是呢,微服务之间也要进行通信,比如我们订单服务想要去商品服务查询一些商品信息,那我们推荐呢,我们微服务啊可以走HTTPAPI的形式,也就是说从订单服务给商品服务发一个请求,把商品信息要过来就行了,诶这都这就是我们说的微服务,那微服务在极端情况呢,可能长的一个这个样子,每一个大型应用拆分成了好多微服务,每一个小方块呢,都是一个小服务,这服务之间的。
02:00
通用关系网非常复杂,这就对我们的开发、部署和运维带来了极大的挑战,但这些挑战才是我们真正能学到的技术。接下来呢,来说一下什么是集群、分布式以及节点。那我们所说的集群呢,它其实是一个物理形态,而分布式呢,是一种工作方式,也就是说只要是一堆机器合起来,我们就叫做集群,但这一堆机器呢,是合起来做一件事情,还是各自做各自的,我们谁也不知道。而对于分布式系统的定义,可以参照这本书,他是这样说的,分布式系统是若干独立计算机的集合,诶,也就是说有这么一堆计算机的集群,诶,你可以称为集群,它合起来呢,为我们提供一个服务,而这些计算机对于用户来说像是使用单个系统,用户没有感受到在使用这一堆计算机,而是感受到他在使用一个系统。比如举一个例子,京东,我们用户在购物的时候敲3W点,京东进入京东的网站完成整个购物流程,我们没有感受到京东网站后边有多少台。
03:12
服务器,因为京东它是一个分布式的系统,它的各个业务是运行在不同的机器上的,这机器是合起来完成整个京东的功能,所以说呢,我们这些服务啊,我们就可以把它称为一个大型的业务集群,而且呢,每一个小的服务,比如京东里边呢,有一个叫用户服务,用户服务呢,我们每天登录注册,登录注册可能并发量很大,访问压力大的时候呢,我们一台服务器肯定不够,那京东啊,可以让用户服务就这一个服务,我们十台机器一起来运行,就说呢,你随便访问哪台都行,那这样的话呢,我们整个这个用户服务,它又是做了一个集群化处理,通过这个简单的概念呢,我们可以理解一句话,分布式中的每一个节点,什么叫节点呢?就是分布式中的每一个服务器,它呢都可以做集群,什么意思呢?比如我们这个用户服务,它在这个服务器上,诶压力大的时候呢,我们可以。
04:12
把它做成集群,哎,我们十台服务器啊,同时来跑这个用户服务,而集群呢,并不一定是分布式的,比如我们这个用户服务,这十台服务器都是用户服务,它是不是一个分布式的呢?不是整个京东系统才是分布式的,因为这个系统的各个业务运行在各个不同的地方,他们是以分布式的工作方式,也就是说各个工作各自的合起来完成一个完整的系统,这叫分布式的工作方式。也就是说,分布式是将不同的业务分布在不同的地方,比如京东各个业务呢,在各个不同的服务器有购物车、订单、商品,而集群呢,指的是几台服务器集中一起实现统一业务。比如我们这个购物车一台服务器不够,我放上十台服务器,那么他们呢,这十台都是购物车,他们是实现统一业务。
05:11
接下来呢,我们再来说一下远程调用,那为什么会有远程调用呢?我们说在分布式系统中各个服务,也就是我们拆分的各个功能模块,我我们呢,以后将每一个小功能模块我们就称为服务,那么各个服务呢,可能处于不同的主机,比如我把购物车这个模块放在A机器,订单放在B机器,商品放在C机器,那么不可避免的服务之间就要产生互相调用,比如我们订单模块想要去商品模块查询一些商品信息,那怎么办呢?我们把这个调用就称为远程调用,Cloud推荐使用HTTP加Jason的方式完成远程调用,也就是说从订单模块给商品模块发一个HTTP请求,那么他们之间传递在网络间传递数据,可以把数据转成杰森的方式来进行网络传输。
06:08
这样做的好处呢,就是天然的跨平台性,杰省呢,在任意平台都可以使用,包括HTV请求啊,什么都可以兼容,PHP系统、C加加等都可以接收和发送HTV请求,那么我们既然要远程调用,就不可避免的要牵扯一个东西叫负载均衡。什么是负载均衡呢?比如我们这个订单服务,想要调用商品服务,查一些商品信息,那么商品服务呢,我们之前说过,每一个在分布式系统中,每一个节点我们都可以做成集群,因为商品服务啊,这个压力很大,我们可以给三五台机器都让他来跑商品服务,这样的话呢,我们订单服务可以去任意一台机器都能查出商品信息,那我们要怎么查出商品信息呢?我们就可以使用负载均衡,就说如果我有一次,第一次我去这个服务器查商品信息了,第二次呢,这个服务器人爆满了,那我就可以去这个服务器第。
07:08
三次呢,我们也可以去别的服务器,总之负载均衡就是一句话,不要让任何一台服务器太忙,也不要让它太闲,我们可以根据不同的均衡算法来提升我们网站的健壮性。比如我们常见的一些均衡算法有。轮询算法,也就是说第一次呢,我给这个服务器发请求,获取商品详情,那么第一次调用过了它了,第二次呢就轮到它,第三次轮到它,第四次呢又回来轮到它,这样呢是我们一个简单的负载均衡算法,轮询也可以用最小连接,比如呢,我优先选择看哪个服务器它现在的连接数最少的,也就是压力最小的,这样呢我跟他建起连接,这样呢,我们总能找到一个最闲的服务器,能更快的处理连接。当然我们还可以根据散列算法,也就是呢,同一个IP地址的请求,也就是同一个用户的请求,最终呢,都会被负载均衡到同一个服务器。
08:10
接下来呢,我们来说一下服务的注册发现以及注册中心,为什么要有这个呢?我们先来想象一个场景,假设呢,这有一个A服务,就是我们的订单服务,还有一个B服务是我们的商品服务,订单服务呢,想要调商品服务来查询商品的详情,那商品服务呢,在这三台机器都有,而且呢,这三台机器可能有些不稳定,有的时候呢,他下线了,有些时候呢,这两个下线了,哎,我们也不知道哪台机器现在能提供正常的服务,那为了解决这个问题,我们可以引入一个东西叫注册中心。当我们的商品服务,诶这个机器一上线以后,他把他的这个服务呢,注册到注册中心去中去,相当于告知注册中心,诶我这个B机器呢上线了,我们把这个过程呢,就叫服务注册,它把它的服务注册到注册中心,这样呢,三台机器如果都上线了,他们呢都会在注册中心中注册这个服务,相当于告诉注册中心,商品服务在一号机器商品服务二号机器商品服务三号机器,这三个机器都有,那么当我们这个A服务想要调用B服务的时候,可以怎么办呢?可以先去注册中心发现一下,诶我们把这个过程呢叫服务发现,先去看一下我们的商品服务在哪些机器都有发现呢?在123号机器呢都有,都有以后呢,它可以随机的选择一个进行调用,可以根据一些负载均衡算法,当某一个服务下线了以后,注册中心也能实。
09:50
只感知到当A服务想要再来调B服务的时候,他问注册中心这个B服务到底在哪有呢?其实现在呢,已经剩一号服务器跟二号服务器了,这样呢你就可以避免调用不可用的服务,那我们把这个过程就叫服务的注册发现服务呢,一上线把它注册到注册中心,别人呢想要调他从注册中心中进行发现别的服务。
10:17
而我们整个维护哪些服务,在哪些机器,相当于维护这个清单的,这个我们就叫注册中心,同样呢,有一个概念叫配置中心,我们来想象一个场景。当我们项目拆分成各个微服务以后呢,最终每一个服务啊,可能都有大量的这个配置,而且呢,每一个服务都可能部署在多台机器上,比如我们A服务在三台机器上都有,B服务在三台机器上都有,而且呢我们现在需要变更配置,比如A服务里边呢,有一个配置改掉了,我们想让全部机器都能用到最新配置,我们就得把这三台机器的所有AA服务先让它下线,然后呢我们把改新改好的A服务,让他重新给每一台服务器上都部署上来,这样呢就做好了。那么如果我们项目非常大,我们服务在几百台机器都有,那我们这么来改肯定很麻烦,那我们呢,可以做一个东西叫配置中心,让每一个服务呢,都从配置中心中自动获取它自己的配置,这样呢,如果我们想要改我们每一个服务的配置,我们只需要在配置中心改一处,那么A服务的这三台机器从配置中心自动。
11:31
获取到新改的值,哎,我们这个配置呢,就动态的修改了,相当于呢,配置中心可以帮我们集中的管理微服务的配置信息,我们实现改一处配置,各个微服务呢都自动的改掉。接下来呢,我们来说一下服务的熔断和降级,那么什么是熔断降级呢?我们先来考虑一件事情,首先在我们微服务的架构中,微服务之间是通过网络通信的,比如我们订单服务它在A机器,商品服务呢在B机器,库存服务呢在C机器,如果我们想要下单,那么我们A机器呢,就要给B机器发请求,去来查订单里边的商品,包括呢,这个商品还要去给C机器去来发请求,查当前商品有没有库存,整个结束以后呢,下单操作才能完成,但是呢,网络通信有不可靠和不稳定性,假设呢,我们这个库存服务宕机了,或者呢,它的这个网络通信慢了,得三秒五秒,可能十秒呢才能返回,那会出现什么事情,当我们这个库存服务出现了故障啊,导致响应慢,那我们这个商品服务呢,就得在这等,可能等到十秒以后,库存服务呢才能响应。
12:48
也就是说我们这个库存服务的不可用,导致了我们商品服务在这阻塞,那么商品服务在这儿等待期间呢,那我们订单服务也得在这塞,相当于呢,一个服务不可用导致整个服务调用量在这儿一直阻塞,那这样呢,如果是高并发请求,第一个请求进来是要掉这一串服务,那么在这阻塞住十秒还不出结果,那么第二个请求进来一直在这阻塞住十秒,那么更多的请求进来就导致了请求积压,全部都阻塞在这儿,最终会导致我们整个服务器的资源耗尽,一个服务的不可用导致服务器资源耗耗尽,所有服务均不可用,导致我们整个服务的雪崩现象。
13:34
那么基于这个现象呢,我们就可以引申出服务的熔断和降级。那什么是熔断呢?比如我们来举一个例子,当我们商品服务想要调用库存服务的时候,库存服务经常超时,那怎么办呢?我给他指定一个超时时间,比如三秒,只要你三秒库存服务没返回,我就认为你库存服务超时失败了,那接下来怎么办呢?如果经常库存服务失败,当失败达到某个阈值,比如十秒内100个请求全失败了,那咋办呢?那就可以开启断路保护机制,下一个请求进来了,那我直接给你不去调用库存服务了,因为上一次100%的错误都出现了,那我们直接在此中断我们的商品服务直接返回,比如返回一些默认数据,比如默认有库存,或者直接返回库存,查出来的结果是那或者等等等等,我们可以本地直接返回默认数据,而不用去调用远程的库存。
14:34
服务,这样就不会导致请求积压,诶第一个请求进来,第二个请求进来,他们都调用失败了,比如达到我们指定的阈值了,两个请求都失败了,我们开启了断路器,第三个请求一进来,我们呢商品服务不用调库存服务了,直接会返回,所以呢,我们这个请求就会被很快的处理结束,就不会有请求积压的现象,那么就不会导致整个服务雪崩的现象,这是我们说的服务熔断,相当于我们开启断路保护机制,当然还有服务的降级,这个降级呢,跟熔断稍微有点区别,降级是整体把控,比如在我们运维期间,我们现在呢,系统压力很大,资源紧张,我们可以呢让一些非核心业务,假设啊设这个是非核心业务,我们直接把这个非核心业务给它降级运行,所谓的降级运行就是指比如我们这个业务给它停机,也就说不处理,或者呢简单处理。
15:34
我们这个业务呢,使用降级方法运行,我们呢,可以直接你请求我的时候,我给你返回异常或者返回,那我也不查数据库了,不怎么做了,我给你快速返回,这都是一些降级处理的手段,这就是我们说的服务的熔断和降级。但更多的细节呢,我们还要在开发中来慢慢的完善,接下来呢,我们来说一下API网关,API网关是我们微服架构中非常重要的一个组件,特别是呢,我们这个项目是前后分离开发,前端呢是给后台发送HTTP请求的方式来完成各种各样的功能,那么呢,我们就希望前端来发来的所有请求都先到达一个地方,就叫网关,这个网关呢可以对我们的所有请求进行一个统一认证,比如看一下哪些请求是合法的,哪些是非法的,包括呢还可以进行限流,包括服务熔断,负载均衡等等各种操作。网关呢就像是我们大商场的一个安检入口,唯一入口,我们从这个入口呢进来,能放行过来的请求就是后台需要处理的,那么放行不过来的请求,后台也无需处理,包括在高并发的情况。
16:53
下,我们可以在网关级别对它进行一个限流流控,那么比如以恒定的速率将请求流向我们的后台服务集群,这样呢,我们服务集群就不会收到瞬时过大的请求流量进来,把我们的服务集群压垮。
17:10
以上呢就是我们分布式系统中的一些基本概念,当然这些概念呢,我们在不断的开发中进行完善和深入,大家先有一个基本的了解,这样呢,我们就可以在下一节课来给大家简单的解释一下微服务的一些架构图和我们的服务划分图。
我来说两句