電商專案day01(dubbo+ssm搭建分散式運用)
一、網際網路和傳統專案的區別
傳統專案 企業內部管理系統
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>