一、互联网和传统项目的区别
传统项目 企业内部管理系统
OA 办公自动化系统
CRM 客户关系管理系统
ERP 企业资源计划
互联网项目
电商、旅游、出行、外卖、在线教育 ..
品优购
二、电商项目的介绍
高并发
解决方案:
分布式架构:从业务功能角度 不同的服务器做不同的事情
集群:从性能角度 多台服务器共同完成一件事
分布式和集群共同点:都需要多台服务器构建
负载均衡;从服务器性能
Nginx 反向代理、负载均衡
缓存
页面静态化
单体架构:
优势:项目构建简单、项目部署也简单
劣势:项目任意功能模块发生变化,整体项目都需要重新部署
高可用
主从服务器构建
主机 从机
海量数据
集群
数据存储服务器:mysql、redis、索引库
安全性要求高
springsecurity
常见电商模式介绍 B C
B2B2C 京东、天猫
B2C 唯品会
C2C 淘宝
O2O online offline 线上对线下 外卖 滴滴
三、项目介绍(大型B2B2C架构)
静态原型分析 :后台管理系统 运营商管理后台 商家管理后台
三个系统:
运营商管理后台:品优购公司员工使用
商家管理后台:商家使用
管理后台,主要做数据处理。
网站前台:广大网友
技术架构是:前后台分离 以json数据格式进行交互
后端框架;springmvc+spring+mybatis 使用分布式服务架构 dubbo
前端框架:angularjs+bootstrap
品优购电商项目中的表,没有建立主外键约束。
互联网项目,数据库表设计时,表与表之间的关系尽量简单,减少主外键约束。
四、dubbo介绍
1、简介
Dubbo是 [1] 阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 [2] Spring框架无缝集成。
Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现
2、Dubbox 致力于提供高性能和透明化的RPC 远程服务调用方案,以及 SOA服务治理
方案。简单的说,dubbox就是个服务框架,如果没有分布式的需求,其实是不需要用的,
只有在分布式的时候,才有 dubbox这样的分布式服务框架的需求,并且本质上是个服务调
用的东东,说白了就是个远程服务调用的分布式框架
节点角色说明:
Provider: 暴露服务的服务提供方。
Consumer: 调用远程服务的服务消费方。
Registry: 服务注册与发现的注册中心。
Monitor: 统计服务的调用次调和调用时间的监控中心。
Container: 服务运行容器。
调用关系说明:
0. 服务容器负责启动,加载,运行服务提供者。
1. 服务提供者在启动时,向注册中心注册自己提供的服务。
2. 服务消费者在启动时,向注册中心订阅自己所需的服务。
3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推
送变更数据给消费者。
4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,
如果调用失败,再选另一台调用。
5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计
数据到监控中心。
dubbo开始与电商项目,我们可以从电商项目的演变了解一下
1.单一应用框架(ORM)
2.垂直应用框架(MVC)
垂直应用架构解决了单一应用架构所面临的扩容问题,流量能够分散到各个子系统当中,且系统的体积可控,一定程度上降低了开发人员之间协同以及维护的成本,提升了开发效率。
缺点:但是在垂直架构中相同逻辑代码需要不断的复制,不能复用。
3、分布式应用架构(RPC)
当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心
4.流动计算架构(SOA)
随着服务化的进一步发展,服务越来越多,服务之间的调用和依赖关系也越来越复杂,诞生了面向服务的架构体系(SOA),也因此衍生出了一系列相应的技术,如对服务提供、服务调用、连接处理、通信协议、序列化方式、服务发现、服务路由、日志输出等行为进行封装的服务框架。
演变过程
分布式好处:1应对高并发访问 2系统解耦合(模块与模块之间的依赖关系降低)
dubbo框架 SOA面向服务编程
注册中心:管理或者治理服务。 存储服务信息:(service项目)服务所在服务器ip 端口号 服务名称 服务方法等
mysql redis
zookeeper:天然具有负载均衡的能力
简单介绍一下SOA面向服务编程思想:
面向服务的架构(SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种各样的系统中的服务可以以一种统一和通用的方式进行交互。
面向服务架构,它可以根据需求通过网络对松散耦合的粗粒度应用组件进行分布式部署、组合和使用。服务层是SOA的基础,可以直接被应用调用,从而有效控制系统中与软件代理交互的人为依赖性。
SOA是一种粗粒度、松耦合服务架构,服务之间通过简单、精确定义接口进行通讯,不涉及底层编程接口和通讯模型。SOA可以看作是B/S模型、XML(标准通用标记语言的子集)/Web Service技术之后的自然延伸。
五、工程搭建(简单代码)
Zookeeper(注册中心)
安装zookeeper
1.运行环境Linux(导入讲师准备好的);
2.上传zookeeper-3.4.6.tar.gz到Linux;
3.解压zookeeper-3.4.6.tar.gz:
tar -zxvf zookeeper-3.4.6.tar.gz
4.将解压后的文件夹移动到/usr/local目录下
mv zookeeper-3.4.6 /usr/local/src/
5.在zookeeper-3.4.6目录中创建data文件夹
cd /usr/local/src/zookeeper-3.4.6/
mkdir data
6.进入zookeeper-3.4.6/conf目录,将zoo_sample.cfg复制一份叫zoo.cfg
cd /usr/local/src/zookeeper-3.4.6/conf
cp zoo_sample.cfg zoo.cfg
7.修改修改zoo.cfg
vim zoo.cfg
进入编辑模式,修改属性:
dataDir=/usr/local/src/zookeeper-3.4.6/data
8.zookeeper常用操作
进入zookeeper命令目录
cd /usr/local/src/zookeeper-3.4.6/bin
启动zookeeper
./zkServer.sh start[./zkServer.sh start-foreground]
关闭zookeeper
./zkServer.sh stop
查看启动状态
./zkServer.sh status
重启zookeeper
./zkServer.sh restart
9.关闭防火墙
service iptables stop
安装管理中心(这里zookeeper和管理中心皆在同一个Linux)
1.解压资料中的 %省略%\dubbox-master.zip;
2.使用命令行进入解压后 %省略%\dubbox-master\dubbo-admin\ 目录下;
3.执行maven命令(可以配置环境变量,使maven命令可以在任意位置使用)
mvn package -Dmaven.skip.test=true
4.修改 %省略%\dubbox-master\dubbo-admin\target\dubbo-admin-2.8.4.war 文件名为 dubbo-admin.war;
5.上传 %省略%\dubbox-master\dubbo-admin\target\dubbo-admin.war 到Linux系统中 %TOMCAT_HOME\webapps\ 下;
6.启动Linux上tomcat服务;
7.在Windows浏览器上,访问 dubbo-admin 服务
ip:8080/dubbbo-admin(用户名和密码皆为root);
8.若管理中心和zookeeper不在同一台设备上,则需要修改 %省略%\dubbo-admin.war\WEB-INF\dubbo.properties 文件
dubbo.registry.address=zookeeper://Zookeeper所在IP地址:2181
品优购
项目搭建
准备数据库
执行资源中的 pinyougou.sql;
创建父项目: pinyougou-parent(pom)
添加依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.28</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.8.4</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<dependency>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.11.0.GA</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>com.github.miemiedev</groupId>
<artifactId>mybatis-paginator</artifactId>
<version>1.2.15</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.9</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
</dependency>
创建子模块: pinyougou-pojo(jar);
创建子模块: pinyougou-dao(jar)
添加依赖
<dependency>
<groupId>com.pinyougou</groupId>
<artifactId>pinyougou-pojo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
配置运行环境
\properties\db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://192.168.19.128:3306/pinyougoudb?characterEncoding=utf-8
jdbc.username=root
jdbc.password=root
\mybatis\mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<plugins>
<!-- 配置PageHelper -->
<plugin interceptor="com.github.pagehelper.PageHelper">
<!-- 设置数据库类型(取值: Oracle, Mysql, MariaDB, SQLite, Hsqldb, PostgreSQL) -->
<property name="dialect" value="mysql" />
</plugin>
</plugins>
</configuration>
\spring\applicationContext-dao.xml
<!-- 加载配置文件 -->
<context:property-placeholder location="classpath*:properties/*.properties" />
<!-- 数据库连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="maxActive" value="10" />
<property name="minIdle" value="5" />
</bean>
<!-- 让Spring管理SqlsessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 加载MyBatis的全局核心文件 -->
<property name="configLocation" value="classpath:mybatis/mybatis-config.xml" />
</bean>
<!-- 扫描Mapper(Dao)接口 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.pinyougou.mapper" />
</bean>
创建包: com.pinyougou.mapper;
创建子模块: pinyougou-common(jar);
创建子模块: pinyougou-sellergoods-interface(jar)
添加依赖
<dependency>
<groupId>com.pinyougou</groupId>
<artifactId>pinyougou-pojo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
创建子模块: pinyougou-sellergoods-service(war)
添加依赖
<dependency>
<groupId>com.pinyougou</groupId>
<artifactId>pinyougou-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.pinyougou</groupId>
<artifactId>pinyougou-dao</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.pinyougou</groupId>
<artifactId>pinyougou-sellergoods-interface</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
配置运行环境
web.xml
<!-- 加载配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring/applicationContext*.xml</param-value>
</context-param>
<!-- 注册ContextLoaderListener -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
\spring\applicationContext-service.xml
<!-- 发布Dobbo服务 -->
<dubbo:protocol name="dubbo" port="20881"></dubbo:protocol>
<dubbo:application name="pinyougou-sellergoods-service" />
<dubbo:registry address="zookeeper://192.168.19.128:2181" />
<dubbo:annotation package="com.pinyougou.sellergoods.service.impl" />
创建包: com.pinyougou.sellergoods.service.impl;
添加Tomcate插件
<build>
<plugins>
<!-- Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<path>/</path>
<port>9001</port>
</configuration>
</plugin>
</plugins>
</build>
创建子模块: pinyougou-manager-web
添加依赖
<dependency>
<groupId>com.pinyougou</groupId>
<artifactId>pinyougou-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.pinyougou</groupId>
<artifactId>pinyougou-sellergoods-interface</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
添加Tomcate插件
<build>
<plugins>
<!-- Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<path>/</path>
<port>9101</port>
</configuration>
</plugin>
</plugins>
</build>
搭建运行环境
web.xml
<!-- 解决post乱码 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 配置前端控制器 -->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
\spring\springmvc.xml
<!-- 配置MVC注解支持 -->
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes" value="application/json" />
<property name="features">
<array>
<value>WriteMapNullValue</value>
<value>WriteDateUseDateFormat</value>
</array>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<!-- 引用dubbo服务 -->
<dubbo:application name="pinyougou-manager-web" />
<dubbo:registry address="zookeeper://192.168.19.128:2181" />
<dubbo:annotation package="com.pinyougou.manager.controller" />
创建包: com.pinyougou.manager.controller;
创建子模块: pinyougou-shop-web(war)
添加依赖
<dependency>
<groupId>com.pinyougou</groupId>
<artifactId>pinyougou-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.pinyougou</groupId>
<artifactId>pinyougou-sellergoods-interface</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
添加Tomcate插件
<build>
<plugins>
<!-- Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<path>/</path>
<port>9102</port>
</configuration>
</plugin>
</plugins>
</build>
搭建运行环境
web.xml
<!-- 解决post乱码 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 配置前端控制器 -->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
\spring\springmvc.xml
<!-- 配置MVC注解支持 -->
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes" value="application/json" />
<property name="features">
<array>
<value>WriteMapNullValue</value>
<value>WriteDateUseDateFormat</value>
</array>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<!-- 引用dubbo服务 -->
<dubbo:application name="pinyougou-shop-web" />
<dubbo:registry address="zookeeper://192.168.19.128:2181" />
<dubbo:annotation package="com.pinyougou.shop.controller" />
创建包: com.pinyougou.shop.controller;
品牌模块
品牌列表
Controller(pinyougou-manager-web)
@RestController
@RequestMapping("/brand")
public class BrandController {
@Reference
private IBrandService brandService;
@RequestMapping("/findAllBrand")
public List<TbBrand> findAllBrand() {
return brandService.findAllBrand();
}
}
Service层
接口(pinyougou-sellergoods-interface)
public interface IBrandService {
List<TbBrand> findAllBrand();
}
实现(pinyougou-sellergoods-service)
@Service
public class BrandServiceImpl implements IBrandService {
@Autowired
private TbBrandMapper brandMapper;
@Override
public List<TbBrand> findAllBrand() {
return brandMapper.selectAllBrand();
}
}
Dao层
接口(pinyougou-dao)
public interface TbBrandMapper {
List<TbBrand> selectAllBrand();
}
Mapper
<mapper namespace="com.pinyougou.mapper.TbBrandMapper">
<select id="selectAllBrand" resultType="com.pinyougou.pojo.TbBrand">
select * from tb_brand
</select>
</mapper>