1.架构特点
2.Dubbox+SSM搭建分布式应用
3.搭建工程框架
什么是SOA系统架构? 它是一种支持面向服务的架构样式 表现层调用服务层 , 数据访问层去访问数据库
表现层调用服务层是多对多的关系, 下面的显示就是SOA的分布式架构,Dubbox就是SOA的解决方案
前后端组合编成, 表结构和架构分析
后端框架采用 String + SpringMVC + mybatis + Dubbox
前端采用 angularJS + Bootstrap
3.Dubbox框架
3.1 Dubbox简介 dubbo和dubbox是同一个东西
Dubbox 是一个分布式服务框架,其前身是阿里巴巴开源项目Dubbo ,被国内电商及互联网项目中使用,后期阿里巴巴停止了该项目的维护,当当网便在Dubbo基础上进行优化,并继续维护,为了与原有的Dubbo区分,故将其命名为Dubbox。
官方推荐使用Zookeepre当做注册中心
节点角色说明:
· Provider: 暴露服务的服务提供方。
· Consumer: 调用远程服务的服务消费方。
· Registry: 服务注册与发现的注册中心。
· Monitor: 统计服务的调用次调和调用时间的监控中心。
· Container: 服务运行容器。
调用关系说明:
· 0. 服务容器负责启动,加载,运行服务提供者。
· 1. 服务提供者在启动时,向注册中心注册自己提供的服务。
· 2. 服务消费者在启动时,向注册中心订阅自己所需的服务。
· 3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推
送变更数据给消费者。
· 4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,
如果调用失败,再选另一台调用。
· 5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计
数据到监控中心。
安装已经批准好的linux系统,JDK环境变量已经配置好了,还需要更改网络适配器,的配置NAT,我们使用集群主机的形式,桥接,和
更改网段,连接服务器
安装Zookeeper:ALT+P切换操作界面sftp
本镜像已经安装好的软件有JDK和品优购课程中涉及在线安装的软件如gcc 、 PCRE 、 zlib 、 OpenSSL等,学员挂载本镜像后,可以跳过课程中设置yum命令安装的部分。
Zookeeper 在Linux系统的安装
安装步骤:
本服务器的镜像版本为centos 6.5
用户名:root 密码 : itcast
第一步:安装 jdk(此步省略,我给大家提供的镜像已经安装好JDK)
第二步:把 zookeeper 的压缩包(资源\配套软件\dubbox\zookeeper-3.4.6.tar.gz)上传到 linux 系统。
第三步: 解压Zookeere配置文件 创建data文件存放目录
Zookeepre的配置工作已经完成,zookeepre的启动运行和停止操作查看
第三步:解压缩压缩包
tar -zxvf zookeeper-3.4.6.tar.gz |
第四步:进入 zookeeper-3.4.6 目录,创建 data 文件夹。
mkdir data |
第五步:进入conf目录 ,把 zoo_sample.cfg 改名为 zoo.cfg
cd conf mv zoo_sample.cfg zoo.cfg |
第六步:打开zoo.cfg , 修改 data 属性:dataDir=/root/zookeeper-3.4.6/data
3.2.3 Zookeeper 服务启动
进入bin目录,启动服务输入命令
./zkServer.sh start |
输出以下内容表示启动成功
关闭服务输入命令
./zkServer.sh stop |
输出以下提示信息
查看状态:
./zkServer.sh status |
如果启动状态,提示
如果未启动状态,提示:
配置离线约束(本地安装
http://code.alibabatech.com/schema/dubbo/dubbo.xsd
)
创建服务的提供者,和消费者 单模块测试开发
创建服务层
完成服务的服务方,出现来一些问题,就是@Service(import com.alibaba.dubbo.config.annotation.Service;)没有注入进来 是因为本地的maven仓库没有安装上,所造成的,项目起不来
@Reference(import com.alibaba.dubbo.config.annotation.Reference;)使用alibaba的引用,也叫远程注入
<!-- 当前的应用名称 ,工程名称 注册中心识别的名称 --> <dubbo:application name="dubboxdemo-service"/> <!-- 指定的注册中心的地址 --> <dubbo:registry address="zookeeper://192.168.25.128:2181"/> <!-- 连接的包名 --> <dubbo:annotation package="cn.itheima.demo.service.impl" /> |
WEB层只是用来调用服务者的服务,提供数据的传输
可以查看有多少台服务器,服务的提供者,和服务的消费者
工程结构与设计分析:
创建新的项目工程,父工程,引入版本依赖
<!-- 集中定义依赖版本号 --> <properties> <junit.version>4.12</junit.version> <spring.version>4.2.4.RELEASE</spring.version> <pagehelper.version>4.0.0</pagehelper.version> <servlet-api.version>2.5</servlet-api.version> <dubbo.version>2.8.4</dubbo.version> <zookeeper.version>3.4.7</zookeeper.version> <zkclient.version>0.1</zkclient.version> <mybatis.version>3.2.8</mybatis.version> <mybatis.spring.version>1.2.2</mybatis.spring.version> <mybatis.paginator.version>1.2.15</mybatis.paginator.version> <mysql.version>5.1.32</mysql.version> <druid.version>1.0.9</druid.version> <commons-fileupload.version>1.3.1</commons-fileupload.version> <freemarker.version>2.3.23</freemarker.version> <activemq.version>5.11.2</activemq.version> <security.version>3.2.3.RELEASE</security.version> <solrj.version>4.10.3</solrj.version> <ik.version>2012_u6</ik.version> </properties>
<!-- 引入Spring容器的依赖 --> <!-- 引入dubbo相关依赖 --> <!-- Mybatis --> <!-- MySql --> <!-- 连接池 --> <!-- 文件上传组件 --> <!-- 缓存jedis --> <!-- 身份验证 --> <!-- 排除log4j包冲突 --> <!-- solr客户端 --> <!-- java编译插件 --> dependencyManagement 锁定版本的标签 |
搭建框架
4.3.1父工程
创建Maven工程pinyougou-parent (POM) ,groupId 为com.pinyougou ,artifactId 为pinyougou-parent , 在pom.xml中添加锁定版本信息dependencyManagement与pluginManagement,详见“资源/配置文件/第一天搭建/父工程/pom.xml”。
通用工具类模块
创建通用工具类模块pinyougou-common
通用数据访问模块
创建通用数据访问模块pinyougou-dao .添加依赖Mybatis和pinyougou-pojo
创建父层,先建商家商品服务层,接口和实现类
项目基本架构搭建成功
服务层的启动端口
<!-- 20881访问dubbo所需要的端口 --><!-- 端口号不能重复,业务我们需要在同一台服务器上跑很多服务 --> <!--如果只需要跑一台服务的话就不需要写端口号,默认是20880,如果操作很多服务,就必须制定服务的端口号 --> <dubbo:protocol name="dubbo" port="20881"></dubbo:protocol> <!-- pinyougou-sellergoods-service:工程名 --> <dubbo:application name="pinyougou-sellergoods-service"/> <dubbo:registry address="zookeeper://192.168.25.128:2181"/><!--2181服务端提供的接口 --> <!-- 业务逻辑层扫描的包名 --> <dubbo:annotation package="com.pinyougou.sellergoods.service.impl" /> 服务层搭建成功,需要依赖于接口和pojo的项目的依赖 |
实体类与数据访问层模块
4.4.1 生成代码
利用反向工程generatorSqlmapCustom实现实体类与数据访问层代码的自动生成
4.4.2 拷贝代码
将com.pinyougou.pojo包拷贝到pojo工程
将com.pinyougou.mapper包和resouce下的com.pinyougou.mapper文件夹拷贝到dao工程
实体类需要实现序列化接口,页面它要在网络中传送数据,本地就不需要
服务层需要依赖pojo实体类 dao层Mapper接口文件 还有Interface接口,,我们要把控制层写在manager-web工程中,品牌后台管理是在运营商里面进行管理数据,品牌是运营商说了算,商家的权限只有增加商品的权限,
创建Controller控制层
5.4测试
启动pinyougou-sellergoods-service
启动pinyougou-manager-web
地址栏输入http://localhost:9101/brand/findAll.do
附录:常见错误
1.在注册中心找不到对应的服务
java.lang.IllegalStateException: Failed to check the status of the service com.pinyougou.sellergoods.service.BrandService. No provider available for the service com.pinyougou.sellergoods.service.BrandService from the url zookeeper://192.168.25.129:2181/com.alibaba.dubbo.registry.RegistryService?application=pinyougou-manager-web&dubbo=2.8.4&interface=com.pinyougou.sellergoods.service.BrandService&methods=update,get,delete,selectOptionList,add,getListByPage&pid=3980&revision=0.0.1-SNAPSHOT&side=consumer×tamp=1501146823396 to the consumer 172.16.17.14 use dubbo version 2.8.4 |
这种错误是服务层代码没有成功注册到注册中心导致,请检查一下你的服务层代码是否添加了@service注解,并且该注解的包一定是com.alibaba.dubbo.config.annotation包,不是org.springframework.stereotype.Service,这个地方极容易出错。另外还有一个原因就是你的服务层工程由于某些原因没有正常启动,也无法注册到注册中心里。
2.无法连接到注册中心
org.I0Itec.zkclient.exception.ZkTimeoutException: Unable to connect to zookeeper server within timeout: 5000org.I0Itec.zkclient.ZkClient.connect(ZkClient.java:876)org.I0Itec.zkclient.ZkClient.<init>(ZkClient.java:98)org.I0Itec.zkclient.ZkClient.<init>(ZkClient.java:92)org.I0Itec.zkclient.ZkClient.<init>(ZkClient.java:80) com.alibaba.dubbo.remoting.zookeeper.zkclient.ZkclientZookeeperClient.<init>(ZkclientZookeeperClient.java:26) |
请检查IP与端口是否填写正确,检查注册中心是否正常启动
第二天 前端框架AngularJS入门
1.1 AngularJS简介
AngularJS 诞生于2009年,由Misko Hevery 等人创建,后为Google所收购。是一款优秀的前端JS框架,已经被用于Google的多款产品当中。AngularJS有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、依赖注入等等。
1.2 AngularJS四大特征
1.2.1 MVC模式
Angular遵循软件工程的MVC模式,并鼓励展现,数据,和逻辑组件之间的松耦合.通过依赖注入(dependency injection),Angular为客户端的Web应用带来了传统服务端的服务,例如独立于视图的控制。 因此,后端减少了许多负担,产生了更轻的Web应用。
Model:数据,其实就是angular变量($scope.XX);
View: 数据的呈现,Html+Directive(指令);
Controller:操作数据,就是function,数据的增删改查;
1.2.2双向绑定
AngularJS是建立在这样的信念上的:即声明式编程应该用于构建用户界面以及编写软件构建,而指令式编程非常适合来表示业务逻辑。框架采用并扩展了传统HTML,通过双向的数据绑定来适应动态内容,双向的数据绑定允许模型和视图之间的自动同步。因此,AngularJS使得对DOM的操作不再重要并提升了可测试性。
1.2.3依赖注入
依赖注入(Dependency Injection,简称DI)是一种设计模式, 指某个对象依赖的其他对象无需手工创建,只需要“吼一嗓子”,则此对象在创建时,其依赖的对象由框架来自动创建并注入进来,其实就是最少知识法则;模块中所有的service和provider两类对象,都可以根据形参名称实现DI.
1.2.4模块化设计
高内聚低耦合法则
1)官方提供的模块 ng、ngRoute、ngAnimate
2)用户自定义的模块 angular.module('模块名',[ ])
AngularJS指令:
ng-add :加载AngularJS.min.js文件
ng-init="页面一加载.就会执行里面的内容" :初始化
ng-model
ng-controller :指定控制器
ng-click :事件,单机事件
ng-reoeat :循环集合数组数据
AngularJS入门小Demo.
<body class="hold-transition skin-red sidebar-mini" ng-app="pinyougou" ng-controller="brandController" ng-init="findAll()"> |
品牌列表的实现
<!-- 引入angularjs的文件 --> <script type="text/javascript" src="../plugins/angularjs/angular.min.js"></script> <script type="text/javascript"> var app=angular.module("pinyougou",[]); //控制器 app.controller("brandController",function($scope,$http){ //查询品牌了表数据 $scope.findAll=function(){ //请求Controller层方法的地址 $http.get("../brand/findAll.do").success( function(respnose){ //集合数据 $scope.list=respnose; } ); } }); </script> </head> <body class="hold-transition skin-red sidebar-mini" ng-app="pinyougou" ng-controller="brandController" ng.init="findAll()"> |
给商品列表数据进行分页:
后端给前端的数据:总记录数total和当前页的记录rows {total:100,rows:[]},可以创建Map集合来进行分页数据的传输
前端给后端的数据:当前也和每页的记录数
前端代码
3.3.1 HTML
在brand.html引入分页组件
<!-- 分页组件开始 --> <script src="../plugins/angularjs/pagination.js"></script> <link rel="stylesheet" href="../plugins/angularjs/pagination.css"> <!-- 分页组件结束 -->
//分页控件配置 |
规格管理项目
规格管理新增数据。新增规格选向 增加行的数据绑定
Spring Security框架入门
1.1 Spring Security简介
Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。
新建测试项目.引入依赖包
Spring Security代码拦截配置文件代码
点击登录,在配置文件中我们需要配置,登录成功的页面和错误的页面,来进行判断用户登录的信息是否正确
商品分类管理:分为三层分类,一级为顶级分类
select * from tb_item_cat where parent_id=0 商品分类的查询sql 根据parebt_id 查询子节点的下一级
查询等级
商品分类查询后台代码分析
/**
*
* @Title: findByParentId
* @Description: TODO(根据商品id查询商品分列列表)
* @param @param parentId
* @param @return 参数说明
* @return List<TbItemCat> 返回类型
* @throws
*/
@RequestMapping("/findByParentId")
public List<TbItemCat> findByParentId(Long parentId){
//调用service层访问数据层
return itemCatService.findByParentId(parentId);
}
/**
* 根据上级id查询分类列表
* @Title: findByParentId
* @Description: TODO(这里用一句话描述这个方法的作用)
* @param @param parentId
* @param @return 参数说明
* @return List<TbItemCat> 返回类型
* @throws
*/
public List<TbItemCat> findByParentId(Long parentId);
/*
* 商品分类方法
* Title: findByParentId
* Description:
* @param parentId
* @return
* @see com.pinyougou.sellergoods.service.ItemCatService#findByParentId(java.lang.Long)
*/
@Override
public List<TbItemCat> findByParentId(Long parentId) {
TbItemCatExample example=new TbItemCatExample();
Criteria criteria = example.createCriteria();
criteria.andParentIdEqualTo(parentId);//根据id查询上一级数据
return itemCatMapper.selectByExample(example);
}
//调用mapper层代码接口
List<TbItemCat> selectByExample(TbItemCatExample example);
//mybatis查询sql语句
<select id="selectByExample" resultMap="BaseResultMap" parameterType="com.pinyougou.pojo.TbItemCatExample" >
select
<if test="distinct" >
distinct
</if>
<include refid="Base_Column_List" />
from tb_item_cat
<if test="_parameter != null" >
<include refid="Example_Where_Clause" />
</if>
<if test="orderByClause != null" >
order by ${orderByClause}
</if>
</select>