大概學習完taotao商城後的總結和記錄。php
1、歸納css
taotao商城使用的是SSM技術,也就是持久層---MyBatis、業務層---Spring、表現層---SpringMVC。項目爲maven工程,使用分佈式結構,按照功能把系統拆分紅獨立的模塊。單獨爲某一個節點添加服務器,須要系統之間配合才能完成整個業務邏輯爲不一樣的模塊項目。每一個模塊的結構大體相同,表現層工程中(使用Controller標記)注入(Autowired)service,配置文件爲SpringMVC.xml。業務工程(使用Service標記)中實現接口(interface)模塊,注入mapper,其配置文件爲mybatis---SqlMapConfig.xml,properties---db.properties(數據庫相關),spring---(applicationContext-activemq.xml某些工程會用到)、applicationContext-dao.xml(掃描mapper包)、applicationContext-service.xml(Dubbo中暴露服務接口)、applicationContext-transaction.xml(事務管理、配置通知、配置切面)。數據庫(使用阿里的Druid鏈接池)對應的pojo類和mapper映射(dao)由逆向工程生成。(MVC實際上是表現層和業務層的功能組件,M屬於業務層,VC屬於表現層,其大部分用來處理表現層。)前端
【 SSM(Spring+SpringMVC+MyBatis)框架集由Spring、MyBatis兩個開源框架整合而成(SpringMVC是Spring中的部份內容)。 常做爲數據源較簡單的web項目的框架。nginx
分佈式架構:多個子系統相互協做才能完成業務流程。系統之間須要進行通訊。web
集羣:同一個工程部署到多臺服務器上(單臺服務器---節點)。redis
分佈式架構:spring
把系統按照模塊拆分紅多個子系統。sql
優勢:數據庫
缺點:json
一、系統之間交互須要使用遠程通訊,接口開發增長工做量。
二、各個模塊有一些通用的業務邏輯沒法共用。】
基於SOA架構,表現層和服務層是不一樣的工程。因此須要兩個系統之間的通訊。
每一個模塊的結構大體相同,表現層工程中(使用Controller標記)注入(Autowired)service,配置文件爲SpringMVC.xml。業務工程(使用Service標記)中實現接口(interface)模塊,注入mapper,其配置文件爲mybatis---SqlMapConfig.xml,properties---db.properties(數據庫相關),spring---(applicationContext-activemq.xml某些工程會用到)、applicationContext-dao.xml(掃描mapper包)、applicationContext-service.xml(Dubbo中暴露服務接口)、applicationContext-transaction.xml(事務管理、配置通知、配置切面)。(序列化的目的依賴爲了進行網絡傳輸,確保傳過去的字節流還能被反編譯找到對應的類,二來爲了方便本地硬盤存儲。)
【SOA:Service Oriented Architecture面向服務的架構。也就是把工程拆分紅服務層、表現層兩個工程。服務層中包含業務邏輯,只須要對外提供服務便可。表現層只須要處理和頁面的交互,業務邏輯都是調用服務層的服務來實現。
如何實現遠程通訊?
2、Dubbo
【系統間通訊】
(1)DUBBO是一個分佈式服務框架,致力於提供高性能和透明化的RPC遠程服務調用方案,是阿里巴巴SOA服務化治理方案的核心框架,天天爲2,000+個服務提供3,000,000,000+次訪問量支持,並被普遍應用於阿里巴巴集團的各成員站點。隨着互聯網的發展,網站應用的規模不斷擴大,常規的垂直應用架構已沒法應對,分佈式服務架構以及流動計算架構勢在必行,亟需一個治理系統確保架構有條不紊的演進。
Dubbo就是資源調度和治理中心的管理工具。
(2)Dubbo 就是相似於webservice的關於系統之間通訊的框架,並能夠統計和管理服務之間的調用狀況(包括服務被誰調用了,調用的次數是如何,以及服務的使用情況)。
節點角色說明:
(3)使用方法
Spring配置下
Dubbo採用全Spring配置方式,透明化接入應用,對應用沒有任何API侵入,只需用Spring加載Dubbo的配置便可,Dubbo基於Spring的Schema擴展進行加載。
單一工程中spring的配置local.xml
<bean id="xxxService" class="com.xxx.XxxServiceImpl" /> <bean id="xxxAction" class="com.xxx.XxxAction"> <property name="xxxService" ref="xxxService" /> </bean> |
遠程服務:
在本地服務的基礎上,只需作簡單配置,便可完成遠程化:
將上面的local.xml配置拆分紅兩份,將服務定義部分放在服務提供方remote-provider.xml,將服務引用部分放在服務消費方remote-consumer.xml。
並在提供方增長暴露服務配置<dubbo:service>,在消費方增長引用服務配置<dubbo:reference>。
服務層發佈服務:
<!-- 和本地服務同樣實現遠程服務 --> <bean id="xxxService" class="com.xxx.XxxServiceImpl" /> <!-- 增長暴露遠程服務配置 --> <dubbo:service interface="com.xxx.XxxService" ref="xxxService" /> |
表現層調用服務:
<!-- 增長引用遠程服務配置 --> <dubbo:reference id="xxxService" interface="com.xxx.XxxService" /> <!-- 和本地服務同樣使用遠程服務 --> <bean id="xxxAction" class="com.xxx.XxxAction"> <property name="xxxService" ref="xxxService" /> </bean> |
(4)註冊中心---zookeeper
【zookeeper作服務層的負載均衡】
zookeeper的介紹
zookeeper翻譯成動物園管理員,他是用來管hadoop(大象)、Hive(蜜蜂)、pig(小豬)的管理員,這些「動物」都是一些項目, Apache Hbase和 Apache Solr 的分佈式集羣都用到了zookeeper;Zookeeper:是一個分佈式的、開源的程序協調服務,是hadoop項目下的一個子項目
Zookeeper它有幾個特點功能:
1)集中式的配置信息(數據庫的屬性文件,放在zookeeper中,修改後不用重啓也能生效)
2)自動容錯
3)近實時搜索
4)查詢時自動負載均衡
集羣管理
在分佈式的集羣中,常常會因爲各類緣由,好比硬件故障,軟件故障,網絡問題,有些節點會進進出出。有新的節點加入進來,也有老的節點退出集羣。這個時候,集羣中其餘機器須要感知到這種變化,而後根據這種變化作出對應的決策。好比咱們是一個分佈式存儲系統,有一箇中央控制節點負責存儲的分配,當有新的存儲進來的時候咱們要根據如今集羣目前的狀態來分配存儲節點。這個時候咱們就須要動態感知到集羣目前的狀態。還有,好比一個分佈式的SOA架構中,服務是一個集羣提供的,當消費者訪問某個服務時,就須要採用某種機制發現如今有哪些節點能夠提供該服務(這也稱之爲服務發現,好比Alibaba開源的SOA框架Dubbo就採用了Zookeeper做爲服務發現的底層機制)。還有開源的Kafka隊列就採用了Zookeeper做爲Cosnumer的上下線管理。
註冊中心負責服務地址的註冊與查找,至關於目錄服務,服務提供者和消費者只在啓動時與註冊中心交互,註冊中心不轉發請求,壓力較小。使用dubbo-2.3.3以上版本,官方建議使用zookeeper做爲註冊中心。
Zookeeper是Apacahe Hadoop的子項目,是一個樹型的目錄服務,支持變動推送,適合做爲Dubbo服務的註冊中心,工業強度較高(穩定性好),可用於生產環境,並推薦使用。
【dubbo和zookeeper一塊兒管理服務層】
3、分頁插件---PageHelper
4、富文本編輯器
KindEditor
UEditor:百度編輯器
http://ueditor.baidu.com/website/
CKEditor
純js開發,跟後臺語言沒有關係。
第一步:在jsp中引入KindEditor的css和js代碼。
第二步:在表單中添加一個textarea控件。是一個富文本編輯器的載體。相似數據源。
第三步:初始化富文本編輯器。使用官方提供的方法初始化。
第四步:取富文本編輯器的內容。
表單提交以前,把富文本編輯器的內容同步到textarea控件中。
5、redis
【存儲首頁經常使用圖片、分類信息、用戶登錄信息並模擬session】
爲了解決高併發、高可擴展(集羣)、高可用(不能宕機)、大數據存儲問題而產生的數據庫解決方案,就是NoSql數據庫。
NoSql :全稱 not only sql ,非關係型數據庫。能夠做爲關係型數據庫的一個很好的補充。不能替代。
2. 什麼是redis
Redis是用C語言開發的一個開源的高性能鍵值對(key-value)數據庫(nosql),應用在緩存。它經過提供多種鍵值數據類型來適應不一樣場景下的存儲需求,目前爲止Redis支持的鍵值數據類型有5種。
以下:
字符串類型 (String) 、散列類型(hash)、列表類型(List)、集合類型(set)、有序集合類型(SortedSet)。
3. redis的應用場景
緩存。分佈式集羣架構中的session分離。任務隊列。(秒殺、搶購、12306等等)應用排行榜。(SortedSet)網站訪問統計。數據過時處理。(expire)
4. Redis持久化方案
Redis 數據都放在內存中。若是機器掛掉,內存的數據就不存在。
須要作持久化,講內存中的數據保存在磁盤,下一次啓動的時候就能夠恢復數據到內存中。
1.RDB (默認開啓) 快照形式 (按期將當前時刻的數據保存磁盤中)會產生一個dump.rdb文件
特色:會存在數據丟失,性能較好,數據備份。
2.AOF append only file (全部對redis的操做命令記錄在aof文件中),恢復數據,從新執行一遍便可。
特色:每秒保存,數據比較完整,耗費性能。
6、Solr
中文分析器(IKAnalyzer2012FF_u1.jar)、solrJ管理索引庫(使用SolrJ能夠實現索引庫的增刪改查操做)
(1)SolrCloud(solr 雲)是Solr提供的分佈式搜索方案,當你須要大規模,容錯,分佈式索引和檢索能力時使用 SolrCloud。當索引量很大,搜索請求併發很高,這時須要使用SolrCloud來知足這些需求。
SolrCloud是基於Solr和Zookeeper的分佈式搜索方案,它的主要思想是使用Zookeeper做爲集羣的配置信息中心。
7、ActiveMQ(消息隊列)
【項目使用:在修改商品後,須要自動更新索引庫。在修改商品處進行監聽,每當監聽到修改後,將消息發送給自動更新索引庫的項目】
(1)ActiveMQ 是Apache出品,最流行的,能力強勁的開源消息總線。ActiveMQ 是一個徹底支持JMS1.1和J2EE 1.4規範的 JMS Provider實現,儘管JMS規範出臺已是好久的事情了,可是JMS在當今的J2EE應用中間仍然扮演着特殊的地位。
主要特色:
1. 多種語言和協議編寫客戶端。語言: Java, C, C++, C#, Ruby, Perl, Python, PHP。應用協議: OpenWire,Stomp REST,WS Notification,XMPP,AMQP
2. 徹底支持JMS1.1和J2EE 1.4規範 (持久化,XA消息,事務)
3. 對Spring的支持,ActiveMQ能夠很容易內嵌到使用Spring的系統裏面去,並且也支持Spring2.0的特性
4. 經過了常見J2EE服務器(如 Geronimo,JBoss 4, GlassFish,WebLogic)的測試,其中經過JCA 1.5 resource adaptors的配置,可讓ActiveMQ能夠自動的部署到任何兼容J2EE 1.4 商業服務器上
5. 支持多種傳送協議:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA
6. 支持經過JDBC和journal提供高速的消息持久化
7. 從設計上保證了高性能的集羣,客戶端-服務器,點對點
8. 支持Ajax
9. 支持與Axis的整合
10. 能夠很容易得調用內嵌JMS provider,進行測試
(2)ActiveMQ的消息形式
對於消息的傳遞有兩種類型:
一種是點對點的(Queue),即一個生產者和一個消費者一一對應;
另外一種是發佈/訂閱模式(Topic),即一個生產者產生消息並進行發送後,能夠由多個消費者進行接收。
JMS定義了五種不一樣的消息正文格式,以及調用的消息類型,容許你發送並接收以一些不一樣形式的數據,提供現有消息格式的一些級別的兼容性。
· StreamMessage -- Java原始值的數據流
· MapMessage--一套名稱-值對
· TextMessage--一個字符串對象
· ObjectMessage--一個序列化的 Java對象
· BytesMessage--一個字節的數據流
8、freemarker
【ActiveMQ進行監聽,商品添加後,生成靜態頁面】
(1)網頁靜態化
什麼是靜態化?
經過一些技術手段(Freemarker/valocity)將動態的頁面(jsp,asp.net,php) 轉換成靜態的頁面,經過瀏覽器直接訪問靜態頁面。
爲何要靜態化?
經過瀏覽器直接訪問靜態的頁面,不須要通過程序處理,它的訪問速度高。
穩定性好。
更有效的防止安全漏洞問題,好比不易遭受黑客攻擊。
靜態的頁面更容易被搜索引擎收錄。
怎麼樣實現?
可使用freemarker實現網頁靜態化。
(2)FreeMarker是一個用Java語言編寫的模板引擎,它基於模板輸出文本。FreeMarker與Web容器無關,即在Web運行時,它並不知道Servlet或HTTP。它不只能夠用做表現層的實現技術,並且還能夠用於生成XML,JSP或Java 等。
9、Nginx
【keepalive使得nginx高可用、nginx對錶現層作負載均衡】
詳見Nginx文章https://blog.csdn.net/qq_34480270/article/details/85112360。
10、SSO系統
(1)SSO英文全稱Single Sign On,單點登陸。SSO是在多個應用系統中,用戶只須要登陸一次就能夠訪問全部相互信任的應用系統。它包括能夠將此次主要的登陸映射到其餘應用中用於同一個用戶的登陸的機制。它是目前比較流行的企業業務整合的解決方案之一。
(2)只用一個web工程時不用SSO就行。集羣環境下會出現要求用戶屢次登陸的狀況。
解決方案:
單點登陸系統是使用redis模擬Session,實現Session的統一管理,解決Session的共享問題.
傳遞數據時使用的Jsonp(Ajax跨域請求)。
11、MyCat
MyCat(能夠認爲是代理)是分佈式數據庫中間件,相似web服務器的Nginx。能夠實現分庫分表、讀寫分離、主備切換等功能。
(數據庫是對底層存儲文件的抽象,而Mycat是對數據庫的抽象。)
12、其餘性能提高方法
升級硬件、使用CDN。