day1:
安排:
分布式:
按照功能点把系统拆分成独立的功能,单独为某一结点添加服务器.
例如:订单系统需要两台 而单点登录系统需要10台...
复制代码
SOA:
面向服务的架构 ,是把业务层和服务层拆分,而不是根据功能拆分
复制代码
后台工程搭建
用Maven搭建:
e3-parent:父工程,打包方式pom,管理jar包的程序员
| 项目中所有工厂都应该继承父工程.
|-e3-common:通用的工具类通用的pojo,打包方式jar
|-e3-manager:服务层工程.聚合工程,Pom工程
|-e3-manager-dao jar
|-e3-manager-pojo jar
|-e3-manager-interface jar
|-e3-manager-service jar
|-e3-manager-web 表现层工厂,打包方式war
**需要在manager的pom里面设置tomcat ,然后访问local:host:8080
复制代码
逆向工程创建表
mapper放到dao
pojo放到pojo
复制代码
ssm整合
1.dao层
mybatis的配置文件:SqlMapConfig.xml
不需要配置任何内容,需要有文件头,文件必须存在
applicationContext-dao.xml(spring配置文件)
mybatis整合spring,通过spring管理SqlSessionFactory mapper代理对象,需要mybatis
和spring 的整合包
2.service层:
applicationContext-service.xml:
所有的service实现类都放在spring容器中管理,并有spring管理事务
3.表现层
Springmvc框架,由springmvc管理controller
springmvc的三大组件
做法:在e3-manager-web下面recouces中创建
conf:db.properties
mybatis:SqlMapConfig.xml
spring:applicationContext-dao.xml 管理dao层数据
applicationContext-service.xml管理service层数据
applicationContext-trans.xml 管理trans层数据
整合测试
svn:建新库java-EE32
复制代码
问题存疑:
-
!!maven 的tomcat插件使用会报错!!
-
解决了一部分:在pom里面加了一个...true...
svn没学过
解决了的问题:
- 1.在interface里面建serviceImpl,但因为Intefface里面的pom中没配置spring的jar包,所以一直失败
day2:
- 单一应用架构 :当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。
- 垂直应用架构 : 当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。 此时,用于加速前端页面开发的 Web框架(MVC) 是关键。
- 分布式服务架构 : 当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。 此时,用于提高业务复用及整合的 分布式服务框架(RPC) 是关键。
- 流动计算架构 : 当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。 此时,用于提高机器利用率的 资源调度和治理中心(SOA) 是关键。
安排:把后台改成soa框架 dubbo 安装zookeeper
做了什么?
-
把工程改为soa框架
由于宜立方商城是基于soa的架构,表现层和服务层是不同的工程。所以要实现商品列表查询需要两个系统之间进行通信。
如何实现远程通信?
1、Webservice:效率不高基于soap协议。项目中不推荐使用。
2、使用restful形式的服务:http+json。很多项目中应用。如果服务太多,服务之间调用关系混乱,需要治疗服务。
3、使用dubbo。使用rpc协议进行远程调用,直接使用socket通信。传输效率高,并且可以统计出系统之间的调用关系、调用次数。
复制代码
-
Zookeeper:
- 可以作为集群的管理工具使用。
- 可以集中管理配置文件。
要先把zookeeper启动,然后开启linux中的tomcat,再然后开启eclipce中的manager manager-web 的clean tomcat7:run
开启pagehelper
1.先把pageHelper工程导进来
2.在manager-servic 中的sqlMapCOnfig中配置plugin
<plugin interceptor="com.github.pagehelper.PageHelper">
<!-- 设置数据库类型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库-->
<property name="dialect" value="mysql"/>
3.新建pageHelper类(test中)
在interface中的ItemService中定义EasyUIDataGridResult接口
在service 中的ItemService中实现类
表现层:在web中的COntroller中调用
复制代码
问题存疑:
对于dubbo不熟悉,需要了解
复制代码
DAY3
安排:
- 商品类目选择
- Nginx的介绍以及配置..
做了什么?
准备工作
先开虚拟机 开启zookeeper,然后启动manager ,manager-web cd zookeeper-3.4.6/bin ./zkServer.sh start
1. 商品类目选择
**实现层:**
- [ ] 先在common的pojo中建立EasyUITreeNode,id text state属性 get/set
- [ ] 然后在interface中声明ItemCatSerice接口
- [ ] 在service中建立ItemCatServiceImpl实现类继承上述接口
``` java
@Autowired
private TbItemCatMapper ItemCatMapper;
@Override
public List<EasyUITreeNode> getItemCatlist(long parentId) {
//根据parentId查询子节点列表
TbItemCatExample example=new TbItemCatExample();
Criteria criteria = example.createCriteria();
//设置查询条件
criteria.andParentIdEqualTo(parentId);
//执行查询
List<TbItemCat> list = ItemCatMapper.selectByExample(example);
//创建返回结果List
List<EasyUITreeNode> resultList=new ArrayList<>();
//把列表转换成EasyUITreeoce列表
for (TbItemCat tbItemCat : list) {
EasyUITreeNode node=new EasyUITreeNode();
//设置属性
node.setId(tbItemCat.getId());
node.setText(tbItemCat.getName());
node.setState(tbItemCat.getIsParent()?"closed":"open");
//添加到结果列表
resultList.add(node);
}
return resultList;
}
```
- [ ] 然后再service.xml中暴露服务 <dubbo:serviceinterface="cn.e3mall.service.ItemCatService" ref="itemCatServiceImpl" timeout="600000"/>
**表现层:**
- [ ] 在web中建立ItemCatController
``` java
-@Autowired
private ItemCatService itemCatService;
@RequestMapping("/item/cat/list")
@ResponseBody
public List<EasyUITreeNode> getItemCatList(
@RequestParam(name="id",defaultValue="0")Long parentId){
//调用服务查询节点列表
List<EasyUITreeNode> list = itemCatService.getItemCatlist(parentId);
return list;
```
- [ ] 然后在web的springmvc中引用dubbo服务
<dubbo:reference interface="cn.e3mall.service.ItemCatService" id="itemCatService" />
复制代码
2.Nginx: 是一款高性能的http服务器/反向代理服务器以及电子邮件代理服务器
- 做HTTP服务器
- 虚拟主机,可以实现在一台服务器虚拟出多个网站
- 反向代理,负载均衡
linux开启nginx:cd /usr/local/ 然后cd nginx 开启sbin/nginx 关闭 sbin/nginx -s quit 刷新 sbin/nginx -s reload 查询是否开启-aux|grep nginx 修改域名端口.. cd /usr/local/ cd nginx vim nginx.conf,在里面改域名和端口
反向代理: 我有两个网站天猫 淘宝,只有一个公用ip,为了节约成本,一个域名只能绑定一个ip 然后两个分别部署到两个tomcat中,然后服务端到nginx中,由它来决定到哪个服务器 通过一个nginx作为入口,根据不同的请求转发到不同的地方
负载均衡: 在upstream中加一个server ip地址:端口号; 两台服务器用同一个网址时一人一次 (例如访问www.sina.com时index.html每人一次,如果IAOweight则是按权重分配) 实现高可用:(了解)
问题存疑:
- 对于nginx的主要作用不够了解,需复习
DAY4
安排:
- 图片上传(还未做) a.图片服务器FastDFS b.图片上传功能实现
- 富文本编辑器的使用KindEditor
- 商品添加功能完成
做了什么?
-
图片服务器的安装
- 存储空间可扩展
- 提供一个统一的访问方式
- 使用FastDFS,分布式文件系统,存储空间可以横向扩展,可以实现服务器的高可用,支持每个节点有备份机
首先得把虚拟机的网络编辑器改成192.168.25.0(然后可以改回来) 然后开启这个图片服务器,导入这个测试的工程,install后在web中加入这个工程作为jar包,然后在web中做一个测试方法即可(或者直接工具类) 然后192.168.25.133/group1/.....访问即可
-
kindEditor
返回格式(json)
-
图片上传功能实现
在pom.xml中把文件上传组件粘贴到web pom中 在controller中写程序代码,在springmvc里面扫描conf/recource.properties中的图片服务器ip地址 或者直接用
@Value("${IMAGE_SERVER_URL}") private String IMAGE_SERVER_URL; @RequestMapping(value="/pic/upload",produces=MediaType.TEXT_PLAIN_VALUE+";charset=utf-8") @ResponseBody public String uploadFile(MultipartFile uploadFile) { try { // 把图片上传导图片服务器 FastDFSClient fastDFSClient = new FastDFSClient("classpath:conf/client.conf"); //取文件扩展名 String originalString =uploadFile.getOriginalFilename(); String extName=originalString.substring(originalString.lastIndexOf(".")+1); // 得到一个图片的地址和文件名 String url=fastDFSClient.uploadFile(uploadFile.getBytes(), extName); // 补充为完整的url url=IMAGE_SERVER_URL+url; // 封装到map中返回 Map resultMap=new HashMap<>(); resultMap.put("error", 0); resultMap.put("url", url); return JsonUtils.objectToJson(resultMap); } catch (Exception e) { e.printStackTrace(); Map resultMap=new HashMap<>(); resultMap.put("error", 1); resultMap.put("message", "图片上传失败"); return JsonUtils.objectToJson(resultMap); } 复制代码
-
游览器兼容问题解决
-
富文本编辑器
-
商品添加功能实现
- 把e3Result放到common中,用来(响应结果)
- 注:因为要从service层传到表现层,所以要实现序列化接口
- 把IdUtils放到common中,用来生成id
- 在ItemService中加接声明E3Result addItem(TbItem item,String desc);
- 因为Tbitem中没有商品描述,所以要自己加上去 -在ItemServiceImpl加实现方法
@Autowired private TbItemDescMapper itemDescMapper; @Override public E3Result addItem(TbItem item, String desc) { //生成商品id long itemId=IDUtils.genItemId(); //补全item的属性 item.setId(itemId); //1-正常 2-下架 3-删除 item.setStatus((byte) 1); item.setCreated(new Date()); item.setUpdated(new Date()); //向商品表插入数据 itemMapper.insert(item); //创建一个商品描述表对应的pojo对象 TbItemDesc itemDesc=new TbItemDesc(); //补全属性 itemDesc.setItemId(itemId); itemDesc.setItemDesc(desc); itemDesc.setCreated(new Date()); itemDesc.setUpdated(new Date()); //向商品描述表插入数据 itemDescMapper.insert(itemDesc); //返回成功 return E3Result.ok(); 复制代码
- 在ItemController中加一个方法
@RequestMapping(value="/item/save",method=RequestMethod.POST) @ResponseBody public E3Result addItem(TbItem item,String desc) { E3Result result = itemService.addItem(item, desc); return result; } 复制代码
- 把e3Result放到common中,用来(响应结果)