关于e3mall项目的实战

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
复制代码

问题存疑:

  • SOA:没学过.

  • !!maven 的tomcat插件使用会报错!!

  • 解决了一部分:在pom里面加了一个...true...

    svn没学过

解决了的问题:

  • 1.在interface里面建serviceImpl,但因为Intefface里面的pom中没配置spring的jar包,所以一直失败

day2:

  • 单一应用架构 :当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。
  • 垂直应用架构 : 当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。 此时,用于加速前端页面开发的 Web框架(MVC) 是关键。
  • 分布式服务架构 : 当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。 此时,用于提高业务复用及整合的 分布式服务框架(RPC) 是关键。
  • 流动计算架构 : 当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。 此时,用于提高机器利用率的 资源调度和治理中心(SOA) 是关键。

安排:把后台改成soa框架 dubbo 安装zookeeper

做了什么?

  1. 把工程改为soa框架

    由于宜立方商城是基于soa的架构,表现层和服务层是不同的工程。所以要实现商品列表查询需要两个系统之间进行通信。

如何实现远程通信?

1、Webservice:效率不高基于soap协议。项目中不推荐使用。
2、使用restful形式的服务:http+json。很多项目中应用。如果服务太多,服务之间调用关系混乱,需要治疗服务。
3、使用dubbo。使用rpc协议进行远程调用,直接使用socket通信。传输效率高,并且可以统计出系统之间的调用关系、调用次数。
复制代码
  1. 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
  • 商品添加功能完成

做了什么?

  1. 图片服务器的安装

    • 存储空间可扩展
    • 提供一个统一的访问方式
    • 使用FastDFS,分布式文件系统,存储空间可以横向扩展,可以实现服务器的高可用,支持每个节点有备份机

    首先得把虚拟机的网络编辑器改成192.168.25.0(然后可以改回来) 然后开启这个图片服务器,导入这个测试的工程,install后在web中加入这个工程作为jar包,然后在web中做一个测试方法即可(或者直接工具类) 然后192.168.25.133/group1/.....访问即可

  2. kindEditor

    返回格式(json)

  3. 图片上传功能实现

    在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);
    	}
    复制代码
  4. 游览器兼容问题解决

  5. 富文本编辑器

  6. 商品添加功能实现

    • 把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;
    }
    复制代码

问题存疑:

猜你喜欢

转载自blog.csdn.net/weixin_33749131/article/details/91396483
今日推荐