39套Java架构师,高并发,高性能,高可用,分布式,集群,电商,缓存,微服务,微信支付宝支付,公众号开发,java8新特性,P2P金融项目,程序设计,功能设计,数据库设计,第三方支付,web安全,性能调优,设计模式,数据结构,并发编程,虚拟机,中间件,数据库,项目实战,大型分布式电商项目实战视频教程
视频课程包含:
39套包含:架构师,高并发,高性能,高可用,高可扩展,分布式,集群,电商,缓存,微服务,微信支付宝支付,公众号开发,java8新特性,P2P金融项目,程序设计,功能设计,数据库设计,架构设计,web安全,性能调优,设计模式,数据结构,项目实战,工作流,程序调优,负载均衡,Solr集群与应用,主从复制,中间件,全文检索,任务调度,jvm虚拟机,Spring boot,Spring cloud,Docker,Kubernetes,jvm,Dubbo,Elasticsearch,ActiveMQ,Rocketmq,Rabbitmq,Kafka,Mycat,Spring,Git,Nosql,Mecached,Netty,Nio,Mina,Nutch,Webservice,Activiti,Shiro,Tomcat,Mysql,Oracle,Quartz,ELK Stack,zookeeper,Activiti大型分布式电商实战等高端视频课程......
39套精品课程介绍:
1、39套精品是掌柜最近整理出的最新课程,都是当下最火的技术,最火的课程,也是全网课程的精品;
2、39套资源包含:全套完整高清视频、完整源码、配套文档;
3、知识也是需要投资的,有投入才会有产出(保证投入产出比是几百上千倍),如果有心的朋友会发现,身边投资知识的大都是技术经理或者项目经理,工资一般相对于不投资的也要高出很多;
概述:
淘淘商城是采用分布式架构部署的一个大型网上商城系统,类似于京东商城。本系统分前台系统和后台系统。前台系统主要负责商城的页面的显示功能,这里采用的面向服务的方式,pc端手机端只负责显示页面,业务逻辑都在服务层实现,客户端调用服务端接口来实现显示功能。
在前台系统中主要分为:客户端:系统前台页面显示系统(portal,8082)。服务端系统:(1)rest系统(8081):负责调用CMS系统的内容,将CMS系统的内容显示到页面,(这里的CMS内容管理系统,在后台实现)。(2)商品的搜索系统(8083),当在页面输入商品信息时,可以搜索商品。这里用到了solr技术,利用solr索引库来实现。(3)SSO(单点登陆系统,8084),因为商城采用分布式的系统部署,将整个系统划分为几个子系统,所以对于用户的访问权限是一个问题,如何实现一次登陆即其他系统都可以免登陆,sso可以解决。(4)订单系统(8085):商城购物少不了订单系统,所以将此作为一个独立工程编写。
后台系统功能:商城的后台系统主要是负责商品的分类,添加、规格参数。CMS系统(这里主要是广告的分类、添加)。
本系统前台界面设计采用的easyUI的设计,后台采用springMVC、spring、mybatis框架,擦用java语言编程。
步骤分析:
一、项目需求分析:模仿京东商城系统。
二、项目数据库设计:商品信息表、商品信息分类表、商品信息描述表、商品规格参数表、
CMS系统内容表、CMS系统内容分类表
用户表、订单表、订单的具体明细表
三、具体实现:
1、框架的搭建:
这里采用maven来管理整个项目。优势两点:1、maven可以以管理整个项目工程,方便热部署项目,项目发布方便。2、maven管理你jar包具有很大的优势,可以自动下载所需的jar包,只需定义好版本即可,其他maven自动下载。
因为这个项目比较大,子工程比较多,所以我们建立一个pom类型(聚合工程)parent来管理里所有jar包的版本,这样其他 子工程都依赖此工程。版本得到了统一,不会出现因版本问题导致的错误。其次建立一个专门的(jar类型)common工具类,可以将系统中使用到的工具类都加入此类,其他类也依赖此类,就可以使用这里面的工具了。此工具类也依赖parent类。
下面就是利用SSM框架来搭建工程了:利用框架搭建工程主要分两步:框架所依赖的jar包,框架的配置文件。弄清了这两点就好办了。框架主要分三层:dao层(mybatis)(主要是与数据库打交道)、service层(spring)(主要是负责调用dao层,实现业务逻辑的编写)、controller层(springMVC)(这里主要调用service层,根据jsp页面的内容,将jsp的内容传递到service层,然后讲数据显示到jsp页面)。所以这里的配置文件也就:mybatis的SqlMapConfig.xml (主要是它的插件配置,数据库配置放在dao)。spring将mybatis和springMVC整合起来的application_context_dao.xml(配置数据源,与数据库的连接),application_context_service.xml(将service的文件包引入工程)。application_context_transation.xml(这里将事务独立出来,主要是事务的配置)
SpringMVC.xml(主要是前端控制器,试图解析器的配置)
框架搭建完成后,利用mybatis的逆向工程生成各个表的mapper.xml和mapper.java文件、pojo文件。
2、具体的功能的实现逻辑
(1)后台系统功能实现
(这里主要讲商品的查询、添加、规格参数、CMS系统的分类、添加)
其实对于功能模块的分析主要有三点:
从哪个数据表获取(主要mapper实现);页面传递是否有参数,页面的url是什么(controller实现);返回值是什么(即页面展示的格式是什么样子的,这个根据jsp使用的框架来决定,比如这里的easyUI,可以查询它的api文档,找到其返回值类型);
A、商品的查询逻辑分析:其实对于商品的查询主要就是从数据库中将所有商品查询出来。这简单的查询很简单,可是在页面分页显示出来这就是一个问题了。这里到了mybatis的分页插件pageHelper来实现。
传入参数:Easyui页面默认有page、rows参数传递。
返回值:easyui的格式即datagrid的格式,专门编写一个对应的pojo类放入专门工具类中使用,返回格式即这个pojo。
逻辑:Dao层:Dao层用mybatis的逆向工程
Service调用mapper的查询和分页实现逻辑。
Controller即将参数传递过去,url写好
B、商品添加:商品添加即将商品信息写入数据库,页面传递的内容当点击提交按钮时直接写入数据库,只需补全没有的字段即可。
这里涉及到商品的类目选择、上面的图片上传、商品的描述信息。
类目选择首先得将类目展示出来,这里使用的异步树的格式。查询api发现异步树的返回值的格式。主要思路是:根据parentId来查询类目表,默认从0开始,异步树有个特点,就是每次获取到的id,如果有子节点,会发送url再次请求,如果没有子节点则不发送请求,所以可以都遍历到所有节点。(这个是tree的特点,自动请求)
异步树的特点:从最顶层开始读取,先读顶层节点,如果是闭合状态,发送请求给服务器读取子节点,子节点的状态依赖于父节点,当展开一个封闭的节点时,如果节点没有加载子节点,它将会把节点的id的值作为http请求参数并命名为id,通过url发送到服务器上检索子节点。所以遍历一次后,如果父节点还是父节点(即存在子节点)则检索下面的子节点的内容,将子节点的id作为parentId来检索下面的节点。如果不是父节点了,则打开下面列表。也就是说这些实现都是 异步树自动实现的,我们只需要判断父节点的状态即可,下面的检索根据这个状态进行。
图片上传功能:因为商城的图片非常多,所以我们将这么多的图片保存在图片服务器中,然后将图片在服务器中的具体url写入数据库,供前台调用。前台获取到这个url既可获取到这个图片。这里图片上传到服务器的功能:先生存图片的名称,然后生成图片保存的格式,然后利用ftpUtil将图片上传到服务器,返回一个url链接。
商品规格参数,这里采用的规格参数模板的形式。:
这里有两个表:一个模板表(根据商品的分类建立的模板,根据分类id),一个展示模板表(根据商品的信息写入模板表,根据商品id查询商品信息,然后写入对应订单模板中,然后生成HTML)。
商品的描述:这里采用文本的形式存储的,写入即可。富文本编辑器。
CMS分类:这里的格式也是用了异步树的格式,所以显示方法是一样的。
分类添加:像表中插入数据库即可。
(2)前台功能实现
首页大广告位的实现:这里是从CMS系统中获取广告位的图片,然后展示在页面。但是前台跟后台是不一样的端口,如何从前台访问后台呢,可以使用jsonp的形式。但是我们这里系统是采用面向服务的编程,所以采用rest接口的方式然后功能前台调用,这里用的httpcliet来调用接口。
商品搜索功能的实现:
首先在linux下部署好solr服务器,然后将数据库的表字段导入到solr索引库。然后编写search服务接口,然后供前台调用这个服务接口。
Rest功能:
商品详情页面展示:写三个服务:根据id查询商品的具体信息显示到页面,根据id查询商品的内容表,根据id查询商品的规格参数,即将三个信息展示到页面。然后前台分别调用。
SSO系统:这里涉及到拦截器。
这里是利用了sso的接口文档,即校验接口、注册、登录接口、根据token查询用户接口、安全退出接口。
这个的调用服务层是利用jsonp的形式访问的服务接口,实现跨域访问。客户端全部在jsp页面实现的。
具体流程:
当用户点击注册的时候,跳转到注册页面,即用户信息的保存功能。检验用户名是否存在、手机号和邮箱不能为空。
当用户点击登录按钮的时候,用户输入用户名和密码,检验用户名是否在数据库中存在,然后用户名密码是否正确。这里的密码是用了spring的MD5加密技术。当全部成功后,给用户颁发一个token令牌(利用uuid实现),然后将token存入到redis中(token的key是它生成的号,值是用户的名字),然后设置在redis的过期时间。这相当于用户的session。
然后将token写入cookie中,前台页面利用jsonp调用,根据cookie中的token的值,调用sso的根据token查询用户的服务,查看用户是否有效,如果有效则将用户返回前台页面,前台页面获取用户的用户名显示在首页,表示***已登陆。
这里的cookie是设置了共享域,即全部子系统都可以访问到cookie。
当用户登录其他子系统时,先从从cookie中获取token信息,根据token信息获取用户信息,判断用户信息是否有效,如果有效则放行,如果无效,则利用拦截器拦截跳转到登录页面。用户再次登录的时候刷新redis的时间,重新设置有效期。
拦截器的拦截,在springMVC.xml中设置拦截的名称。
购物车功能:
购物车功能注意到这里商品加入购物车,是将购物车保存在cookie中。这里用到cookieUtil工具来实现这些保存删除功能。在商品详情页面点击“加入购物车”按钮提交一个请求吧商品id传递给Controller,Controller接收id,Controller调用Service根据商品id查询商品基本信息,购物车的商品专门写一个pojo对象,因为商品的很多信息购物车里面用不到。将购物车的商品的pojo,把商品写入cookie中,加入cookie之前先从cookie中把购物车的商品取出来判断当前购物车商品列表中是否有此商品,如果有数量加一,如果没有添加一个商品,数量为1。展示给用户购物车列表。
订单系统:订单系统主要是订单的创建、查询、修改、删除功能。
订单系统因为pc端和移动端都需要调用此功能模块,所以将订单系统也单独作为一个服务接口供客户端调用。
订单服务接口也有接口文档,根据文档进行订单的创建。
订单的创建需要用户登录,这里用到了拦截器在springMVC中配置下拦截方式即可。
当用户拦截成功后,用户登录该商城,这时候注意将用户保存在request中,目的是因为查询订单的时候需要根据用户的id来查询,不同的用户具有不同的订单啊。
然后用request的get和setAttribute来获取值和设定值。为什么可以从request中取,因为我们整个商城都是http协议访问的。
(1)订单创建逻辑:
当点击去去购物车结算时,显示购物车的列表,当选中购物车的商品点击去结算的时候,显示商品的提交订单之前的一系列信息(也就是结算页):针对数据库三张表:订单基本信息表、订单明细表(购买的商品信息)、订单配送(收货人的地址电话信息)
传入参数:因为创建订单也就是向数据库中插入一系列的信息,而对应的是数据库中的三个表,所以根据页面的内容,传入的参数也就是三个pojo类,然后页面填写的+补全页面上在数据库中没有的字段。所以主要是对数据库中的三个表进行插入操作。服务接口是负责接收这三个pojo类,所以客户端要想办法将这三个pojo类传递过来。
根据接口文档,返回的是一个json格式的数据,即这三张表的数据是在一个json串中,所以这里要想办法将这三个表单独建立一个pojo来保存这个返回值。
接收的pojo类:
这里采用了这种方式巧妙的将三个表合并起来了。
接下来就是数据的插入操作了,这个在service层实现:逐个表的插入数据库即可,然后返回一个订单号即订单的id。
controller层传递的就是这个pojo类,然后返回给客户端。
客户端也是将这个pojo类传递给服务接口,返回一个订单号给客户端。提交订单的时候显示订单提交成功页面时候,看下jsp页面显示哪些字段,然后用model传递给页面。
(2)订单的分页查询:
前面我们将用户保存在了request中,然后获取到用户的id,根据用户的id来查询订单,前台页面默认传递page和rows,利用mybatis的分页查询来查询订单即可。
传入参数:page和rows
执行操作:根据用户id查询订单,根据page和rows分页
返回值:订单的列表信息,即用户的多个订单信息。根据接口文档,我们发现这个返回的信息就是数据中订单表的部分信息,所以用几个字段组成一个新的pojo来接收返回值。
(3)根据订单id查询订单:
根据订单id查询订单这个显示的信息就比较全面了,这个返回值跟之前的三个数据库的表对应,所以根据id,分别查询这三个表,来获取对应的信息。
传入参数:订单id
操作:三个表分别查询
返回值:之前新定义的三个表的Order的pojo类。
本文是学习大型分布式网站架构的技术总结。对架构一个高性能、高可用、可伸缩及可扩展的分布式网站进行了概要性描述,并给出一个架构参考。文中一部分为读书笔记,一部分是个人经验总结,对大型分布式网站架构有较好的参考价值。
烂皮猪,十余年工作经验,曾在Google等外企工作过几年,精通Java、分布式架构,微服务架构以及数据库,最近正在研究大数据以及区块链,希望能够突破到更高的境界
用户多,分布广泛
大流量,高并发
海量数据,服务高可用
安全环境恶劣,易受网络攻击
功能多,变更快,频繁发布
从小到大,渐进发展
以用户为中心
免费服务,付费体验
高性能:提供快速的访问体验。
高可用:网站服务一直可以正常访问。
可伸缩:通过硬件增加/减少,提高/降低处理能力。
安全性:提供网站安全访问和数据加密、安全存储等策略。
扩展性:方便地通过新增/移除方式,增加/减少新的功能/模块。
敏捷性:随需应变,快速响应;
分层:一般可分为应用层、服务层、数据层、管理层与分析层;
分割:一般按照业务/模块/功能特点进行划分,比如应用层分为首页、用户中心。
分布式:将应用分开部署(比如多台物理机),通过远程调用协同工作。
集群:一个应用/模块/功能部署多份(如:多台物理机),通过负载均衡共同提供对外访问。
缓存:将数据放在距离应用或用户最近的位置,加快访问速度。
异步:将同步的操作异步化。客户端发出请求,不等待服务端响应,等服务端处理完毕后,使用通知或轮询的方式告知请求方。一般指:请求——响应——通知模式。
冗余:增加副本,提高可用性、安全性与性能。
安全:对已知问题有有效的解决方案,对未知/潜在问题建立发现和防御机制。
自动化:将重复的、不需要人工参与的事情,通过工具的方式,使用机器完成。
敏捷性:积极接受需求变更,快速响应业务发展需求。
以用户为中心,提供快速的网页访问体验。主要参数有较短的响应时间、较大的并发处理能力、较高的吞吐量与稳定的性能参数。
可分为前端优化、应用层优化、代码层优化与存储层优化。
大型网站应该在任何时候都可以正常访问,正常提供对外服务。因为大型网站的复杂性,分布式,廉价服务器,开源数据库,操作系统等特点,要保证高可用是很困难的,也就是说网站的故障是不可避免的。
如何提高可用性,就是需要迫切解决的问题。首先,需要从架构级别考虑,在规划的时候,就考虑可用性。行业内一般用几个9表示可用性指标,比如四个9(99.99),一年内允许的不可用时间是53分钟。
不同层级使用的策略不同,一般采用冗余备份和失效转移解决高可用问题。
伸缩性是指在不改变原有架构设计的基础上,通过添加/减少硬件(服务器)的方式,提高/降低系统的处理能力。
可以方便地进行功能模块的新增/移除,提供代码/模块级别良好的可扩展性。
对已知问题有有效的解决方案,对未知/潜在问题建立发现和防御机制。对于安全问题,首先要提高安全意识,建立一个安全的有效机制,从政策层面,组织层面进行保障,比如服务器密码不能泄露,密码每月更新,并且三次内不能重复;每周安全扫描等。以制度化的方式,加强安全体系的建设。同时,需要注意与安全有关的各个环节。安全问题不容忽视,包括基础设施安全,应用系统安全,数据保密安全等。
常用的加解密算法(单项散列加密[MD5、SHA],对称加密[DES、3DES、RC]),非对称加密[RSA]等。
网站的架构设计,运维管理要适应变化,提供高伸缩性,高扩展性。方便的应对快速的业务发展,突增高流量访问等要求。
除上面介绍的架构要素外,还需要引入敏捷管理,敏捷开发的思想。使业务,产品,技术,运维统一起来,随需应变,快速响应。
以上采用七层逻辑架构,第一层客户层,第二层前端优化层,第三层应用层,第四层服务层,第五层数据存储层,第六层大数据存储层,第七层大数据处理层。
一个成熟的大型网站(如淘宝、天猫、腾讯等)的系统架构并不是一开始设计时就具备完整的高性能、高可用、高伸缩等特性的,它是随着用户量的增加,业务功能的扩展逐渐演变完善的,在这个过程中,开发模式、技术架构、设计思想也发生了很大的变化,就连技术人员也从几个人发展到一个部门甚至一条产品线。
所以成熟的系统架构是随着业务的扩展而逐步完善的,并不是一蹴而就;不同业务特征的系统,会有各自的侧重点,例如淘宝,要解决海量的商品信息的搜索、下单、支付;例如腾讯,要解决数亿用户的实时消息传输;百度它要处理海量的搜索请求。
他们都有各自的业务特性,系统架构也有所不同。尽管如此我们也可以从这些不同的网站背景中,找出其中共用的技术,这些技术和手段广泛运用在大型网站系统的架构中,下面就通过介绍大型网站系统的演化过程,来认识这些技术和手段。
架构技术是程序员绕不开的话题,在这里顺便给大家推荐一个架构技术交流群:650385180,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,相信对于已经工作和遇到技术瓶颈的码友,在这个群里会有你需要的内容。
最初的架构,应用程序、数据库、文件都部署在一台服务器上,如图:
随着业务的扩展,一台服务器已经不能满足性能需求,故将应用程序、数据库、文件各自部署在独立的服务器上,并且根据服务器的用途配置不同的硬件,达到最佳的性能效果。
在硬件优化性能的同时,同时也通过软件进行性能优化,在大部分的网站系统中,都会利用缓存技术改善系统的性能,使用缓存主要源于热点数据的存在,大部分网站访问都遵循28原则(即80%的访问请求,最终落在20%的数据上),所以我们可以对热点数据进行缓存,减少这些数据的访问路径,提高用户体验。
缓存实现常见的方式是本地缓存、分布式缓存。当然还有CDN、反向代理等,这个后面再讲。本地缓存,顾名思义是将数据缓存在应用服务器本地,可以存在内存中,也可以存在文件,OSCache就是常用的本地缓存组件。本地缓存的特点是速度快,但因为本地空间有限所以缓存数据量也有限。分布式缓存的特点是,可
以缓存海量的数据,并且扩展非常容易,在门户类网站中常常被使用,速度按理没有本地缓存快,常用的分布式缓存是Memcached、Redis。
应用服务器作为网站的入口,会承担大量的请求,我们往往通过应用服务器集群来分担请求数。应用服务器前面部署负载均衡服务器调度用户请求,根据分发策略将请求分发到多个应用服务器节点。
常用的负载均衡技术硬件的有F5,价格比较贵,软件的有LVS、Nginx、HAProxy。LVS是四层负载均衡,根据目标地址和端口选择内部服务器,Nginx和HAProxy是七层负载均衡,可以根据报文内容选择内部服务器,因此LVS分发路径优于Nginx和HAProxy,性能要高些,而Nginx和HAProxy则更具配置性,如可以用来做动静分离(根据请求报文特征,选择静态资源服务器还是应用服务器)。
随着用户量的增加,数据库成为最大的瓶颈,改善数据库性能常用的手段是进行读写分离以及分库分表,读写分离顾名思义就是将数据库分为读库和写库,通过主备功能实现数据同步。分库分表则分为水平切分和垂直切分,水平切分则是对一个数据库特大的表进行拆分,例如用户表。垂直切分则是根据业务的不同来切分,如用户业务、商品业务相关的表放在不同的数据库中。
假如我们的服务器都部署在成都的机房,对于四川的用户来说访问是较快的,而对于北京的用户访问是较慢的,这是由于四川和北京分别属于电信和联通的不同发达地区,北京用户访问需要通过互联路由器经过较长的路径才能访问到成都的服务器,返回路径也一样,所以数据传输时间比较长。对于这种情况,常常使用CDN解决,CDN将数据内容缓存到运营商的机房,用户访问时先从最近的运营商获取数据,这样大大减少了网络访问的路径。比较专业的CDN运营商有蓝汛、网宿。
而反向代理,则是部署在网站的机房,当用户请求达到时首先访问反向代理服务器,反向代理服务器将缓存的数据返回给用户,如果没有缓存数据才会继续访问应用服务器获取,这样做减少了获取数据的成本。反向代理有Squid、Nginx。
用户一天天增加,业务量越来越大,产生的文件越来越多,单台的文件服务器已经不能满足需求,这时就需要分布式文件系统的支撑。常用的分布式文件系统有GFS、HDFS、TFS。
对于海量数据的查询和分析,我们使用NoSQL数据库加上搜索引擎可以达到更好的性能。并不是所有的数据都要放在关系型数据中。常用的NoSQL有MongoDB、HBase、Redis,搜索引擎有Lucene、Solr、Elasticsearch。
随着业务进一步扩展,应用程序变得非常臃肿,这时我们需要将应用程序进行业务拆分,如百度分为新闻、网页、图片等业务。每个业务应用负责相对独立的业务运作。业务之间通过消息进行通信或者共享数据库来实现。
这时我们发现各个业务应用都会使用到一些基本的业务服务,例如用户服务、订单服务、支付服务、安全服务,这些服务是支撑各业务应用的基本要素。我们将这些服务抽取出来利用分部式服务框架搭建分布式服务。阿里的Dubbo是一个不错的选择。
1、电商案例的原因
分布式大型网站,目前看主要有几类:
大型门户一般是新闻类信息,可以使用CDN,静态化等方式优化,开心网等交互性比较多,可能会引入更多的NoSQL,分布式缓存,使用高性能的通信框架等。电商网站具备以上两类的特点,比如产品详情可以采用CDN,静态化,交互性高的需要采用NoSQL等技术。因此,我们采用电商网站作为案例,进行分析。
2、电商网站需求
客户需求:
客户就是客户,不会告诉你具体要什么,只会告诉你他想要什么,我们很多时候要引导,挖掘客户的需求。好在提供了明确的参考网站。因此,下一步要进行大量的分析,结合行业,以及参考网站,给客户提供方案。
需求功能矩阵
需求管理传统的做法,会使用用例图或模块图(需求列表)进行需求的描述。这样做常常忽视掉一个很重要的需求(非功能需求),因此推荐大家使用需求功能矩阵,进行需求描述。
本电商网站的需求矩阵如下:
3、网站初级架构
一般网站,刚开始的做法,是三台服务器,一台部署应用,一台部署数据库,一台部署NFS文件系统。
这是前几年比较传统的做法,之前见到一个网站10万多会员,垂直服装设计门户,N多图片。使用了一台服务器部署了应用,数据库以及图片存储。出现了很多性能问题。
如下图:
但是,目前主流的网站架构已经发生了翻天覆地的变化。一般都会采用集群的方式,进行高可用设计。至少是下面这个样子:
4、系统容量预估
预估步骤:
根据客户需求:3~5年用户数达到1000万注册用户,可以做每秒并发数预估:
没好好学数学后悔了吧?!(不知道以上算是否有错误,呵呵~~)
服务器预估:(以tomcat服务器举例)
按一台web服务器,支持每秒300个并发计算。平常需要10台服务器(约等于);[tomcat默认配置是150],高峰期需要30台服务器;
容量预估:70/90原则
系统CPU一般维持在70%左右的水平,高峰期达到90%的水平,是不浪费资源,并比较稳定的。内存,IO类似。
以上预估仅供参考,因为服务器配置,业务逻辑复杂度等都有影响。在此CPU,硬盘,网络等不再进行评估。
5、网站架构分析
根据以上预估,有几个问题:
架构技术是程序员绕不开的话题,在这里顺便给大家推荐一个架构技术交流群:650385180,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,相信对于已经工作和遇到技术瓶颈的码友,在这个群里会有你需要的内容。
大型网站一般需要做以下架构优化(优化是架构设计时,就要考虑的,一般从架构/代码级别解决,调优主要是简单参数的调整,比如JVM调优;如果调优涉及大量代码改造,就不是调优了,属于重构):
6、网站架构优化
6.1业务拆分
根据业务属性进行垂直切分,划分为产品子系统,购物子系统,支付子系统,评论子系统,客服子系统,接口子系统(对接如进销存,短信等外部系统)。
根据业务子系统进行等级定义,可分为核心系统和非核心系统。核心系统:产品子系统,购物子系统,支付子系统;非核心:评论子系统,客服子系统,接口子系统。
拆分后的架构图:
参考部署方案2
如上图每个应用单独部署,核心系统和非核心系统组合部署
6.2应用集群部署(分布式,集群,负载均衡)
集群部署后架构图:
6.3 多级缓存
缓存按照存放的位置一般可分为两类本地缓存和分布式缓存。本案例采用二级缓存的方式,进行缓存的设计。一级缓存为本地缓存,二级缓存为分布式缓存。(还有页面缓存,片段缓存等,那是更细粒度的划分)
一级缓存,缓存数据字典,和常用热点数据等基本不可变/有规则变化的信息,二级缓存缓存需要的所有缓存。当一级缓存过期或不可用时,访问二级缓存的数据。如果二级缓存也没有,则访问数据库。
缓存的比例,一般1:4,即可考虑使用缓存。(理论上是1:2即可)。
根据业务特性可使用以下缓存过期策略:
6.4单点登录(分布式Session)
系统分割为多个子系统,独立部署后,不可避免的会遇到会话管理的问题。一般可采用Session同步,Cookies,分布式Session方式。电商网站一般采用分布式Session实现。
再进一步可以根据分布式Session,建立完善的单点登录或账户管理系统。
流程说明
结合Cache中间件,实现的分布式Session,可以很好的模拟Session会话。
6.5数据库集群(读写分离,分库分表)
大型网站需要存储海量的数据,为达到海量数据存储,高可用,高性能一般采用冗余的方式进行系统设计。一般有两种方式读写分离和分库分表。
读写分离:一般解决读比例远大于写比例的场景,可采用一主一备,一主多备或多主多备方式。
本案例在业务拆分的基础上,结合分库分表和读写分离。如下图:
相关中间件可参考Cobar(阿里,目前已不在维护),TDDL(阿里),Atlas(奇虎360),MyCat。
分库分表后序列的问题,JOIN,事务的问题,会在分库分表主题分享中,介绍。
6.6服务化
将多个子系统公用的功能/模块,进行抽取,作为公用服务使用。比如本案例的会员子系统就可以抽取为公用的服务。
6.7消息队列
消息队列可以解决子系统/模块之间的耦合,实现异步,高可用,高性能的系统。是分布式系统的标准配置。本案例中,消息队列主要应用在购物,配送环节。
目前使用较多的MQ有Active MQ、Rabbit MQ、Zero MQ、MS MQ等,需要根据具体的业务场景进行选择。建议可以研究下Rabbit MQ。
6.8其他架构(技术)
除了以上介绍的业务拆分,应用集群,多级缓存,单点登录,数据库集群,服务化,消息队列外。还有CDN,反向代理,分布式文件系统,大数据处理等系统。
此处不详细介绍,大家可以问度娘/Google,有机会的话也可以分享给大家。
7、架构汇总
大型网站的架构是根据业务需求不断完善的,根据不同的业务特征会做特定的设计和考虑,本文只是讲述一个常规大型网站会涉及的一些技术和手段,希望能给大家带来启发。
近些年分布式框架很是火热,目前国内使用最多的框架是阿里的Dubbo体系架构,最近也有很多公司转型到Spring Cloud的怀抱,还有一部分选择自建分布式微服务架构。 本片博文主要讲述开发者使用自建的方式搭建微服务框架,主要目的是为了让开发者在底层实现上面更加详细的了解微服务原理。
本文以一个电商平台用自建分布式微服务架构为线索来讲解,代码中包含了自建微服务框架中众多核心模块代码:服务注册--服务发现--服务调用--服务隔离--服务熔断。详细代码已经上传gitHub了,地址:https://github.com/yun19830206/CloudShop-MicroService-Architecture 读者可以根据其公司不同业务形态,直接在此框架中修改适配,以便使用在自己的企业当中。下面详细介绍一下此电商平台的核心架构图、模块代码分析。
平台核心架构图
服务注册模块UML模型
服务发现模块UML模型
服务调用与隔离模块UML模型
GitHub中项目模块代码、构建情况介绍
以常见电商微服务为模型,本工程是自建微服务系统核心架构,利用Zookeeper做服务治理,用Hystrix做服务容错保护。 工程中业务代码没有编写,但是详细的框架代码都已经全部编写完成,况且有非常详细的注释与说明,并做框架做了各个层面的验证(有验证页面)
系统模块说明
cs_pojo:系统公用模型Model子工程
cs_core:核心系统子工程,完成服务注册、服务发现、服务调用容灾处理、各种核心功能提供
cs_gateway:系统统一对外Api接口调用工程
cs_order:订单业务系统
cs_product:商品业务系统
cs_user:会员业务系统
子工程启动项目地址(服务启动必须先启动Zookeeper服务,并且在微服务中填写正确微服务地址)
cs_gateway: http://localhost:9003/frameTest.html
cs_user: http://localhost:9000/index
cs_product: http://localhost:9001/index
cs_order: http://localhost:9002/index
模块引用关系说明
见
此分布式系统构建方法说明----服务注册--服务发现--服务调用--服务隔离 这四者的核心关系见visio图
此框架待验证的点
服务注册:如order服务做成集成的了,在不断的服务调用过程中,先后启动1-3个product(再停用1个服务),要能看到服务注册的结果变化。
服务依赖隔离:如order集群3个引用(再停用1个服务),分时段调用超时接口、异常接口、时好时坏接口,看是否能不影响业务主线程: 具体测试验证页面见:http://IP:Port/frameTest.html; 里面此框架详细的验证方法和理论,读者可以根据这些线索去理解接口、方法、思路
框架验证页面:http://IP:Port/frameTest.html; 具体验证的点有
一:查看服务注册结果,通过ServiceCall的方式获得的服务注册信息(ServiceDiscovery.serviceCacheBuilder()方式)
一:查看服务注册结果,查看服务注册结果(实时Zookeeper方式查看所有服务)
二: 监控服务器资源:包括堆内存信息、线程信息、各种GC信息
三: 轮训查看所有ServiceCall调用监控结果(GateWay为发起方)(每一次远程服务调用都会产生一个服务调用的结果)
四: 调试服务调用ServiceCall返回类型:正常,失败,超时,异常接口(注意看ServiceCall调用监控结果)(直接调用与Hystrix隔离调用两种)。注意这里的调试时重点难点
Hystrix使用的验证包括:服务隔离、失败(异常、超时)服务降级(执行fallBack)、熔断器打开、线程池满
一:服务隔离看《cloudshop-businessModel.vsd.Hystrix服务验证图》一页
二:失败(一个请求失败执行fallBack正常好验证)、异常(一个请求失败执行fallBack正常好验证)都比较好验证,也看一部分的图
三:熔断器打开(的标志是后续请求不执行run()方法,而直接执行fallBack()方法)看《cloudshop-businessModel.vsd.Hystrix服务验证图》一页
四:线程池满(的标志是后续请求不执行run()方法,而直接执行fallBack()方法)看《cloudshop-businessModel.vsd.Hystrix服务验证图》一页(有几项没有搞清楚)
Hystrix的hystrix-dashboard查看方式
一:必须要配置Hystrix Dashboard的Servlet,在Gateway项目web.xml中配置HystrixMetricsStreamServlet
二:解压启动tomcat压缩包(Hystrix查看Dashboard的官方项目)(apache-tomcat-8.0.36_hystrix-dashboard-7979.rar),输入网址:http://localhost:7979/
三:确保整个项目都已经启动正常运行了,并且调用了很多次HystrixCommand(多调用几种服务,成功、失败都多尝试几次)
四:打开Dashboard地址:http://localhost:7979/,然后依次填入"Stream Type: Hystrix","App path",Add Stream, Monitor Streams 就能看到官方监控结果,见《cloudshop-businessModel.vsd.Hystrix dashboard》:监控地址输入:http://localhost:9003/hystrix.stream
验证直接远程调用方式(NormalRestTemplateRPCServiceCallerImpl)与Hystrix服务隔离调用方式(HystrixRPCServiceCallerImpl),会把服务拖垮的情况发生