仿淘宝商城项目(分布式)
前言
暑假枯燥的生活令我乏味,学完了Java框架的我按捺不住,准备做一个项目练练手,巩固并提高对所学知识的理解及运用。
想了几天,也参考网上的推荐,很多都是××管理系统、OA系统、ERP等传统项目,但这些都激不起我的兴趣,因为最近对高级知识(高并发、分布式、人工智能)比较感兴趣。
无意间看到有人推荐电商项目,于是想到了淘宝。 在网上搜集大量资料,了解到要做一个淘宝商城并不简单,涉及到高并发、分布式等一些高级知识。
于是在网上找了相应的分布式Dubbo
这个淘宝项目基本涵盖了我所学习的所有知识和打算学的知识
我认为最好的学习方法就是用项目引导我们去学习,需要什么技术,我们就去学什么技术。这样可以很好的督促我们去学习。就比如之前我一直想学习分布式和高并发等相关知识,但是懒惰使我缺乏了激情。于是我苦苦寻找一个项目指引我进步,现在终于找到了,开干吧!!!
电商行业技术特点
微服务化是当前电商产品演化的必然趋势,与传统的项目相比,该行业技术要求相对较高,传统的项目1000高并发已经是上线了,但是在电商项目中,如淘宝,京东这样的。再举个例子,再淘宝双十一这天,如何满足高并发的需求和支付环节的安全都是难点。
- 技术新且范围广
- 分布式
- 高并发、集群、负载均衡、高可用
- 海量数据、业务复杂
- 系统安全(因为涉及支付及隐私等)
用到的技术
如果不了解某项技术,先去网上找相关资源学习该技术,掌握基础的知识及用法再继续干。
项目搭建及版本控制:maven及svn
数据库:MySql
Ssm框架
服务中间件:dubbo(阿里巴巴的开源框架)
架构分析
传统架构:
分布式架构
分布式架构:将系统分成多个子系统,子系统之间需要相互协同完成业务逻辑。
集群:同一个工程部署到多个服务器上
优点:
- 将模块拆分,子系统之间用接口调用,降低耦合度
- 把项目拆分成各个子项目,不同的团队负责不同的子项目
- 增加功能时只需要增加一个子项目,调用其他系统的接口即可
- 可以灵活的进行分布式部署
缺点: - 系统之间需要使用远程通信,接口开发增加了工作量
- 系统之间的相同的业务逻辑无法共用
搭建项目目录结构
一、maven工程目录结构
二、pom.xml文件的配置
三、在pom.xml文件中配置tomcat插件,用maven运行调试项目是否搭建成功
MySql数据库的建立
逆向工程生成Pojo及Mapper
使用Mybatis提供的逆向工程生成Pojo及Mapper的代码
Ssm框架的整合
在子项目taobao-manager中,最后只有taobao-manager-service打成war包部署在服务器上,所以dao层、interface、pojo都会打包成jar包放在taobao-manager-service中。因此我们在service层配置mybatis和spring相关属性
dubbo和zookeeper的搭建及使用
介绍
dubbo:
dubbo是一个分布式服务中间件、负责远程通信,类似于webservice。是为了满足分布式的需求,是因为分布式的需求,所以才有了dubbo这个远程服务调用的分布式的框架。
其核心部分包括:
- 远程通讯
- 集群容错
- 自动发现
dubbo的架构
zookeeper:
zookeeper 其实就是个管理员,监控 协调 所有需要同步的设备或进程
搭建
在CentOS 6.5下载openssh-server,方便使用secureCTR连接
命令:yum install openssh-server
查看和设置开机自动启动:chkconfig --list sshd chkconfig sshd on
启动openssh-server:service sshd start
在Linux系统上安装zookeeper
安装zookeeper之前需先安装jdk
执行这条命令:yum install java-1.8.0-openjdk* -y
无需配置环境变量,直接使用
①在线下载命令:
wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz
②解压命令
tar -zxvf zookeeper-3.4.10.tar.gz
②创建data目录,并更改配置文件名称和其内容
[root@localhost zookeeper-3.4.10]# mkdir data
[root@localhost conf]# mv zoo_sample.cfg zoo.cfg
the directory where the snapshot is stored.
do not use /tmp for storage, /tmp here is just
example sakes.
dataDir=/root/zookeeper-3.4.10/data
④启动和关闭zookeeper
可以配置环境变量
也可以在bin目录中用:
[root@localhost bin]# ./zkServer.sh start
[root@localhost bin]# ./zkServer.sh stop
在pom.xml文件中配置dubbo和zookeeper框架(记得把dubbo依赖引入的低版本spring框架exclusion,以免发生冲突)
使用
写一个Service测试是否搭建成功
在com.taobao.service包中写一个ItemService。
发布dubbo服务:
记得在pom.xml文件中引入Dao、Interface等依赖。
在applicationContext-service.xml中配置发布dubbo服务
①引入dubbo标签
②发布dubbo服务(service层)
<!--发布dubbo服务-->
<!--提供方应用信息,用于计算机依赖-->
<dubbo:application name="taobao-manager"/>
<!--注册中心的地址-->
<dubbo:registry protocol="zookeeper" address="192.168.65.132:2181"/>
<!--用dubbo协议在20880端口暴露服务-->
<dubbo:protocol name="dubbo" port="20880"/>
<!--声明需要暴露的服务接口
itemServiceImp会由包扫描器扫描后自动创建bean对象,所以可以直接使用-->
<dubbo:service interface="com.taobao.service.ItemService" ref="itemServiceImp"/>
引用dubo服务(web层)
-
pom.xml配置Dubbo相关jar包(记得排除低版本的spring依赖)和Interface依赖。
<dubbo:application name=“taobao-manager-web”/>
<dubbo:registry protocol=“zookeeper” address=“192.168.65.132:2181”/>
<dubbo:reference interface=“com.taobao.service.ItemService” id=“itemService”/>
测试dubbo服务
1、在Controller层写一个测试实例:@Controller
public class ItemController {
@Autowired
private ItemService itemService;
@RequestMapping("/item/{itemId}")
@ResponseBody
public TbItem getItemById(@PathVariable Long itemId){
TbItem tbItem=itemService.getItemById(itemId);
return tbItem;
}
}
2、用maven启动taobao-manager子项目和taobao-manager-web子项目
出现的问题:
问题一、Mapper.xml文件没有发布的问题:
maven不会自动扫描和Mapper.java文件放在一起的xml文件,可以放在Resource文件夹里面可以被自动扫描,但是我们习惯和Mapper.java放在一起。所以要在applicationContext.xml文件里面定义
问题二、zookeeper连接可能出现的问题:
- 缺少依赖包
com.alibaba.dubbo.remoting.zookeeper.curator.CuratorZookeeperTransporter.connect(CuratorZookeeperTransporter.java:26) - zookeeper没有开启:
at com.alibaba.dubbo.registry.support.FailbackRegistry.register - Linux系统防火墙没有关闭(防火墙端口设置)
防火墙端口关闭命令:chkconfig iptables off
问题三、POJO没有implements Serializable 出现的问题:
“持久化”意味着对象的“生存时间”并不取决于程序是否正在执行——它存在或“生存”于程序的每一次调用之间。通过序列化一个对象,将其写入磁盘,以后在程序再次调用时重新恢复那个对象,就能圆满实现一种“持久”效果。
- 远程方法调用(RMI)使本来存在于其他机器的对象可以表现出好象就在本地机器上的行为。将消息发给远程对象时,需要通过对象序列化来传输参数和返回值。
- 使用一个Java Bean 时,它的状态信息通常在设计期间配置好。程序启动以后,这种状态信息必须保存下来,以便程序启动以后恢复;具体工作由对象序列化完成。
问题四、dubbo-admin启动出现的问题:
Could not load [com.alibaba.dubbo.common.utils.NetUtils]
原因:dubbo-admin版本太低,jdk8不适用。考虑升级dubbo-admin的版本
问题五:@Autowired依赖注入失败的问题
严重: StandardWrapper.Throwable
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'itemController': Unsatisfied dependency expressed through field 'itemService'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'itemServiceImp': FactoryBean threw exception on object creation; nested exception is java.lang.NoClassDefFoundError: org/apache/curator/RetryPolicy
原因:可能是dubbo和spring初始化bean对象的顺序导致dubbo的bean对象没有初始化成功。也可能是因为dubbo支持低版本的spring,但是我换了低版本的依旧不行。最后查询了github官网上dubbo项目的issue,dubbo框架确实存在各种关于依赖注入,reference等问题都没有得到有效的解决方案。我进一步猜测应该是dubbo框架只是一个小组件,没有完全兼容现有的版本的Spring框架,然后dubbo官方也没有花精力去维护更新dubbo,所以导致各种问题没有得到有效解决。
未完待续。。。