电商系统开发之分布式框架-Dubbox

   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中添加锁定版本信息dependencyManagementpluginManagement,详见“资源/配置文件/第一天搭建/父工程/pom.xml”。

通用工具类模块

创建通用工具类模块pinyougou-common

通用数据访问模块

创建通用数据访问模块pinyougou-dao .添加依赖Mybatispinyougou-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">

<!-- 分页组件结束 -->

 

//分页控件配置
            $scope.paginationConf = {
                     currentPage: 1,//当前页
                     totalItems: 10,//总记录数
                     itemsPerPage: 10,//每页的记录数
                     perPageOptions: [10, 20, 30, 40, 50],//分页的选项
                     onChange: function(){//修改页面自动触发方法,刷新数据
                         $scope.reloadList();
                     }
            };
            //重新加载列表 数据
            $scope.reloadList=function(){
                 //切换页码  
                $scope.findPage( $scope.paginationConf.currentPage, $scope.paginationConf.itemsPerPage);
            }
            /分页
            $scope.findPage=function(page,rows){    
                $http.get('../brand/findPage.do?page='+page+'&rows='+rows).success(
                        function(response){
                            $scope.list=response.rows;    
                            $scope.paginationConf.totalItems=response.total;//更新总记录数
                        }            
                );
            }

                                              规格管理项目

规格管理新增数据。新增规格选向    增加行的数据绑定

                                      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>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值