![](https://img-blog.csdnimg.cn/20201216105413931.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
分布式电商
主要用来记录电商项目的架构,以及开发流程思想,并做下笔记。
杨林伟
像火箭科学家一样思考!
展开
-
122分布式电商项目 - 终章
用了将近一个月的时间,终于把分布式电商项目教程从零开始学完了。这一路走来,磕磕碰碰,遇到了很多问题都要自己去解决,没资源百度,百度不行就先记下来,日后理解。现在回头看,自己收获还是挺大的,起码对外面互联网的项目有了一个新的认识。自从学了这个项目,我不敢说学到了什么,精通了多少,起码拓宽了我的学习的视角,从多个角度去解决问题。很庆幸我坚持下来了!我把代码都上传到了Github了,有兴趣的同学可...原创 2019-07-23 14:31:38 · 459 阅读 · 4 评论 -
121分布式电商项目 - MySQL主从复制
原理mysql主(称master)从(称slave)复制的原理:master将数据改变记录到二进制日志(binary log)中,也即是配置文件log-bin指定的文件(这些记录叫做二进制日志事件,binary log events)slave将master的binary log events拷贝到它的中继日志(relay log)slave重做中继日志中的事件,将改变反映它自己的数据...原创 2019-07-23 14:02:17 · 446 阅读 · 0 评论 -
120分布式电商项目 - 读写分离(一主多从的实现)
很多实际使用场景下都是采用“一主多从”的架构的,所有我们现在对这种架构做支持,目前只需要修改DynamicDataSource即可。实现代码import java.lang.reflect.Field;import java.util.ArrayList;import java.util.List;import java.util.Map;import java.util.concu...原创 2019-07-23 13:52:24 · 545 阅读 · 0 评论 -
119分布式电商项目 - 读写分离(使用Spring基于应用层实现(二))
之前的实现我们是将通过方法名匹配,而不是使用事务策略中的定义,我们使用事务管理策略中的规则匹配。改进后的配置 <!-- 定义AOP切面处理器 --> <bean class="cn.itcast.usermanage.spring.DataSourceAspect" id="dataSourceAspect"> <!-- 指定事务策略 --> &l...原创 2019-07-23 11:07:10 · 373 阅读 · 0 评论 -
118分布式电商项目 - 读写分离(使用Spring基于应用层实现)
原理在进入Service之前,使用AOP来做出判断,是使用写库还是读库,判断依据可以根据方法名判断,比如说以query、find、get等开头的就走读库,其他的走写库。DynamicDataSourceimport org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;/** * 定义动态数据源,实现...原创 2019-07-23 10:59:24 · 431 阅读 · 0 评论 -
117分布式电商项目 - 读写分离(方案)
我们一般应用对数据库而言都是“读多写少”,也就说对数据库读取数据的压力比较大,有一个思路就是说采用数据库集群的方案。其中一个是主库,负责写入数据,我们称之为:写库;其它都是从库,负责读取数据,我们称之为:读库;那么,对我们的要求是:1、读库和写库的数据一致;2、写数据必须写到写库;3、读数据必须到读库;解决读写分离的方案有两种:应用层解决和中间件解决。应用层解决优点:1...原创 2019-07-23 10:16:04 · 542 阅读 · 0 评论 -
116分布式电商项目 - Redis集群(内存不足的问题)
如果redis服务器内存不够用,怎么办?Redis内存淘汰指的是用户存储的一些键被可以被Redis主动地从实例中删除,从而产生读miss的情况,那么Redis为什么要有这种功能?这就是我们需要探究的设计初衷。Redis最常见的两种应用场景为缓存和持久存储,首先要明确的一个问题是内存淘汰策略更适合于那种场景?是持久存储还是缓存?这个问题很显然的我就不回答了。假设我们有一个Redis服务器,服务器...原创 2019-07-22 17:55:14 · 1865 阅读 · 3 评论 -
115分布式电商项目 - Redis集群(故障转移)
1.故障机制1、集群中的每个节点都会定期的向其它节点发送PING命令,并且通过有没有收到回复判断目标节点是否下线;2、集群中每一秒就会随机选择5个节点,然后选择其中最久没有响应的节点放PING命令;3、如果一定时间内目标节点都没有响应,那么该节点就认为目标节点疑似下线;4、当集群中的节点超过半数认为该目标节点疑似下线,那么该节点就会被标记为下线;5、当集群中的任何一个节点下线,就会导致插...原创 2019-07-22 17:46:51 · 493 阅读 · 0 评论 -
114分布式电商项目 - Redis集群(节点增加删除)
新增集群节点再开启一个实例的端口为6382执行脚本:./redis-trib.rb add-node 192.168.56.102:6382 192.168.56.102:6379已经添加成功!查看集群信息:发现没有插槽数。接下来需要给6382这个服务分配插槽,将6379的一部分(1000个)插槽分配给6382:查看节点情况:删除集群节点想要删除集群节点中的某一个节...原创 2019-07-22 17:37:13 · 485 阅读 · 0 评论 -
113分布式电商项目 - Redis集群(插槽)
插槽的分配通过cluster nodes命令可以查看当前集群的信息:该信息反映出了集群中的每个节点的id、身份、连接数、插槽数等。当我们执行set abc 123命令时,redis是如何将数据保存到集群中的呢?执行步骤:接收命令set abc 123通过key(abc)计算出插槽值,然后根据插槽值找到对应的节点。(abc的插槽值为:7638)重定向到该节点执行命令整个Redis提...原创 2019-07-22 17:32:21 · 516 阅读 · 0 评论 -
112分布式电商项目 - Redis集群(创建)
即使有了主从复制,每个数据库都要保存整个集群中的所有数据,容易形成木桶效应。使用Jedis实现了分片集群,是由客户端控制哪些key数据保存到哪个数据库中,如果在水平扩容时就必须手动进行数据迁移,而且需要将整个集群停止服务,这样做非常不好的。Redis3.0版本的一大特性就是集群(Cluster),接下来将讲解Redis集群。1.架构(1)所有的redis节点彼此互联(PING-PONG机...原创 2019-07-22 17:23:38 · 598 阅读 · 0 评论 -
111分布式电商项目 - Redis集群(哨兵)
哨兵的作用就是对Redis的系统的运行情况的监控,它是一个独立进程。它的功能有2个:1、监控主数据库和从数据库是否运行正常;2、主数据出现故障后自动将从数据库转化为主数据库;原理单个哨兵的架构:多个哨兵的架构:多个哨兵,不仅同时监控主从数据库,而且哨兵之间互为监控。环境当前处于一主多从的环境中:配置哨兵启动哨兵进程首先需要创建哨兵配置文件:vim sentinel.co...原创 2019-07-22 17:12:50 · 497 阅读 · 0 评论 -
110分布式电商项目 - Redis集群(主从复制)
先回顾Redis3.0安装过程(可直接绕过不看)yum -y install cpp binutils glibc glibc-kernheaders glibc-common glibc-devel gcc make gcc-c++ libstdc++-devel tclmkdir -p /usr/local/src/rediscd /usr/local/src/rediswget h...原创 2019-07-22 17:01:46 · 535 阅读 · 0 评论 -
109分布式电商项目 - MySQL优化(服务器优化)
优化服务器硬件服务器的硬件性能直接决定着MySQL数据库的性能,硬件的性能瓶颈,直接决定MySQL数据库的运行速度和效率。需要从以下几个方面考虑:1、配置较大的内存。足够大的内存,是提高MySQL数据库性能的方法之一。内存的IO比硬盘快的多,可以增加系统的缓冲区容量,使数据在内存停留的时间更长,以减少磁盘的IO。2、配置高速磁盘,比如SSD。3、合理分配磁盘IO,把磁盘IO分散到多个设备...原创 2019-07-22 16:32:41 · 479 阅读 · 0 评论 -
108分布式电商项目 - MySQL优化(插入数据优化)
插入数据时,影响插入速度的主要是索引、唯一性校验、一次插入的数据条数等。插入数据的优化,不同的存储引擎优化手段不一样,在MySQL中常用的存储引擎有,MyISAM和InnoDB,两者的区别:http://www.cnblogs.com/panfeng412/archive/2011/08/16/2140364.htmMyISAM禁用索引对于非空表,插入记录时,MySQL会根据表的索引对...原创 2019-07-22 16:30:41 · 354 阅读 · 0 评论 -
107分布式电商项目 - MySQL优化(数据库结构优化)
一个好的数据库设计方案对于数据库的性能往往会起到事半功倍的效果。需要考虑数据冗余、查询和更新的速度、字段的数据类型是否合理等多方面的内容。将字段很多的表分解成多个表对于字段较多的表,如果有些字段的使用频率很低,可以将这些字段分离出来形成新表。因为当一个表的数据量很大时,会由于使用频率低的字段的存在而变慢。增加中间表对于需要经常联合查询的表,可以建立中间表以提高查询效率。通过建立中间表...原创 2019-07-22 16:22:11 · 385 阅读 · 0 评论 -
106分布式电商项目 - MySQL优化(查询优化)
EXPLAIN在MySQL中可以使用EXPLAIN查看SQL执行计划,用法:EXPLAIN SELECT * FROM tb_item下面对上面的查询结果进行说明:1. idSELECT识别符。这是SELECT查询序列号。这个不重要。2.select_type表示SELECT语句的类型,一般有以下几种值:SIMPLE表示简单查询,其中不包含连接查询和子查询。PRIMARY...原创 2019-07-22 16:11:07 · 507 阅读 · 0 评论 -
105分布式电商项目 - JVM调优(典型配置)
5附:舍得网的典型配置$JAVA_ARGS .= " -Dresin.home=$SERVER_ROOT -server -Xms6000M -Xmx6000M -Xmn500M -XX:PermSize=500M -XX:MaxPermSize=500M -XX:SurvivorRatio=65536 -XX:MaxTenuringThreshold=0 -Xnoclassg...原创 2019-07-22 15:36:49 · 363 阅读 · 0 评论 -
104分布式电商项目 - JVM调优(性能问题)
性能症状XX省一个正式上线运行的系统,每运行一段时间后程序进程会莫名其妙地被kill掉,不得不手工启动系统。监控结果jmap命令查看堆内存分配和使用情况/jmap -heap 31 //31为程序的进程号Attaching to process ID 31, please wait...Debugger attached successfully.Server compiler...原创 2019-07-22 15:35:41 · 393 阅读 · 0 评论 -
103分布式电商项目 - JVM调优(实战篇)
测试目的测试被测系统使用不同的垃圾回收方案时的性能表现;了解各种JVM参数在性能调优时的实际效果;对遴选出的最优方案进行8小时压力测试并记录测试结果;测试环境准备被测程序的运行的软硬件环境:D630 4G内存+T7250双核CPU+160G硬盘;操作系统:windowsXP SP3;IP:11.55.15.51;被测程序名称:XXX银行采购管理系统V1.1版;程序部署...原创 2019-07-22 15:25:41 · 612 阅读 · 0 评论 -
102分布式电商项目 - JVM调优(理论篇)
多功能养鱼塘-JVM内存大鱼塘O(可分配内存): JVM可以调度使用的总的内存数,这个数量受操作系统进程寻址范围、系统虚拟内存总数、系统物理内存总数、其他系统运行所占用的内存资源等因素的制约。小池塘A(堆内存): JVM运行时数据区域,它为类实例和数组分配的内存。堆可以是固定大小的也可以是可变大小的。其中 Heap = {Old + NEW = { Eden , from, to } }。小...原创 2019-07-22 14:50:24 · 457 阅读 · 0 评论 -
101分布式电商项目 - Tomcat性能优化(JVM调优)
适当调整Tomcat的运行JVM参数可以提升整体性能。Java栈Java栈是与每一个线程关联的,JVM在创建每一个线程的时候,会分配一定的栈空间给线程。它主要用来存储线程执行过程中的局部变量,方法的返回值,以及方法调用上下文。栈空间随着线程的终止而释放。Java堆Java中堆是由所有的线程共享的一块内存区域,堆用来保存各种JAVA对象,比如数组,线程对象等。Java堆的分区JVM堆一般...原创 2019-07-22 14:04:38 · 390 阅读 · 0 评论 -
100分布式电商项目 - Tomcat性能优化(禁用AJP连接器)
项目中一般使用Nginx+tomcat的架构, 所以用不着AJP协议,一般我们可以把AJP连接器禁用,这样有利于提高Tomcat的性能。在管理界面中看不到ajp了:补充知识:AJP(Apache JServer Protocol)AJPv13协议是面向包的。WEB服务器和Servlet容器通过TCP连接来交互;为了节省SOCKET创建的昂贵代价,WEB服务器会尝试维护一个永久TCP连接...原创 2019-07-22 13:50:35 · 2005 阅读 · 0 评论 -
99分布式电商项目 - Tomcat性能优化(NIO配置)
Connector是Tomcat接收请求的入口,每个Connector有自己专属的监听端口Connector有两种:TTP Connector和AJP Connector通用属性(高亮的是重点)标准实现(高亮的是重点)除了上面列出的常见的连接器属性,标准的HTTP连接器(BIO,NIO和APR/native)都支持以下属性。NIO的具体配置例如:...原创 2019-07-22 11:47:13 · 347 阅读 · 0 评论 -
98分布式电商项目 - Tomcat性能优化(使用线程池)
在tomcat中每一个用户请求都是一个线程,所以可以通过开启并使用线程池的方式来提高tomcat的性能。配置:参数说明:AttributeDescriptionthreadPriority (优先级)(int) The thread priority for threads in the executor, the default is 5 (the value ...原创 2019-07-22 11:33:15 · 721 阅读 · 0 评论 -
97分布式电商项目 - Tomcat性能优化(运行方式)
如果需要提高网站的并发能力,可以通过优化Tomcat的方式来优化。服务器所提供的CPU、内存、硬盘的性能对处理能力有决定的影响。到目前为止,关于tomcat还有一些知识还是没有接触过的,下面来讲解下。配置tomcat管理员账户在conf/ tomcat-users.xml下添加用户:<role rolename="manager"/><role rolename="ma...原创 2019-07-22 11:26:16 · 346 阅读 · 0 评论 -
96分布式电商项目 - 项目部署
系统架构图网络拓扑图服务器台数?并发量:2000–3000(接口)单元测试,集成测试测试服务器:1,svn+maven+Hudson+jekins (持续集成测试环境)2,git+maven+jekins+docker (持续集成测试环境)服务器规划Mysql:2台服务器(主,备)。【配置高可用】Solr:7台(3台Zookeeper,4台solrcloud)Redis:...原创 2019-07-22 10:46:53 · 601 阅读 · 0 评论 -
95分布式电商项目 - MongoDB 简介
什么是MongoDBMongoDB 是一个跨平台的,面向文档的数据库,是当前 NoSQL 数据库产品中最热门的一种。它介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富,最像关系数据库的产品。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。MongoDB 的官方网站地址是:http://www.mongodb.org/MongoD...原创 2019-07-22 10:07:38 · 981 阅读 · 0 评论 -
94分布式电商项目 - Maven Profile切换注册中心连接配置
首先集中配置注册中心(1)在 pinyougou-common 工程中 properties 下创建 dubbox.propertiesaddress=192.168.25.135:2181(2)Spring 目录下创建 spring 配置文件 applicationContext-dubbox.xml 配置如下:<dubbo:registry protocol="zookeepe...原创 2019-07-22 09:55:17 · 312 阅读 · 0 评论 -
93分布式电商项目 - Maven Profile切换数据库连接配置
如果在现在的项目中,需要切换数据库连接配置,使用Maven Profile来配置,可以按如下步骤来进行修改。(1)在 pinyougou-dao 工程中 src/main/resources 下创建 filter 文件夹(2)filter 文件夹下创建 db_dev.properties ,用于配置开发环境用到的数据库env.jdbc.driver=com.mysql.jdbc.Driver...原创 2019-07-22 09:47:29 · 400 阅读 · 0 评论 -
92分布式电商项目 - Maven Profile
在我们平常的 java 开发中,会经常使用到很多配制文件(xxx.properties,xxx.xml),而当我们在本地开发(dev),测试环境测试(test),线上生产使用(product)时,需要不停的去修改这些配制文件,次数一多,相当麻烦。现在,利用 maven 的 filter 和 profile 功能,我们可实现在编译阶段简单的指定一个参数就能切换配制,提高效率,还不容易出错.prof...原创 2019-07-22 09:36:44 · 398 阅读 · 0 评论 -
91分布式电商项目 - SpringTask任务调度框架Cron例子
0 0 10,14,16 * * ? 每天上午 10 点,下午 2 点,4 点0 0/30 9-17 * * ?朝九晚五工作时间内每半小时0 0 12 ? * WED表示每个星期三中午 12 点"0 0 12 * * ?" 每天中午 12 点触发"0 15 10 ? * *" 每天上午 10:15 触发"0 15 10 * * ?" 每天上午 10:15 触发"0 15 10 * * ...原创 2019-07-19 17:28:11 · 1118 阅读 · 0 评论 -
90分布式电商项目 - SpringTask任务调度框架
代码已上传至Github地址:https://github.com/ylw-github/Spring-Task-Demo.git在企业级应用中,经常会制定一些“计划任务”,即在某个时间点做某件事情,核心是以时间为关注点,即在一个特定的时间点,系统执行指定的一个操作。常见的任务调度框架有Quartz 和 SpringTask 等。具体的代码看下载的工程Cron表达式Cron 表达式是一个...原创 2019-07-19 17:26:07 · 525 阅读 · 0 评论 -
89分布式电商项目 -检测支付状态
当用户支付成功后跳转到成功页面当返回异常时跳转到错误页面实现思路:我们通过 HttpClient 工具类实现对远程支付接口的调用。接口链接:https://api.mch.weixin.qq.com/pay/orderquery具体参数参见“查询订单”API, 我们在 controller 方法中轮询调用查询订单(间隔 3 秒),当返回状态为 success 时,我们会在 cont...原创 2019-07-19 16:48:36 · 508 阅读 · 0 评论 -
88分布式电商项目 -微信支付二维码生成
需求分析与实现思路在支付页面上生成支付二维码,并显示订单号和金额用户拿出手机,打开微信扫描页面上的二维码,然后在微信中完成支付实现思路:我们通过 HttpClient 工具类实现对远程支付接口的调用。接口链接:https://api.mch.weixin.qq.com/pay/unifiedorder具体参数参见“统一下单”API, 构建参数发送给统一下单的 url ,返回的信息中有...原创 2019-07-19 16:23:21 · 809 阅读 · 0 评论 -
87分布式电商项目 -微信扫码支付申请
微信扫码支付是商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付的模式。该模式适用于 PC 网站支付、实体店单品或订单支付、媒体广告支付等场景。微信扫码支付申请第一步:注册公众号(类型须为:服务号)请根据营业执照类型选择以下主体注册:个体工商户| 企业/公司| 政府| 媒体| 其他类第二步:认证公众号公众号认证后才可申请微信支付,认证费:300 元/次。第三步:提交资...原创 2019-07-19 16:13:37 · 636 阅读 · 0 评论 -
86分布式电商项目 - 二维码
什么是二维码二维码又称 QR Code,QR 全称 Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的 Bar Code 条形码能存更多的信息,也能表示更多的数据类型。二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的;在代码编制上巧妙地利用构成计算机内部...原创 2019-07-19 15:58:18 · 342 阅读 · 0 评论 -
85分布式电商项目 - SpringMVC跨域请求
现在有个需求,需要从商品详细页点击“加入购物车”按钮,将当前商品加入购物车,并跳转到购物车页面。但是这里涉及到了跨域请求的问题, 那么什么是跨域呢?这里说的 js 跨域是指通过 js 在不同的域之间进行数据传输或通信,比如用 ajax 向一不同的域请求数据,或者通过 js 获取页面中不同域的框架中(iframe)的数据。只要协议、域名、端口有任何一个不同,都被当作是不同的域。下面举个例子:修...原创 2019-07-19 15:28:47 · 418 阅读 · 0 评论 -
84分布式电商项目 - Redis存储购物车
判断当前用户是否登陆,如果未登录采用 Cookie 存储,如果登录则采用 Redis 存储。登录后要进行 Cookie 购物车与 Redis 购物车的合并操作,并清除 Cookie 购物车。获取当前登录人账号spring-security.xml 更改配置:去掉<http pattern="/cart/*.do" security="none"></http>添...原创 2019-07-19 14:58:55 · 620 阅读 · 0 评论 -
83分布式电商项目 - Cookie存储购物车
使用 cookie 存储购物车数据。服务层负责逻辑,控制层负责读写 cookie 。服务接口层public interface CartService { /** * 需求:添加购物车数据 * @param cartList * @param itemId * @param num * @return PygResult */ List<Cart> a...原创 2019-07-19 14:33:05 · 403 阅读 · 2 评论