关于淘淘商城的一些基本说明
關(guān)于淘淘商城的一些基本說(shuō)明
1. maven
Maven的常見打包方式:jar、war、pom
Pom工程一般都是父工程,管理jar包的版本、maven插件的版本、統(tǒng)一的依賴管理。聚合工程。
jar包就是java的類進(jìn)行編譯生成的class文件打包成的壓縮包。里面就是一些class文件。當(dāng)我們自己使用maven寫一些java程序,進(jìn)行打包生成jar包。同時(shí)在可以在其他的工程下使用,但是我們?cè)谶@個(gè)工程依賴的jar包,在其他工程使用該jar包也要導(dǎo)入。JAR 文件不僅用于壓縮和發(fā)布,而且還用于部署和封裝庫(kù)、組件和插件程序,并可被像編譯器和 JVM 這樣的工具直接使用。
war包其實(shí)就是一個(gè)web程序進(jìn)行打包便于部署的壓縮包,里面包含我們web程序需要的一些東西,其中包括一些class文件,web.xml的配置文件,前端的頁(yè)面文件,以及依賴的jar!把war包放在tomcat目錄的webapp下,tomcat服務(wù)器在啟動(dòng)的時(shí)候自動(dòng)解壓war包編譯里面的代碼,所以當(dāng)文件很多的時(shí)候,tomcat的啟動(dòng)會(huì)很慢。一個(gè)war包可以理解為一個(gè)web項(xiàng)目,里面是項(xiàng)目的所有東西。
其中運(yùn)行一個(gè)maven工程(web工程)需要一個(gè)命令:tomat:run
例如:
Taotao-parent:父工程,打包方式pom,管理jar包的版本號(hào),項(xiàng)目中所有工程都應(yīng)該繼承父工程。|--Taotao-common:通用的工具類通用的pojo。打包方式j(luò)ar|--Taotao-manager:服務(wù)層工程。聚合工程。Pom工程 |--taotao-manager-dao:打包方式j(luò)ar|--taotao-manager-pojo:打包方式j(luò)ar|--taotao-manager-interface:打包方式j(luò)ar|--taotao-manager-service:打包方式:war|--taotao-manager-web:表現(xiàn)層工程。打包方式war步驟
apache官網(wǎng)maven下載
在ecplise下配置maven
點(diǎn)擊”Add”,進(jìn)入下面的頁(yè)面
然后在eclipse中配置倉(cāng)庫(kù)的位置
maven倉(cāng)庫(kù)地址、私服等配置信息需在setting.xml文件中配置,分為全局配置和用戶配置,在maven安裝目錄下的有 conf/setting.xml文件,此setting.xml文件用于maven的所有project項(xiàng)目,它作為maven的全局配置。如需要個(gè)性配置則需要在用戶配置中設(shè)置,用戶配置的setting.xml文件默認(rèn)的位置在: u s e r . d i r / . m 2 / s e t t i n g s . x m l 目 錄 中 , {user.dir} /.m2/settings.xml目錄中, user.dir/.m2/settings.xml目錄中,{user.dir} 指windows 中的用戶目錄。maven會(huì)先找用戶配置,如果找到則以用戶配置文件為準(zhǔn),否則使用全局配置文件。
maven的一些標(biāo)簽解釋
懶得寫了,可以在官方文檔上查 maven官方文檔
有位博主根據(jù)官方文檔總結(jié)的也不錯(cuò),可以去看看
https://blog.csdn.net/xupeng874395012/article/details/72921857
2.逆向工程
使用mybatis官方提供的mybatis-generator生成pojo、mapper接口及映射文件。
并且將pojo放到toatao-manager-pojo工程中。
將mapper接口及映射文件放到taotao-manager-dao工程中。
https://blog.csdn.net/qq_39056805/article/details/80585941
3. dubbo
Dubbo采用全Spring配置方式,透明化接入應(yīng)用,對(duì)應(yīng)用沒(méi)有任何API侵入,只需用Spring加載Dubbo的配置即可,Dubbo基于Spring的Schema擴(kuò)展進(jìn)行加載。
例如:
發(fā)布服務(wù): <!-- 和本地服務(wù)一樣實(shí)現(xiàn)遠(yuǎn)程服務(wù) --> <bean id="xxxService" class="com.xxx.XxxServiceImpl" /> <!-- 增加暴露遠(yuǎn)程服務(wù)配置 --> <dubbo:service interface="com.xxx.XxxService" ref="xxxService" />調(diào)用服務(wù): <!-- 增加引用遠(yuǎn)程服務(wù)配置 --> <dubbo:reference id="xxxService" interface="com.xxx.XxxService" /> <!-- 和本地服務(wù)一樣使用遠(yuǎn)程服務(wù) --> <bean id="xxxAction" class="com.xxx.XxxAction"><property name="xxxService" ref="xxxService" /> </bean>在服務(wù)提供方和服務(wù)消費(fèi)方的pom.xml中添加Dubbo依賴的jar包:
<!-- dubbo相關(guān) --><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><exclusions><exclusion><groupId>org.springframework</groupId><artifactId>spring</artifactId></exclusion><exclusion><groupId>org.jboss.netty</groupId><artifactId>netty</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId></dependency><dependency><groupId>com.github.sgroschupf</groupId><artifactId>zkclient</artifactId></dependency>在Spring的配置文件中添加Dubbo約束:
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd <!-- 使用dubbo發(fā)布服務(wù) --><!-- 提供方應(yīng)用信息,用于計(jì)算依賴關(guān)系 --><dubbo:application name="taotao-manager" /><dubbo:registry protocol="zookeeper"address="192.168.25.154:2181,192.168.25.154:2182,192.168.25.154:2183" /><!-- 用dubbo協(xié)議在20880端口暴露服務(wù) --><dubbo:protocol name="dubbo" port="20880" /><!-- 聲明需要暴露的服務(wù)接口 --><dubbo:service interface="com.taotao.service.ItemService" ref="itemServiceImpl" timeout="300000"/> <!-- 引用dubbo服務(wù) --><dubbo:application name="taotao-manager-web"/><dubbo:registry protocol="zookeeper" address="192.168.25.154:2181,192.168.25.154:2182,192.168.25.154:2183"/> <dubbo:reference interface="com.taotao.service.ItemService" id="itemService" />Dubbo的監(jiān)控中心。。
4. zookeeper
Zookeeper的安裝:
第一步:安裝jdk
第二步:解壓縮zookeeper壓縮包
第三步:將conf文件夾下zoo_sample.cfg復(fù)制一份,改名為zoo.cfg
第四步:修改配置dataDir屬性,指定一個(gè)真實(shí)目錄
第五步:
啟動(dòng)zookeeper:bin/zkServer.sh start
關(guān)閉zookeeper:bin/zkServer.sh stop
查看zookeeper狀態(tài):bin/zkServer.sh status
注意要關(guān)閉linux的防火墻。
5.圖片服務(wù)器FastDFS
分布式文件系統(tǒng)FastDFS(用來(lái)專門保存圖片)
使用FastDFS,分布式文件系統(tǒng)。存儲(chǔ)空間可以橫向擴(kuò)展,可以實(shí)現(xiàn)服務(wù)器的高可用。支持每個(gè)節(jié)點(diǎn)有備份機(jī)。
FastDFS是用c語(yǔ)言編寫的一款開源的分布式文件系統(tǒng)。FastDFS為互聯(lián)網(wǎng)量身定制,充分考慮了冗余備份、負(fù)載均衡、線性擴(kuò)容等機(jī)制,并注重高可用、高性能等指標(biāo),使用FastDFS很容易搭建一套高性能的文件服務(wù)器集群提供文件上傳、下載等服務(wù)。
FastDFS架構(gòu)包括 Tracker server和Storage server。客戶端請(qǐng)求Tracker server進(jìn)行文件上傳、下載,通過(guò)Tracker server調(diào)度最終由Storage server完成文件上傳和下載。 Tracker server作用是負(fù)載均衡和調(diào)度,通過(guò)Tracker server在文件上傳時(shí)可以根據(jù)一些策略找到Storage server提供文件上傳服務(wù)??梢詫racker稱為追蹤服務(wù)器或調(diào)度服務(wù)器。 Storage server作用是文件存儲(chǔ),客戶端上傳的文件最終存儲(chǔ)在Storage服務(wù)器上,Storage server沒(méi)有實(shí)現(xiàn)自己的文件系統(tǒng)而是利用操作系統(tǒng) 的文件系統(tǒng)來(lái)管理文件??梢詫torage稱為存儲(chǔ)服務(wù)器。
服務(wù)端兩個(gè)角色:Tracker:管理集群,tracker也可以實(shí)現(xiàn)集群。每個(gè)tracker節(jié)點(diǎn)地位平等。收集Storage集群的狀態(tài)。Storage:實(shí)際保存文件Storage分為多個(gè)組,每個(gè)組之間保存的文件是不同的。每個(gè)組內(nèi)部可以有多個(gè)成員,組成員內(nèi)部保存的內(nèi)容是一樣的,組成員的地位是一致的,沒(méi)有主從的概念。
客戶端上傳文件后存儲(chǔ)服務(wù)器將文件ID返回給客戶端,此文件ID用于以后訪問(wèn)該文件的索引信息。文件索引信息包括:組名,虛擬磁盤路徑,數(shù)據(jù)兩級(jí)目錄,文件名。
組名:文件上傳后所在的storage組名稱,在文件上傳成功后有storage服務(wù)器返回,需要客戶端自行保存。
虛擬磁盤路徑:storage配置的虛擬路徑,與磁盤選項(xiàng)store_path*對(duì)應(yīng)。如果配置了store_path0則是M00,如果配置了store_path1則是M01,以此類推。
數(shù)據(jù)兩級(jí)目錄:storage服務(wù)器在每個(gè)虛擬磁盤路徑下創(chuàng)建的兩級(jí)目錄,用于存儲(chǔ)數(shù)據(jù)文件。
文件名:與文件上傳時(shí)不同。是由存儲(chǔ)服務(wù)器根據(jù)特定信息生成,文件名包含:源存儲(chǔ)服務(wù)器IP地址、文件創(chuàng)建時(shí)間戳、文件大小、隨機(jī)數(shù)和文件拓展名等信息。
服務(wù)器安裝方法見5.1
6.redis的配置與redis集群的搭建
Redis是c語(yǔ)言開發(fā)的。
安裝redis需要c語(yǔ)言的編譯環(huán)境。如果沒(méi)有g(shù)cc需要在線安裝。yum install gcc-c++
安裝步驟:第一步:redis的源碼包上傳到linux系統(tǒng)。第二步:解壓縮redis。第三步:編譯。進(jìn)入redis源碼目錄。make 第四步:安裝。make install PREFIX=/usr/local/redisPREFIX參數(shù)指定redis的安裝目錄。一般軟件安裝到/usr目錄下
redis的啟動(dòng):
前端啟動(dòng):在redis的安裝目錄下直接啟動(dòng)redis-server
[root@localhost bin]# ./redis-server
后臺(tái)啟動(dòng):把/root/redis-3.0.0/redis.conf復(fù)制到/usr/local/redis/bin目錄下
[root@localhost redis-3.0.0]# cp redis.conf /usr/local/redis/bin/
修改配置文件:
[root@localhost bin]# ./redis-server redis.conf
查看redis進(jìn)程:
[root@localhost bin]# ps aux|grep redis
Redis-cli
[root@localhost bin]# ./redis-cli
默認(rèn)連接localhost運(yùn)行在6379端口的redis服務(wù)。
[root@localhost bin]# ./redis-cli -h 192.168.25.153 -p 6379
-h:連接的服務(wù)器的地址
-p:服務(wù)的端口號(hào)
關(guān)閉redis:[root@localhost bin]# ./redis-cli shutdown
Redis的持久化方案
Redis的所有數(shù)據(jù)都是保存到內(nèi)存中的。Rdb:快照形式,定期把內(nèi)存中當(dāng)前時(shí)刻的數(shù)據(jù)保存到磁盤。Redis默認(rèn)支持的持久化方案。aof形式:append only file。把所有對(duì)redis數(shù)據(jù)庫(kù)操作的命令,增刪改操作的命令。保存到文件中。數(shù)據(jù)庫(kù)恢復(fù)時(shí)把所有的命令執(zhí)行一遍即可。
兩種持久化方案同時(shí)開啟使用aof文件來(lái)恢復(fù)數(shù)據(jù)庫(kù)。
Jedis
需要把jedis依賴的jar包添加到工程中。Maven工程中需要把jedis的坐標(biāo)添加到依賴。 推薦添加到服務(wù)層。Taotao-content-Service工程中。
第一步:創(chuàng)建一個(gè)Jedis對(duì)象。需要指定服務(wù)端的ip及端口。
第二步:使用Jedis對(duì)象操作數(shù)據(jù)庫(kù),每個(gè)redis命令對(duì)應(yīng)一個(gè)方法。
第三步:打印結(jié)果。
第四步:關(guān)閉Jedis
第一步:創(chuàng)建一個(gè)JedisPool對(duì)象。需要指定服務(wù)端的ip及端口。
第二步:從JedisPool中獲得Jedis對(duì)象。
第三步:使用Jedis操作redis服務(wù)器。
第四步:操作完畢后關(guān)閉jedis對(duì)象,連接池回收資源。
第五步:關(guān)閉JedisPool對(duì)象。
第一步:使用JedisCluster對(duì)象。需要一個(gè)Set< HostAndPort>參數(shù)。Redis節(jié)點(diǎn)的列表。
第二步:直接使用JedisCluster對(duì)象操作redis。在系統(tǒng)中單例存在。
第三步:打印結(jié)果
第四步:系統(tǒng)關(guān)閉前,關(guān)閉JedisCluster對(duì)象。
添加緩存功能:
查詢內(nèi)容列表時(shí)添加緩存。
1、查詢數(shù)據(jù)庫(kù)之前先查詢緩存。
2、查詢到結(jié)果,直接響應(yīng)結(jié)果。
3、查詢不到,緩存中沒(méi)有需要查詢數(shù)據(jù)庫(kù)。
4、把查詢結(jié)果添加到緩存中。
5、返回結(jié)果。
向redis中添加緩存:
Key:cid
Value:內(nèi)容列表。需要把java對(duì)象轉(zhuǎn)換成json。
使用hash對(duì)key進(jìn)行歸類。
HASH_KEY:HASH
|–KEY:VALUE
|–KEY:VALUE
|–KEY:VALUE
|–KEY:VALUE
代碼的實(shí)現(xiàn):
@Overridepublic List<TbContent> getContentList(long cid) {//查詢緩存try { String json = jedisClient.hget(CONTENT_KEY, cid + ""); //判斷json是否為空 if (StringUtils.isNotBlank(json)) { //把json轉(zhuǎn)換成list List<TbContent> list = JsonUtils.jsonToList(json, TbContent.class); return list; } } catch (Exception e) { e.printStackTrace(); } //根據(jù)cid查詢內(nèi)容列表 TbContentExample example = new TbContentExample(); //設(shè)置查詢條件 Criteria criteria = example.createCriteria(); criteria.andCategoryIdEqualTo(cid); //執(zhí)行查詢 List<TbContent> list = contentMapper.selectByExample(example); //向緩存中添加數(shù)據(jù) try { jedisClient.hset(CONTENT_KEY, cid + "", JsonUtils.objectToJson(list)); } catch (Exception e) { e.printStackTrace(); } return list;}緩存同步:
對(duì)內(nèi)容信息做增刪改操作后只需要把對(duì)應(yīng)緩存刪除即可??梢愿鶕?jù)cid刪除。
7.solr服務(wù)器的搭建,solr集群與zookeeper集群的問(wèn)題
solr需要安裝JDK,需要安裝Tomcat
搭建步驟
第一步:把solr 的壓縮包上傳到Linux系統(tǒng)
第二步:解壓solr。
第三步:安裝Tomcat,解壓縮即可。
第四步:把solr部署到Tomcat下。
第五步:解壓縮war包。啟動(dòng)Tomcat解壓。
第六步:把/root/solr-4.10.3/example/lib/ext目錄下的所有的jar包,添加到solr工程中。[root@localhost ext]# pwd
/root/solr-4.10.3/example/lib/ext
[root@localhost ext]# cp * /usr/local/solr/tomcat/webapps/solr/WEB-INF/lib/
第七步:創(chuàng)建一個(gè)solrhome。/example/solr目錄就是一個(gè)solrhome。復(fù)制此目錄到/usr/local/solr/solrhome
[root@localhost example]# pwd
/root/solr-4.10.3/example
[root@localhost example]# cp -r solr /usr/local/solr/solrhome
[root@localhost example]#
第八步:關(guān)聯(lián)solr及solrhome。需要修改solr工程的web.xml文件。
第九步:啟動(dòng)Tomcat
http://192.168.25.154:8080/solr/
和windows下的配置完全一樣。
使用solrJ管理索引庫(kù)
添加文檔:
第一步:把solrJ的jar包添加到工程中。
第二步:創(chuàng)建一個(gè)SolrServer,使用HttpSolrServer創(chuàng)建對(duì)象。
第三步:創(chuàng)建一個(gè)文檔對(duì)象SolrInputDocument對(duì)象。
第四步:向文檔中添加域。必須有id域,域的名稱必須在schema.xml中定義。
第五步:把文檔添加到索引庫(kù)中。
第六步:提交。
刪除文檔:
第一步:創(chuàng)建一個(gè)SolrServer對(duì)象。
第二步:調(diào)用SolrServer對(duì)象的根據(jù)id刪除的方法。
第三步:提交。
查詢索引庫(kù):
第一步:創(chuàng)建一個(gè)SolrServer對(duì)象
第二步:創(chuàng)建一個(gè)SolrQuery對(duì)象。
第三步:向SolrQuery中添加查詢條件、過(guò)濾條件。。。
第四步:執(zhí)行查詢。得到一個(gè)Response對(duì)象。
第五步:取查詢結(jié)果。
第六步:遍歷結(jié)果并打印。
什么是SolrCloud:
SolrCloud(solr 云)是Solr提供的分布式搜索方案,當(dāng)你需要大規(guī)模,容錯(cuò),分布式索引和檢索能力時(shí)使用 SolrCloud。當(dāng)一個(gè)系統(tǒng)的索引數(shù)據(jù)量少的時(shí)候是不需要使用SolrCloud的,當(dāng)索引量很大,搜索請(qǐng)求并發(fā)很高,這時(shí)需要使用SolrCloud來(lái)滿足這些需求。
SolrCloud是基于Solr和Zookeeper的分布式搜索方案,它的主要思想是使用Zookeeper作為集群的配置信息中心。
它有幾個(gè)特色功能:
1)集中式的配置信息
2)自動(dòng)容錯(cuò)
3)近實(shí)時(shí)搜索
4)查詢時(shí)自動(dòng)負(fù)載均衡
Solr集群的系統(tǒng)架構(gòu):
1.1. 物理結(jié)構(gòu)
三個(gè)Solr實(shí)例( 每個(gè)實(shí)例包括兩個(gè)Core),組成一個(gè)SolrCloud。
1.2. 邏輯結(jié)構(gòu)
索引集合包括兩個(gè)Shard(shard1和shard2),shard1和shard2分別由三個(gè)Core組成,其中一個(gè)Leader兩個(gè)Replication,Leader是由zookeeper選舉產(chǎn)生,zookeeper控制每個(gè)shard上三個(gè)Core的索引數(shù)據(jù)一致,解決高可用問(wèn)題。
用戶發(fā)起索引請(qǐng)求分別從shard1和shard2上獲取,解決高并發(fā)問(wèn)題。
1.2.1. collection
Collection在SolrCloud集群中是一個(gè)邏輯意義上的完整的索引結(jié)構(gòu)。它常常被劃分為一個(gè)或多個(gè)Shard(分片),它們使用相同的配置信息。
比如:針對(duì)商品信息搜索可以創(chuàng)建一個(gè)collection。
collection=shard1+shard2+…+shardX 1
.2.2. Core
每個(gè)Core是Solr中一個(gè)獨(dú)立運(yùn)行單位,提供 索引和搜索服務(wù)。一個(gè)shard需要由一個(gè)Core或多個(gè)Core組成。由于collection由多個(gè)shard組成所以collection一般由多個(gè)core組成。
1.2.3. Master或Slave
Master是master-slave結(jié)構(gòu)中的主結(jié)點(diǎn)(通常說(shuō)主服務(wù)器),Slave是master-slave結(jié)構(gòu)中的從結(jié)點(diǎn)(通常說(shuō)從服務(wù)器或備服務(wù)器)。同一個(gè)Shard下master和slave存儲(chǔ)的數(shù)據(jù)是一致的,這是為了達(dá)到高可用目的。
1.2.4. Shard
Collection的邏輯分片。每個(gè)Shard被化成一個(gè)或者多個(gè)replication,通過(guò)選舉確定哪個(gè)是Leader。
zookeeper作為集群的管理工具。
1、集群管理:容錯(cuò)、負(fù)載均衡。
2、配置文件的集中管理
3、集群的入口 需要實(shí)現(xiàn)zookeeper 高可用。
需要搭建集群。建議是奇數(shù)節(jié)點(diǎn)。需要三個(gè)zookeeper服務(wù)器。 搭建solr集群需要7臺(tái)服務(wù)器。
搭建偽分布式:
需要三個(gè)zookeeper節(jié)點(diǎn)需要四個(gè)tomcat節(jié)點(diǎn)。 建議虛擬機(jī)的內(nèi)容1G以上。
- zookeeper集群搭建步驟和solr集群的搭建看day07
- spring配置全局異常處理器
8.activeMQ消息隊(duì)列
什么是ActiveMQ:
ActiveMQ 是Apache出品,最流行的,能力強(qiáng)勁的開源消息總線。ActiveMQ 是一個(gè)完全支持JMS1.1和J2EE 1.4規(guī)范的 JMS Provider實(shí)現(xiàn),盡管JMS規(guī)范出臺(tái)已經(jīng)是很久的事情了,但是JMS在當(dāng)今的J2EE應(yīng)用中間仍然扮演著特殊的地位。
主要特點(diǎn):
ActiveMQ的消息形式:
對(duì)于消息的傳遞有兩種類型:
一種是點(diǎn)對(duì)點(diǎn)的,即一個(gè)生產(chǎn)者和一個(gè)消費(fèi)者一一對(duì)應(yīng);
另一種是發(fā)布/訂閱模式,即一個(gè)生產(chǎn)者產(chǎn)生消息并進(jìn)行發(fā)送后,可以由多個(gè)消費(fèi)者進(jìn)行接收。
JMS定義了五種不同的消息正文格式,以及調(diào)用的消息類型,允許你發(fā)送并接收以一些不同形式的數(shù)據(jù),提供現(xiàn)有消息格式的一些級(jí)別的兼容性。
· StreamMessage – Java原始值的數(shù)據(jù)流
· MapMessage–一套名稱-值對(duì)
· TextMessage–一個(gè)字符串對(duì)象
· ObjectMessage–一個(gè)序列化的 Java對(duì)象
· BytesMessage–一個(gè)字節(jié)的數(shù)據(jù)流
ActiveMQ的安裝:
進(jìn)入http://activemq.apache.org/下載ActiveMQ
安裝環(huán)境:
1、需要jdk
2、安裝Linux系統(tǒng)。生產(chǎn)環(huán)境都是Linux系統(tǒng)。
安裝步驟:
第一步: 把ActiveMQ 的壓縮包上傳到Linux系統(tǒng)。
第二步:解壓縮。
第三步:啟動(dòng)。
使用bin目錄下的activemq命令啟動(dòng):
[root@localhost bin]# ./activemq start
關(guān)閉:
[root@localhost bin]# ./activemq stop
查看狀態(tài):
[root@localhost bin]# ./activemq status
注意:如果ActiveMQ整合spring使用不要使用activemq-all-5.12.0.jar包。建議使用5.11.2
進(jìn)入管理后臺(tái):
http://192.168.25.168:8161/admin
用戶名:admin
密碼:admin
Activemq的使用方法及與Spring的整合
9.靜態(tài)頁(yè)面freemaker
商品詳情頁(yè)面展示,動(dòng)態(tài)展示 jsp + redis
使用freemarker實(shí)現(xiàn)網(wǎng)頁(yè)靜態(tài)化
ActiveMq同步生成靜態(tài)網(wǎng)頁(yè)
什么是freemarker:
https://blog.csdn.net/culous/article/details/69948531
FreeMarker是一個(gè)用Java語(yǔ)言編寫的模板引擎,它基于模板來(lái)生成文本輸出。FreeMarker與Web容器無(wú)關(guān),即在Web運(yùn)行時(shí),它并不知道Servlet或HTTP。它不僅可以用作表現(xiàn)層的實(shí)現(xiàn)技術(shù),而且還可以用于生成XML,JSP或Java 等。
目前企業(yè)中:主要用Freemarker做靜態(tài)頁(yè)面或是頁(yè)面展示
使用步驟:
第一步:創(chuàng)建一個(gè)Configuration對(duì)象,直接new一個(gè)對(duì)象。構(gòu)造方法的參數(shù)就是freemarker對(duì)于的版本號(hào)。
第二步:設(shè)置模板文件所在的路徑。
第三步:設(shè)置模板文件使用的字符集。一般就是utf-8.
第四步:加載一個(gè)模板,創(chuàng)建一個(gè)模板對(duì)象。
第五步:創(chuàng)建一個(gè)模板使用的數(shù)據(jù)集,可以是pojo也可以是map。一般是Map。
第六步:創(chuàng)建一個(gè)Writer對(duì)象,一般創(chuàng)建一FileWriter對(duì)象,指定生成的文件名。第
七步:調(diào)用模板對(duì)象的process方法輸出文件。
第八步:關(guān)閉流。
網(wǎng)頁(yè)的靜態(tài)化方案:
輸出文件的名稱:商品id+“.html”
輸出文件的路徑:工程外部的任意目錄。
網(wǎng)頁(yè)訪問(wèn):使用nginx訪問(wèn)網(wǎng)頁(yè)。在此方案下tomcat只有一個(gè)作用就是生成靜態(tài)頁(yè)面。
工程部署:可以把taotao-item-web部署到多個(gè)服務(wù)器上。
生成靜態(tài)頁(yè)面的時(shí)機(jī):商品添加后,生成靜態(tài)頁(yè)面。可以使用Activemq,訂閱topic(商品添加)
商品詳情模塊實(shí)現(xiàn)
通過(guò)solr全文搜索找到商品;通過(guò)商品id去redis中找當(dāng)前id的緩存,找不到去數(shù)據(jù)庫(kù)中查找并添加到緩存中;
(為了提高redis的高可用,把不常訪問(wèn)的商品從redis緩存中清除:使用定時(shí))
每次點(diǎn)擊都會(huì)把key的時(shí)間重置,當(dāng)key在他的生命中沒(méi)有被點(diǎn)擊就會(huì)從redis中清除,再次訪問(wèn)時(shí)再次添加。
兩方面影響用戶訪問(wèn)速度:
數(shù)據(jù)庫(kù)查詢
使用緩存
服務(wù)器生成html頁(yè)面
使用freemaker生成靜態(tài)頁(yè)面
Freemaker生成靜態(tài)頁(yè)面的時(shí)機(jī)
添加商品后使用activemq廣播消息,freemaker監(jiān)聽到消息去數(shù)據(jù)庫(kù)查詢商品生成靜態(tài)頁(yè)面為什么不去redis中。
獲取商品信息,添加商品時(shí)還沒(méi)有存到redis中為什么不直接使用商品信息還要到數(shù)據(jù)庫(kù)中查詢:不在一個(gè)項(xiàng)目中傳輸數(shù)據(jù)麻煩,也起不到提高效率的作用;而且修改數(shù)據(jù)時(shí)也要修改靜態(tài)頁(yè)面。
Redis存儲(chǔ)數(shù)據(jù)庫(kù)表信息;
Key: 表名?字段
Value: 字段值
兩種方案:
一 redis緩存
二 網(wǎng)頁(yè)靜態(tài)化
10.nginx服務(wù)器的搭建
什么是nginx:
Nginx是一款高性能的http 服務(wù)器/反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器。由俄羅斯的程序設(shè)計(jì)師Igor Sysoev所開發(fā),官方測(cè)試nginx能夠支支撐5萬(wàn)并發(fā)鏈接,并且cpu、內(nèi)存等資源消耗卻非常低,運(yùn)行非常穩(wěn)定。
應(yīng)用場(chǎng)景:
1、http服務(wù)器。Nginx是一個(gè)http服務(wù)可以獨(dú)立提供http服務(wù)。可以做網(wǎng)頁(yè)靜態(tài)服務(wù)器。
2、虛擬主機(jī)??梢詫?shí)現(xiàn)在一臺(tái)服務(wù)器虛擬出多個(gè)網(wǎng)站。例如個(gè)人網(wǎng)站使用的虛擬主機(jī)。
3、反向代理,負(fù)載均衡。當(dāng)網(wǎng)站的訪問(wèn)量達(dá)到一定程度后,單臺(tái)服務(wù)器不能滿足用戶的請(qǐng)求時(shí),需要用多臺(tái)服務(wù)器集群可以使用nginx做反向代理。并且多臺(tái)服務(wù)器可以平均分擔(dān)負(fù)載,不會(huì)因?yàn)槟撑_(tái)服務(wù)器負(fù)載高宕機(jī)而某臺(tái)服務(wù)器閑置的情況。
nginx安裝:
官方網(wǎng)站:http://nginx.org/使用的版本是1.8.0版本。
安裝環(huán)境:
1、需要安裝gcc的環(huán)境。yum install gcc-c++
2、第三方的開發(fā)包。
PCRE:
PCRE(Perl Compatible Regular Expressions)是一個(gè)Perl庫(kù),包括 perl 兼容的正則表達(dá)式庫(kù)。nginx的http模塊使用pcre來(lái)解析正則表達(dá)式,所以需要在linux上安裝pcre庫(kù)。yum install -y pcre pcre-devel
注:pcre-devel是使用pcre開發(fā)的一個(gè)二次開發(fā)庫(kù)。nginx也需要此庫(kù)。
zlib:
zlib庫(kù)提供了很多種壓縮和解壓縮的方式,nginx使用zlib對(duì)http包的內(nèi)容進(jìn)行g(shù)zip,所以需要在linux上安裝zlib庫(kù)。
yum install -y zlib zlib-devel
openssl:
OpenSSL 是一個(gè)強(qiáng)大的安全套接字層密碼庫(kù),囊括主要的密碼算法、常用的密鑰和證書封裝管理功能及SSL協(xié)議,并提供豐富的應(yīng)用程序供測(cè)試或其它目的使用。
nginx不僅支持http協(xié)議,還支持https(即在ssl協(xié)議上傳輸http),所以需要在linux安裝openssl庫(kù)。
yum install -y openssl openssl-devel
安裝步驟:
第一步:把nginx的源碼包上傳到linux系統(tǒng)
第二步:解壓縮[root@localhost ~]# tar zxf nginx-1.8.0.tar.gz
第三步:使用configure命令創(chuàng)建一makeFile文件。
./configure
–prefix=/usr/local/nginx
–pid-path=/var/run/nginx/nginx.pid
–lock-path=/var/lock/nginx.lock
–error-log-path=/var/log/nginx/error.log
–http-log-path=/var/log/nginx/access.log
–with-http_gzip_static_module
–http-client-body-temp-path=/var/temp/nginx/client
–http-proxy-temp-path=/var/temp/nginx/proxy
–http-fastcgi-temp-path=/var/temp/nginx/fastcgi
–http-uwsgi-temp-path=/var/temp/nginx/uwsgi
–http-scgi-temp-path=/var/temp/nginx/scgi
注意:啟動(dòng)nginx之前,上邊將臨時(shí)文件目錄指定為/var/temp/nginx,需要在/var下創(chuàng)建temp及nginx目錄
[root@localhost sbin]# mkdir /var/temp/nginx/client -p
第四步:make
第五步:make install
啟動(dòng)nginx:
進(jìn)入sbin目錄
[root@localhost sbin]# ./nginx
關(guān)閉nginx:
[root@localhost sbin]# ./nginx -s stop
推薦使用:
[root@localhost sbin]# ./nginx -s quit
重啟nginx:
1、先關(guān)閉后啟動(dòng)。
2、刷新配置文件:
[root@localhost sbin]# ./nginx -s reload
訪問(wèn)nginx:
默認(rèn)是80端口。注意:是否關(guān)閉防火墻。
- 配置虛擬主機(jī) (http服務(wù)器)
- 反向代理
- 負(fù)載均衡
軟負(fù)載,硬負(fù)載
F5硬負(fù)載第四層負(fù)載 :傳輸層負(fù)載
nginx是第七層應(yīng)用層負(fù)載
LVS實(shí)現(xiàn)第四層的軟負(fù)載,能實(shí)現(xiàn)F5的60的負(fù)載功能 - 高可用
11.sso單點(diǎn)登陸系統(tǒng)
什么是sso系統(tǒng):
SSO英文全稱Single Sign On,單點(diǎn)登錄。SSO是在多個(gè)應(yīng)用系統(tǒng)中,用戶只需要登錄一次就可以訪問(wèn)所有相互信任的應(yīng)用系統(tǒng)。它包括可以將這次主要的登錄映射到其他應(yīng)用中用于同一個(gè)用戶的登錄的機(jī)制。它是目前比較流行的企業(yè)業(yè)務(wù)整合的解決方案之一。
購(gòu)物車業(yè)務(wù)邏輯:
1、從cookie中查詢商品列表。
2、判斷商品在商品列表中是否存在。
3、如果存在,商品數(shù)量相加。
4、不存在,根據(jù)商品id查詢商品信息。
5、把商品添加到購(gòu)車列表。
6、把購(gòu)車商品列表寫入cookie。
小結(jié)
使用cookie實(shí)現(xiàn)購(gòu)物車:
優(yōu)點(diǎn):1、實(shí)現(xiàn)簡(jiǎn)單2、不需要占用服務(wù)端存儲(chǔ)空間。
缺點(diǎn):1、存儲(chǔ)容量有限2、更換設(shè)備購(gòu)車信息不能同步。
實(shí)現(xiàn)購(gòu)車商品數(shù)據(jù)同步:
1、要求用戶登錄。
2、把購(gòu)物車商品列表保存到數(shù)據(jù)庫(kù)中。推薦使用redis(用戶會(huì)頻繁操作購(gòu)物車)。
3、Key:用戶id,value:購(gòu)車商品列表。推薦使用hash,hash的field:商品id,value:商品信息。Key 用戶id
Value
Key 商品id
Value 商品json
4、在用戶未登錄情況下寫cookie。當(dāng)用戶登錄后,訪問(wèn)購(gòu)物車列表時(shí),
a) 把cookie中的數(shù)據(jù)同步到redis。
b) 把cookie中的數(shù)據(jù)刪除
c) 展示購(gòu)物車列表時(shí)以redis為準(zhǔn)。
d) 如果redis中有數(shù)據(jù)cookie中也有數(shù)據(jù),需要做數(shù)據(jù)合并。相同商品數(shù)量相加,不同商品添加一個(gè)新商品。
5、如果用戶登錄狀態(tài),展示購(gòu)物車列表以redis為準(zhǔn)。如果未登錄,以cookie為準(zhǔn)
12.mybatis分頁(yè)插件pagehelper
13.項(xiàng)目部署
項(xiàng)目架構(gòu)講解:
網(wǎng)絡(luò)拓?fù)鋱D:
系統(tǒng)部署:
部署分析
Taotao-manager
Taotao-manager-web
Taotao-portal-web
Taotao-content
Taotao-searchT
aotao-search-web
Taotao-item-web
Taotao-sso
Taotao-sso-web
Taotao-cart-web
Taotao-order
Taotao-order-web
需要24臺(tái)服務(wù)器。 24
Mysql 2
Solr 7
Redis 6
圖片服務(wù)器 2
Nginx 2
注冊(cè)中心 3
Activemq 2
共需要48臺(tái)服務(wù)器。
項(xiàng)目部分詳解:
商品管理:
1.1商品查詢業(yè)務(wù):
查詢所有的商品信息,商品的分頁(yè)采用的是pagehelp插件,將商品信息查詢出來(lái)的信息放到pageinfo對(duì)象里面,設(shè)置分頁(yè)信息,當(dāng)前頁(yè)和每頁(yè)顯示多少條數(shù)據(jù),第一次查詢的時(shí)候會(huì)先查詢r(jià)edis里面有沒(méi)有數(shù)據(jù),如果有 直接取出來(lái),取出來(lái)的是一個(gè)json,需要將json轉(zhuǎn)化成對(duì)象,如果沒(méi)有就從數(shù)據(jù)里面查出來(lái),同時(shí)會(huì)存進(jìn)redis里面去。(總之第一次查詢的時(shí)候必須是先走redis)
1.2商品添加業(yè)務(wù):
在商品添加界面錄入商品信息,商品的id,商品標(biāo)題,商品賣點(diǎn),商品價(jià)格,庫(kù)存數(shù)量,商品條形碼,商品圖片,商品類別,商品狀態(tài)(1-正常,2-下架,3-刪除’),創(chuàng)建時(shí)間,更新時(shí)間,商品的描述。其中圖片存儲(chǔ)考慮到數(shù)量比較多,采用的是分布式文件存儲(chǔ)系統(tǒng)(fastdfs),圖片多了可以搭建集群。商品的描述采用的是富文本編輯器,將錄入的商品信息分別插入對(duì)應(yīng)的不同的表,商品添加時(shí)還需要和redis數(shù)據(jù)庫(kù)進(jìn)行同步,同時(shí)也會(huì)添加到redis里面去做緩存。
圖片上傳操作的步驟:
商品類目管理:
2.1商品類目查詢業(yè)務(wù):
商品分類列表,使用EasyUI的tree控件展示,前端需要返回的json數(shù)據(jù)字段有,id,text,state;text:節(jié)點(diǎn)的名稱,state:如果節(jié)點(diǎn)下有子節(jié)點(diǎn)“closed”,如果沒(méi)有子節(jié)點(diǎn)“open”。數(shù)據(jù)的顯示采用的是異步加載。點(diǎn)擊父節(jié)點(diǎn)才會(huì)加載父節(jié)點(diǎn)下的子節(jié)點(diǎn)。查詢的條件是parent_id父節(jié)點(diǎn)的id,默認(rèn)值我們給的是0,根據(jù)parent_id作為條件查詢出來(lái)的數(shù)據(jù),封裝在自己定義的pojo里面,然后在轉(zhuǎn)化成json,回顯給界面 。
2.2商品類目添加業(yè)務(wù):
在某個(gè)節(jié)點(diǎn)上添加信息,首先拿到該節(jié)點(diǎn)的id,插入一條數(shù)據(jù)時(shí),將id當(dāng)成父節(jié)點(diǎn)的字段插入進(jìn)去,如果之前的節(jié)點(diǎn)有葉子節(jié)點(diǎn)就不用管,沒(méi)有葉子節(jié)點(diǎn),要把之前的狀態(tài)改成有子節(jié)點(diǎn)的狀態(tài)。
網(wǎng)站內(nèi)容管理(CMS)
3.1內(nèi)容分類查詢業(yè)務(wù):
內(nèi)容分類列表,使用EasyUI的tree控件展示,前端需要返回的json數(shù)據(jù)字段有,id ,text,state;text:節(jié)點(diǎn)的名稱,state:如果節(jié)點(diǎn)下有子節(jié)點(diǎn)“closed”,如果沒(méi)有子節(jié)點(diǎn)“open”。數(shù)據(jù)的顯示采用的是異步加載。點(diǎn)擊父節(jié)點(diǎn)才會(huì)加載父節(jié)點(diǎn)下的子節(jié)點(diǎn)。查詢的條件是parent_id父節(jié)點(diǎn)的id,默認(rèn)值我們給的是0,根據(jù)parent_id作為條件查詢出來(lái)的數(shù)據(jù),封裝在自己定義的pojo里面,然后在轉(zhuǎn)化成json,回顯給界面
3.2重命名業(yè)務(wù):
根據(jù)id查詢?cè)摴?jié)點(diǎn)的對(duì)象,拿到這個(gè)對(duì)象之后,修改該對(duì)象的名字。改完之后把該對(duì)象當(dāng)做參數(shù)去修改
3.3刪除業(yè)務(wù):
根據(jù)id修改對(duì)應(yīng)表里面的刪除字段狀態(tài),1表示存在,0表示刪除,刪除節(jié)點(diǎn)的同時(shí)還需要判斷該節(jié)點(diǎn)的父節(jié)點(diǎn)是否有子節(jié)點(diǎn)存在,如果不存在,要把父節(jié)點(diǎn)的那條數(shù)據(jù)的狀態(tài)改成沒(méi)有子節(jié)點(diǎn)
3.4內(nèi)容查詢業(yè)務(wù)
根據(jù)內(nèi)容的分類,查詢對(duì)應(yīng)分類的廣告內(nèi)容信息。拿到內(nèi)容分類id,在內(nèi)容管理表里面查詢,在將返回的對(duì)象轉(zhuǎn)換成json數(shù)據(jù)顯示在頁(yè)面。
3.5內(nèi)容刪除業(yè)務(wù)
刪除是改變對(duì)應(yīng)數(shù)據(jù)里面對(duì)應(yīng)的狀態(tài),如果需要同步到redis里面去,還需要把redis里面對(duì)應(yīng)的K刪掉,下次再查詢的的時(shí)候,發(fā)現(xiàn)redis沒(méi)有對(duì)應(yīng)的k,會(huì)再次同步到redis中去。
廣告位
1.輪播圖業(yè)務(wù)
選中大廣告節(jié)點(diǎn),拿到內(nèi)容分類大廣告的id,在內(nèi)容管理里面插入數(shù)據(jù),進(jìn)入到大廣告添加的界面錄入信息,內(nèi)容的標(biāo)題,內(nèi)容的子標(biāo)題,內(nèi)容的描述,url地址,圖片信息,內(nèi)容,圖片使用的是fastdfs,內(nèi)容采用的是富文本編輯器。添加之后需要和redis進(jìn)行同步。下次回顯數(shù)據(jù)的時(shí)候從redis里面查,如果沒(méi)有就從數(shù)據(jù)里面查詢
商品搜索
5.1同步solr庫(kù)業(yè)務(wù)
在solr配置文件schema.xml中定義要搜索的域,里面有商品Id,商品標(biāo)題,商品賣點(diǎn),商品價(jià)格,商品圖片,分類名稱,商品描述。首先查詢出所有的商品數(shù)據(jù),查詢出來(lái)之后再創(chuàng)建一個(gè)solrServer對(duì)象。在為每個(gè)商品創(chuàng)建一個(gè)SolrInputDocument對(duì)象,將查詢出來(lái)的商品數(shù)據(jù)循環(huán)遍歷添加到SolrInputDocument對(duì)象里面去,在將SolrInputDocument對(duì)象添加到SolrServer對(duì)象里面。
5.2商品搜索業(yè)務(wù)
商品搜索用到了solr技術(shù),根據(jù)IK分詞器,對(duì)查詢的條件進(jìn)行查詢,首先創(chuàng)建一個(gè)SolrQuery對(duì)象作為商品搜索的查詢條件,設(shè)置分頁(yè)條件,指定默認(rèn)的搜索域,設(shè)置高亮,執(zhí)行查詢,計(jì)算出總頁(yè)數(shù)和總條數(shù),返回一個(gè)QueryResponse結(jié)果集,在將結(jié)果集循環(huán)遍歷添加到自己定義的集合里面,返回給頁(yè)面,一個(gè)商品的圖片有多個(gè)地址,需要將圖片的地址分切轉(zhuǎn)化成數(shù)組,頁(yè)面顯示的時(shí)候取數(shù)組的下標(biāo)為0,取出一張圖片就可以了。
商品詳情頁(yè):
商品詳情頁(yè)采用的是FreeMarker模板引擎技術(shù),生成一個(gè)靜態(tài)化頁(yè)面。這樣能減輕服務(wù)器的壓力。首先創(chuàng)建一個(gè)Configuration對(duì)象,這個(gè)對(duì)象有個(gè)參數(shù),參數(shù)是FreeMarker的版本號(hào),拿到這個(gè)Configuration對(duì)象之后設(shè)置模板所在的路徑,在設(shè)置模板文件使用的字符集,設(shè)置完之后加載一個(gè)模板,創(chuàng)建一個(gè)模板對(duì)象,模板創(chuàng)建之后會(huì)把查詢出來(lái)的數(shù)據(jù)放到模板里面。
購(gòu)物車:
購(gòu)物車的實(shí)現(xiàn)功能考慮到兩種情況,登錄的時(shí)候商品存在哪里,沒(méi)有登錄的時(shí)候商品信息存在哪里。沒(méi)有登錄的時(shí)候我們將商品信息保存在cookie里面,在保存之前我們會(huì)先在cookie里面先查詢有沒(méi)有該商品,如果該商品存在只需要修改該商品的數(shù)量即可,如果cookie里面不存在,就把商品信息添加到cookie里面去。登錄的時(shí)候我們將商品保存到redis里面去,這個(gè)時(shí)候需要將cookie和redis里面的商品進(jìn)行合并,同時(shí)需要?jiǎng)h除cookie里面的數(shù)據(jù)。
SSO
用戶注冊(cè)業(yè)務(wù):
客戶端發(fā)送請(qǐng)求到后臺(tái),需要校驗(yàn)用戶名和密碼不能為空,用戶名,電話,郵箱是否已經(jīng)被使用,如果都通過(guò)將接受到的密碼用MD5進(jìn)行加密,然后在插入到數(shù)據(jù)里面去。
用戶登錄業(yè)務(wù):
在登錄界面輸入用戶名和密碼之后點(diǎn)擊登錄按鈕,action接受用戶名和密碼,根據(jù)用戶名查詢密碼,將用戶輸入的密碼進(jìn)行MD5加密,然后在和數(shù)據(jù)庫(kù)里面的值進(jìn)行對(duì)比,如果成立就生成一個(gè)token的變量。token的值由uuid生成。在將用戶信息存到redis里面。Key是token,value就是用戶信息,在設(shè)置redis的過(guò)去時(shí)間,一般半個(gè)小時(shí),再把token寫入到cookie中。客戶端發(fā)送請(qǐng)求的時(shí)候,從cookie里面拿到token的值,把值拿到之后再redis里面當(dāng)成k來(lái)取出用戶信息看是都存在,存在登錄成功。
總結(jié)
以上是生活随笔為你收集整理的关于淘淘商城的一些基本说明的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 湖南省工信厅党组书记、厅长雷绍业一行莅临
- 下一篇: 无盘服务器内存问题,无盘服务器内存占用过