开发者学堂课程【高校精品课-厦门大学 -JavaEE 平台技术:体系结构之组件设计】学习笔记,与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/80/detail/15938
体系结构之组件设计
有了这个瓶颈分析之后,要去分析一下我们的系统内部怎样来设计这样的一个技术结构,去解决我们说的这个瓶颈。
首先来做这个全线系统的这个结构设计,全新系统的结构设计就是说我们的全新系统要分成其他几块,分成哪几大块,全系统主要是用来叫权限的,但是我们刚才说
到我们的整个的设计目标是一个大负载高并发的系统。
首先要定个前提大负载高并发,如果说你不是大变化大负载高并发的话,你就做一个系统就完了放上面能上来,多了就卡住就好了,那我们的目标是要做到一个不卡住的系统,但高并发比大负载还复杂,高并发如果有互斥的话,那就更难了,大负载是不考虑互斥就大家各干各的,比如说我们这里所看到的,这些所有的瓶颈其实
都是大负载的问题,而不是高并发的问题,他没有互斥吗?
那我们首先是大负载的问题,如果负载大了怎么办,没有互斥的话就加设备,如果
没有或者加设备就一台不行两三台,那不行就三台,三台不行,就是四台,那么十台二十台,这么加上去。
那所以说从整个结构上头我们必须做成一个可以不断的扩展的,这样的一个结构,我们在交了一个中间会说我们会要用到一个叫做微服务的体系结构。
这样的一个结构,就是说整个系统是由若干个服务构成的,那什么是服务,我们首先定一下什么是服务,服务是什么呢?服务是说它的独立的数据结构,其在数据上在数据结构上面的逻辑这个怎么说,比如说我们的权限系统就是一个天然的微服务的系统,它就是一个服务它一共有三张表六张表,三个实体三个关系,大家可以看这张压图,在我们的四个模块的压头中间唯有这张压图是没有指向其他模块的连线,大家知道我的压头画的时候,如果说这张表里头有一个 id 或者有一个东西是来自于其他的模块的或者来对其他表的,我都会画条线过去,为什么这么画,原因就
是你可以看得出这些数据和数据之间的关系是什么。数据库是一种关系,什么四个模块中间唯有这个模块是没有任何一条线指向其他的模块。
因为它是跟其他模块最隔离的一个模块,就是最独立的一个模块。而且我们的设计目标是让让这个权限系统是一个通用权限系统,它可以脱离电子商城来使用。就是给任何的后台来做权限管理的,那基于这样的一个设计目标的话,你可以看到从数据结构上,我们就首先要做到说这样的一个权限管理的数据结构,不依赖于其他的部分的数据。其实里头有一个东西叫做第 depart的 id 。
那个其实是跟其他的东西是有一定的关系的,但是大家可以看到我的那个 depart的 id 可没有指向其他的东西。因为在权限系统中间,它压根就不会去查这个地方的 id 所代表的那个实体资源,它就是一个 id 而已。它只是去检查说这个用户是不是这个 id 的,是不是这个地方的 id 的,它不会去查这个地方的 id 到底是什么。所以这是这是我们在设计这个系统的一个初衷,它是一个最独立的逻辑体那在这那在这几张表上面的所有的业务跟他做到一起形成一个微服,那对于大家的系统来说可能没有这么独立,但是你会发现说有一些的表是有之间的关系比较紧密的,有一些的表他的关系是比较松散的,那你就可以把你的每一个模块切分成若干个微服务。然后把跟这些表有关的代码跟他包装成一个服务,注意你切成微服以后,你不能再做联表查询了。联表查询只能在微服务的内部来做,那当然大家知道在阿里的规矩中间说联表查询不超过两张表,这其实也就是微服务里头你你其实微服务切开了以后,你其实也不会做超过两张表的联表查询,因为其实一个服务里头这两三张表,比如像这个像比较多的,有六张表那这个概念大家可以看到,其实就是个面向对象的概念,面向大现在的概念就是以数据为核心把代码中装在这个数据里头,就是我们的类的属性是核心内的方法是跟这些属性有关系的那面对象这个概念,其实不仅仅是用在微观的设计层面就是我们做的类的设计层面其实在整体的设计层面上等你都可以使用这个面向对象的这个概念,比如说微服务其实就是一个更大范围的面向对象的设计他把有独立的逻辑功能的数据结构,以及跟这些数据结构有关的这些代码封装成为了一个微服务。
那大家都不要直接访问我的数据,你要访问我的数据必须通过我的借口,你不能直接去去拿到我的数据表,虽然我的数据表明你的税表在同一个数据库里比如说我们今年的每年的课程都这样虽然大学表都在同一个数据库里,但是你不允许给拿我的表你必须要通过我的接口通过我的服务通过我提供的这个代码去拿到我给你的这个数据,跟你的数据这其实是一个更大层面上投的这个面向对象的设计这样设计的目的是什么呢,这样设计的目的就是为了把整个系统分开,把整个系统分开可以把整个系统切分成若干个系统,切分成若干个服务器那如果说哪一部分复杂大的话再把
它在横向扩展成为更多的关系,它不仅也能让我们的应用服务器切开。
我们刚才说了严格控制连表查询只能通过 api 来访问,其实它也可以切开数据库服务器大家注意一下,它是切开了数据库服务器也是每一个微服务可以拥有自己的数据库服务器因为它的数据就是只能通过我的 api 来访问数据库服务器,往往是我们系统的瓶颈你如果说只如果说只能用一个统一的数据库服务器的话,你不管前面的应用服务器开的再多最后大家都集中到一台数据,不服现在,所以严格控制连表查询就可以使得这些表被拆开成为不同的 dpm s 数据库服务器上的表,这样的话当负担大的时候,你其实就可以把整个数据库服务器按照微服务拆成若干个数据库服务器。
当然它差的是有极限的它不能像我们前面的微服务那样子,你可以横向扩展可以无限的这么扩展你这个扩展的数目就是你有多少个微服务,但能扩展出多少个数据库服务器。但至少来说,这样的一个设计虽然大家可能觉得在查表的时候会麻烦了很多,但是它是一个可以横向扩展的这样的一个设计,我们今年为了处理我们其实每年的这样,为了处理这个大负载的问题,我们在结构上头采用了这个微服务的这个体系结构,但对于我们听懂来说,权限系统来说它本身来说是一个微服务,所以说它只有第一个东西啊叫做权限服务。
这是第一个东西,这就提供了我们权限的所有的功能,包括权限的教权限的这些功能都在这个里头。那他要提供的第二个东西是一个价包,为什么他要提供一个价包。因为所有的服务都是要叫权限的就是所有的服务进来以后,他都要去检验一下那个脱粉检验一下,这个人是不是真的是这个商铺人。如果有必要的话去全年去的时候去查一下这个人是不是能操作这个,看这最后怎么设计,但无论是这些手什么东西都需要依赖于全线系统提供的这样的一个价包,嵌到每一个大家的服务里头去。大家的服务你都去,所以说这次还要提供的第二个东西,第三个东西他要做一个网关,就是我们直接说的可病情的网关,因为我们的这个权限的系统,是这样的原则上来说在所有大家的服务前面它是有个网关的这个网关接收客户端发过来的请求广关注的事情。就是两个一个是叫权限一个是写字字那如果说权限过去了,再把
这个请求转发给你们自己写的这些服务器。如果权限没过去他就把他拦住了,把他拦在外面了,这是我们的权限系统所要提供的这三个东西。
那这三个东西,是他的三个逻辑结构。我们在因为没有中间可以用组建图把这三个东西给他画出来组建图,其实很简单他最主要的元素就是组建,组建是这样的符号。就这个方这样组建那每个组件有一个名字,我们第一个主线叫做全线服务组件会提供一个接口,因为主线是为别人用的嘛是吧他会提供一个接口。通常通常大家认为接口,就是因特 face 但是因为没有在画这个组建图的时候其实你把接口想得更广泛一点。对于我们的权限服务来说它的这个接口是一个什么东西,是一个否则 api ,它不是一个英特 facebook 的 app 那通过这一组的 rep i 能去访问我们的这个权限的服务。权限的服务这是第一个主界那第二个主页是一个价包我们叫做权限的 a o p ,因为它是用 a o p 的方式嵌到大家的服务里去啊,a o p 的概念我们在之后讲 a o p 的这个概念引入的话会发现说它的嵌到大家的这个服务里头是悄悄的。这里完全感觉不到它的存在,它就进去了你不会掉下来一片的它全部拦在大家的所有的请求的前面。那它也是一个以价包的方式来存在的那引入的方式,它其实传统方就是你把这个价包import进去,但今年我们想把做的更加潮一点,我们打算加一个私服加一个 Maven私服,因为大家现在已经加到现在Maven的私服,所以我们打算嫁接一个 Maven,然后把这个大家公用的价包全部部署到发布到这个Maven上去,然后大家通过这个私服直接 depent把它写进来,然后把它引入到你们的工程中间,这个是这个价包的这个引入的方式。那这个价包会调到全线系统的这个接口,如果他要用到权限的健全的话,他会用到这个权限服务的这个接口。
那第三个这是一个网关,我们叫做 getway, get way是拦在所有的系统前面的,他是个独立的应用程序。这个独立的应用程序,那他同样会调到这个叫权限的这个接口,所有的请求经过他,他负责写字字教权限,然后如果权限过了他在转发给所有的其他的服务器。这是我们在权限系统的这个三个东西,这个东西就是我们说的组建这个符号,就是组建组建处理主要是两个东西一个是组建一个是接口然后一个组建应该实现了某个接口,然后其他组建应该会调通过这个接口来调用这个组建。这个是这个组建组所以画完了以后,大家对于组建的认识是什么,其实,这这个设计中间什么东西,是什么不重要,你关键是用这个东西去描述什么。那比如说我们在这里用这个组建这个概念去描述什么,描述我们一个微服务一个一个模块里头的若干个部分。我们这个权限的这个模块是一个模块,但是它最后这个模块最后做出来的东西不是一个模块就一个东西。大家可以看到我们在权限这个模块中间要做出三个都可以出来一个是一个微服务,这个是一个微服务一个假包还有一个应用程序。
这是我们这个模块要做的东西,不要认为我画的那个模块就是那做一个东西出来,我给你们其他的三个模块也不是只有一个东西的。你们要想说你们这个模块出来的是什么,当然你们其他的模块其实主要出的都是微服务,那关键是看你是不是这个模块需要给其他的模块提供一些基础的价包你觉得有必要的话。不是以微服务的方式让他通过接口来调试通过价包的方式嵌到别人的服务里去。你看你有没有必要提供这样的一个东西,那你就出这个价包,当然你们应该不会出这个独立的应用,全线模块中间的特案,所以说它会有这个东西,所以组建用来描述什么,组建就是描述说我们一个部分里头你最后要做出来的一些相对独立的东西。这些东西都是可以分开的都是可以分开的,他们之间是通过接口来相互关联到一起的,这两个是是是有相互关系的。因为他们通过接口关联到一起所以他们可以分开的,这是组建图。