品優購項目心得

第一天(分佈式框架dubbox)html

分佈式框架dubbox,是一個遠程服務調用框架,只有在分佈式的時候,纔有dubbox這樣的分佈式服務框架的需求,而且本質上是個服務調用的東東,說白了就是個遠程服務調用的分佈式框架前端

方便遠程服務調用java

高併發是一種現象,集羣是解決高併發的一種方案,負載均衡也是高併發的解決方案,分佈式是分開開發,分佈成不一樣的部分,緩解開發壓力node

高可用,在高併發的狀況下仍是可用.由於服務器可能在高併發的時候掛掉linux

 品優購採用b2b2c,商家能夠入住nginx

業務最難部分在第六天和第七天web

採用的系統架構是SOA,面向服務的架構,實際上就是一種分佈式架構,前端和業務邏輯分離redis

採用技術:後端框架採用SSM+dubbox,前端採用angularJS+Bootstrap,有jsp就不是先後端編程了算法

 ZOOKEEP,樹形的目錄結構,適合做爲Dubox服務的註冊中心,裝在linux系統上,把虛擬機當成服務器spring

用secureCRT鏈接上linux,而後能夠上傳文件

alt+p進入sftp界面

記得用的包都是dubbox的,創建的包名字記得和掃描包的名字同樣

@Autowired本地注入,dubbox用另一個@Reference的注入

@RestControl = @Control+@ResponseBody(返回輸出,還有一個別的是跳轉頁面)

@Requestmapping請求映射,後面跟地址

接口通常是jar類型,被web工程直接引用的用jar,tomcat直接運行的用war

關於pojo裏面實體類還要所有實現序列化接口(Serializable),必要要作由於實體類要在網絡中傳輸要序列化,以前不用是由於在本地中傳輸因此不用

次日(AngularJS)

AngularJS,版本1用的比較多,前端框架經常使用指令,品牌管理分頁,品牌管理的增刪改查

四大特徵:MVC模式,雙向綁定,依賴注入,模塊化設計

雙向綁定,模型與視圖動態同步,修改一個變量,另外一邊也跟着改

依賴注入,把一個bean傳給另外一個bean,不用new了

模塊化設計,通常用用戶自定義模塊,高內聚低耦合法則

MVC思想,思想和jQ徹底不一樣,把前端也mvc處理,Angular的思想是操做變量,而後綁定變量,jQ的思想是dom操做

Model:數據,其實就是angular變量($scope.XX);

View: 數據的呈現,Html+Directive(指令);

Controller:操做數據,就是function,數據的增刪改查;

 

<body ng-app>這樣纔會識別表達式,ng-app是識別的指令,否則識別不了angularJS的表達式

表達式:{{}}

ng-model 指令用於綁定變量,這樣用戶在文本框輸入的內容會綁定到變量上,而表達式能夠實時地輸出變量。

ng-init指令,初始化指令

控制器

var app=angular.module('myApp',[]); //定義了一個叫myApp的模塊,[]裏面放的是其它模塊

 

經過模塊來建立控制器.app.controller("myCpmtroller",function($scope){

}),第一個參數控制器名稱,第二個參數是控制器的內容,$scope控制層和視圖層交換數據的橋樑

<body ng-app="myApp" ng-controller="myController">識別模塊名稱

事件指令ng-click  是最經常使用的單擊事件指令,再點擊時觸發控制器的某個方法

ng-repeat指令用於循環數組變量。

 內置服務,使用$http獲取後端數據

src的..找到根目錄

實體類和業務無關的包能夠不用域名命名,entity,由於別的業務能夠複用,不用改域名,好比頁碼這種

要網絡傳輸的bean要實現可序列化接口

後端pojo改了的話,要用maven從新安裝一下

maven build 運行項目

@RequestBody註解實現接收http請求的json數據,將json數據轉換爲java對象,通常用post傳遞對象

$scope.selectIds.push(),push至關於集合裏面的add方法

第三天

規格和模板管理

將前端分層開發,把服務單獨拿出來寫,裏面內容包括請求地址和傳遞參數,好比內置服務$http就是服務,把後端當作dao層,前端和後端交互的的橋樑

再由控制層調用服務,而後直接返回

而後在js文件夾下建立文件夾controller和service,作成文件放在js下面,而後導入html中

控制器繼承,將公共部分抽取出來,而後須要使用的繼承,如分頁和刷新

裏面使用的繼承是一種僞繼承,能實現相似繼承的效果

 

$controller也是angular提供的一個服務,實際上就是與BaseController共享$scope

代碼生成器

作規格管理功能

增長規格功能,初始化集合要先來一個空的[],裏面集合用push增長,用splice移除,另外傳輸的集合pojo也要序列化 

修改,能夠用先全刪後結果全加,這樣不用擔憂又有加又有刪了的修改了

在repeat中用$index自動得到索引

用組合接收,不用sql關聯,關聯效率低

select2下拉使用和位置的注意

後端至關於dao,而後service通常是放連接,鏈接下後端,而後control調用service,而後html調用control

 AgularJS用Json.parse方法將string轉成json,這裏的json是js內置的,這個經常使用

第四天(Spring Security安全框架,權限控制)

Spring Security安全框架,權限控制

完成商家登陸,商家入住,商家審覈

 access使用權

在spring-security.xml的<http>標籤寫的是攔截的規則,有使用權的才能訪問某路徑

裏面的use-expressions,是否啓動SPEL表達式,有兩種寫法,這個簡單,另一個是沒有寫use什麼的,在aceess那裏加個hasrole的方法再加role的名稱

<form-login>開啓表單登陸功能,接收html傳過來的action地址,和接受完跳轉的地址,還有失敗跳轉的頁面,能夠改登陸的變量user或者password,也要設置老是跳轉的默認頁面

<authentication-manager>認證管理器,用戶裏面添加角色,而後就能夠訪問某路徑了

在<http>中,使用security="none"不登陸也能夠訪問

X-CSRF-TOKEN防止csrf的攔截,除非是本身生產的頁面,或者那個頁面是jsp頁面,像html自己是個靜態的頁面沒辦法添加token,因此得把這個功能關閉

CSRF跨站請求僞造,是一種安全機制,是一種對網站的惡意利用,從這個站點訪問另一個站點,至關於攻擊

 有的時候不必定是你的錯誤,多是緩存的問題

security默認攔截內置iframe,要去改個配置才能使用裏面的功能

配置policy策略就能夠解決上面那個問題

登入後同步帳號顯示

<logout>註銷,自動退出,也能夠設置要跳轉的網頁

商家申請入住

<body>上初始化加入查詢的時候設置狀態碼爲未激活,就不用去後端弄那麼麻煩了

商家詳情,更新商家狀態

用dubbo遠程調用注入,寫登陸

密碼加密,比md5更高級的加密,不可逆的加密,哈希算法,md5,32位

可逆(祕鑰)

bcrypt加密算法

第五天(商品管理)

商品錄入(1)

spu和sku,富文本編輯器,上傳服務器FastDFS,掌握angularJS圖片上傳

商品分類,3層級,和麪包屑導航,樹狀結構

通常先寫dao,再寫後端service在寫serviceimpl在寫control,再寫前端service,再寫前端control,在寫html

spu:如iphone7

sku如紅色電信64g的iphone7是一個sku

一個spu對應多個sku

 商品錄入功能goods商品基本信息spu,goodsdesc商品spu擴展,itemList商品spu列表

RTE富文本編輯器,通常用KindEditor,裏面其實是html的內容

上傳圖片

分佈式文件服務器FastDFS,阿里巴巴出的

tracker管理集羣

maven工程的中央倉庫不存在fastDFS

第六天(商品管理)

 規格,擴展屬性,選擇商品分類

需求分析,級聯操做

學另一種下拉列表,除了select2這種

使用ng-options指定<select>內容的指令裏面有專門的語法 item指的是專門一條記錄,再指定值和文本,很方便

級聯,使用變量監控方法

$scope.$watch(),這是系統的方法,因此帶$,變量監控

json.parse將字符串轉成json數據

遇到錯誤,先分析是前端仍是後端的問題,縮小範圍

編寫通用方法,在集合中查詢對象中某個屬性值

克隆技巧

淺克隆

深克隆,值同樣,可是是兩個對象

前端的是使用b=JSON.parse(JSON.stringfy(a))

若是前端的方法沒有$scope,頁面上不調用的話,能夠不加$scope,調用也不用$scope,至關這個控制器的私有方法

第七天(商品管理)

 商品修改與審覈

$location服務,參數傳遞封裝,使得不會寫在瀏覽器上

?前要加# ,則是angularJS的地址路由的書寫形式 

$location.search搜索頁面全部參數並封裝成數組

新指令.ng-checked,根據值是否被勾選

JSON.parse() 方法用於將一個 JSON 字符串轉換爲對象。

表格刪增後的更新通常採用刪除後再插入新表

manager-web運營商後臺

shop商家後臺

第八天(廣告和緩存)

廣告和springdataredis

新建項目,引入依賴,記得改端口(分佈式架構)

src/webapp下面放前端文件

框架放在webapp下面的plugin

control和service放在js裏面

用三目運算符開發廣告首頁

springdataredis,常常訪問的數據放在這裏,在spring的配置中訪問redis服務,是對jedis的封裝

 集合操做和對象操做

list集合操做,右壓棧,效果最後加的元素排在後面,左壓棧,最後加的元素排在前面

好比a b c順序插入,那麼右壓棧排序是{a,b,c}.左壓棧是{c,b,a}

hash在這裏其實就是map

實際使用,先查,後插入,再查

更新緩存,先清除再加入

第九天(作搜索)

luncene自己是個類庫,調用解決,自己是用java調用

創建在luncene之上,solr搜索引擎的技術,是基於Lucene的全文搜索服務器

Solr能夠獨立運行,運行在JettyTomcat等這些Servlet容器中,能夠把他當作nosql的數據庫,強項是搜索速度快

solr有個管理界面,經過管理界面能夠查詢Solr的配置和運行狀況。

Solr和Lucene的本質區別有如下三點:搜索服務器,企業級和管理。Lucene本質上是搜索庫,不是獨立的應用程序,而Solr是。Lucene專一於搜索底層的建設,而Solr專一於企業應用。Lucene不負責支撐搜索服務所必須的管理,而Solr負責。因此說,一句話歸納Solr: Solr是Lucene面向企業搜索應用的擴展

中文分析器:IK Analyzer,由於中文要分詞啊,輕量級中文分詞工具包,能夠本身擴展詞典

這裏的域field指的是數據庫的字段,或者說列

裏面的required是非空的意思,就是必需要有值,index,是否根據字段搜出來,store是否存儲

通常不會用默認的field,根據需求來定

複製域,不用stored,不是物理的複製,multiValued是true,至關於幾個域的和,好比搜索框可能會搜標題,可能品牌,因此這兩個要聯合起來等

動態域,用在規格(spec),很靈活,關係型數據庫比較好的地方

使用數據庫查詢沒有分詞效果,like又很低效,數據庫搜索壓力很大

因此使用solr,裏面放的是內容,是數據,從數據庫導入到這裏的索引庫中,隨着數據庫的變化而變化,同步的關係,增刪改爲也要作,

能夠用官方類庫solrJ(原理:http請求和響應)

spring-data-jpa框架用於dao層

Spring Data Solr框架(原理:官方類庫的封裝,在maven裏面有依賴傳遞)

手動請求solr,手動處理相應httpClient

@field註解,用於實體類和域的對應關係

存在則修改,不存在就保存,不能存id同樣的

配好域後,要重啓solr的服務端

 solr部署配置,批量導入插件,比較複雜就幫不上忙了,用本身代碼寫

從mybatis查出而後導入spring data solr裏面

用map表示動態域

search依賴文件裏面不鏈接數據庫,連接solr就能夠了

web文件夾通常放靜態原型和控制層

用post提交對象

reference注入對象

在寫搜索後端的時候有個注意事項,控制層搜索可能會超過一秒鐘,和dubbox有關,可能會掛掉,因此注入服務對象的時候把超時時間timeout改到5000,也能夠在服務的提供方加入超時,取決於你對時間的估計,通常來講推薦放在服務端,若是兩端都設置了時間,那以控制層的爲準

 第十天(高亮,品牌,規格,過濾查詢)

高亮很麻煩,今天都挺麻煩的

後端加入標籤後,不能顯示是由於防止html攻擊,是angularJS的問題

使用$sce,angularJS信任策略解決,trustAsHtml方法,讓它去解析,trust信任的意思

也可使用angularJS的過濾器,能夠當作全局方法,通常寫在base.JS裏面

ng-bind-html,指令用來顯示html內容,而後用豎線調用信任

使用分組查詢

一個分組頁可能包含多個分組結果

品牌和規格的數據,作緩存,思路以下

根據商品分類名稱key緩存模板ID(value)
根據模板ID緩存模板表key的品牌列表(value)
根據模板ID緩存模板表key的規格列表(value)

 過濾查詢,今天都很複雜

第十一天(搜索)

按價格區間搜索

搜索結果分頁,不用控件,這樣能夠改變樣式,更可控

多關鍵字搜索

排序功能

split分割

setoffset起始索引

query.setoffset((pageNo-1)*pageSize),獲得第某頁的每條記錄

pagesize,頁面大小(本頁記錄數)

500:只要頁面中顯示的是500錯誤,則表示服務器出錯,服務器的程序出錯,此時必須查找代碼
404::表示頁面沒有發現錯誤,可能路徑出錯 
sort排序的對象,對排序的封裝
spring task 任務調度技術,幾點幾點幹嗎,主要是訂單排序的話,訂單會一直更新
銷量排序不用總銷量排序,評價是優先好評的排在前面,不是純粹的評價數量相加,將不一樣評價加權不一樣
隱藏產品列表
同步搜索到首頁
更新索引庫
第十二天(商品詳情頁)
Freemarker網頁靜態化解決方案,今天起天天一個新技術,以ftl結尾的文件
新聞網站和門戶網站用的多,新聞內容被靜態化了,主要是爲了減小數據庫訪問壓力
好比商品詳情頁就是爲了減小訪問數據庫壓力,提早生成好靜態頁面,另外利於SEO
另外這樣可使用高性能的Nginx的web服務器來部署,Nginx能夠承載5w的併發,可是隻能使用靜態頁面,而tomcat只有幾百
原理:讀取模板而後把插值用變量來替換,而後經過文件io的方式輸出就完事了
模板文件中四種元素

一、文本,直接輸出的部分

二、註釋,即<#--...-->格式不會輸出

三、插值(Interpolation):即${..}部分,將使用數據模型中的部分替代輸出

四、FTL指令:FreeMarker指令,和HTML標記相似,名字前加#予以區分,不會輸出。

FTL指令,能夠實現一些邏輯

assign指令
此指令用於在頁面上定義一個變量

include指令
此指令用於模板文件的嵌套

內建函數

內建函數語法格式: 變量+?+函數名稱  

判斷某變量是否存在:「??」
用法爲:variable??,若是該變量存在,返回true,不然返回false 

累計積分:${point?c}

當前日期:${today?date} <br>
當前時間:${today?time} <br>
當前日期+時間:${today?datetime} <br>
日期格式化: ${today?string("yyyy年MM月")}

轉換JSON字符串爲對象
<#assign data=text?eval />

缺失變量默認值:「!」

  ${aaa!'-'}

>或者gt:判斷左邊值是否大於右邊值 ,或者括號括起來
>=或者gte:判斷左邊值是否大於等於右邊值 
<或者lt:判斷左邊值是否小於右邊值 
<=或者lte:判斷左邊值是否小於等於右邊值 

注意:  =!=能夠用於字符串,數值和日期來比較是否相等,=!=兩邊必須是相同類型的值,不然會產生錯誤,並且FreeMarker是精確比較,"x","x ","X"是不等的.其它的運行符能夠做用於數字和日期,但不能做用於字符串,大部分的時候,使用gt等字母運算符代替>會有更好的效果,由於 FreeMarker會把>解釋成FTL標籤的結束字符,固然,也可使用括號來避免這種狀況,:<#if (x>y)> 

@refernce,遠程調用

caption標題

第十三天(消息中間件)

消息中間件JMS,和JDBC相似的理解,都是接口規範.使用SpringJMS

簡單的說中間件就是軟件,服務類的軟件,能夠實現相應的功能,介於應用和底層數據軟件的關係,用來存儲消息的軟件平臺,至關於快遞的鳥箱,解決系統模塊之間異步調用的關係,

減小藕合

常見消息中間件ActiveMQ,apache裏面的

搜索和頁面生產使用,用在執行過程長,這些不須要返回結果

 兩種消費傳遞

ptp,點對點,中間有一個隊列,能夠一個生產者和一個消費者

另外一種是發佈/訂閱模式,一個生產者,多個消費者接受

linux命令chmod755是在linux下設置文件權限的命令,具體數字等還有含義

隊列裏面的消息

pending待定的

點對點通常適用於一次的(搜索)

發佈/訂閱,用頁面生成

spring整合JMS

 一個監聽容器只能幹一個事

通常都寫在控制層,記得解除dubbox

jmsTemplateSpring提供的JMS工具類,它能夠進行消息發送、接收等

通常來講注入

JmsTemplate和Destination

配置文件中:

隊列目的地的value要相等

消息監聽容器裏面,要監聽目的地,和監聽類

商品審覈-導入Solr索引庫的流程(點對點)

1解耦刪除以前的直接鏈接2導入依賴3增長配置文件spring-activemq.xml,裏面放着目的地,裏面的value是重點,jmsTemplate也是重點,而後修改web.xml

而後寫生產者代碼併發送,而後寫搜索服務,添加依賴,而後配置applicationContext-jms-consumer.xml,目的地,jmstemplate,還有監聽容器的監聽類和目的地注入是重點

而後寫代碼,添加監聽類,裏面注入搜索服務,而後寫代碼監聽到之後執行導入索引庫

商品刪除-移除Solr索引庫記錄(點對點)

在配置文件spring-activemq.xml中增長目的地,而後寫發佈訂閱的代碼,而後寫搜索服務(消費者),添加目的地和監聽容器,而後寫監聽類,注入搜索服務,接收到之後執行搜索

商品審覈-執行網頁靜態化

添加依賴,配置中寫目的地,發佈消息,消費者的時候,先解除dubbox依賴,而後添加依賴,增長目的地和監聽容器,而後注入服務,寫監聽類

其它都差很少

第十四天(springboot和短信解決,用阿里大於)

開發短信微服務

Spring Boot 並非不對 Spring 功能上的加強,而是提供了一種快速使用 Spring 的方式。

starter啓動器,原理,依賴傳遞

記得把jdk版本更新,springboot默認用1.6,寫個配置屬性1.7便可

@SpringBootApplication其實就是如下三個註解的總和

@Configuration 用於定義一個配置類

@EnableAutoConfiguration :Spring Boot會自動根據你jar包的依賴來自動配置項目。

@ComponentScan: 告訴Spring 哪一個packages 的用註解標識的類 會被spring自動掃描而且裝入bean容器

熱部署!!!不須要重啓服務器就能夠讀取你修改的代碼!

阿里大於,短信發送平臺,阿里雲旗下產品,原理就是網絡調用

sms短信

微服務,帶有輕量級的含義,構建一個獨立於品優購的單獨的短信工程

springboot很適合開發微服務

 properties能夠把字屏蔽,像密碼同樣換成別的碼

建立一個短信微服務,接受activeMQ,接收到之後發送短信

用springboot和阿里大於,方便

1建立引導類2建立配置文件3短信工具類4寫監聽類

第十五天(單點登陸sso,是解決方案)

單點登陸sso,登入後,登入狀態同步到各個web項目

原理:各個web應用系統得到用戶已經登陸的認證系統,認證系統會給使用者一張票(本質是cookie),使用者用票去各個系統,系統會拿票和認證系統驗證

分佈式項目不可缺乏sso

CAS客戶端和服務端,它的服務端也是web層上的不是服務層

SSO單點登陸訪問流程主要有如下步驟:

1. 訪問服務:SSO客戶端發送請求訪問應用系統提供的服務資源。

2. 定向認證:SSO客戶端會重定向用戶請求到SSO服務器。

3. 用戶認證:用戶身份認證。

4. 發放票據:SSO服務器會產生一個隨機的Service Ticket

5. 驗證票據:SSO服務器驗證票據Service Ticket的合法性,驗證經過後,容許客戶端訪問服務。

6. 傳輸用戶信息:SSO服務器驗證票據經過後,傳輸用戶認證結果信息給客戶端。

CAS也是使用java的spring開發的

用https,安全,須要ssl的安全證書(要買的),這裏CAS要去除https認證讓CAS使用http認證(由於沒錢買ssl啊,沒辦法用https),否則不會有一次登陸處處能夠用的效果

對咱們影響沒有什麼區別,是運維層面了,就是部署的時候會改配置等

亂七八糟的配置很麻煩!!!

因此用SpringSecurity集成

 入口點,有點像接口,這個配置很複雜

 今天實際上就是把tomcat裏面的CAS的頁面的登陸的源換到你網頁裏面

顯示用戶名得掌握,確定用的上,

第十六章(購物車的解決方案)

購物車是web項目,調用購物車的服務

用cookie和redis存購物車

cookie本地購物車,沒登陸的時候存

redis是帳號裏面存的

寫一個新的項目能夠從用戶項目中參考,由於裏面的單點登陸是相通的

cookie在寫在web層比較好

 orderitem購物車明細列表

cart購物車對象

業務邏輯最好放服務層

好處是服務層能夠公用,儘可能寫這裏

設置未登陸的時爲匿名角色

存redis

跳板頁

merge合併(購物車)

 第十七天

跨域請求解決方案

寫訂單結算

當兩個應用協議,以及主機地址(或域名),端口其中有一項不一樣,就認爲他們的域是不一樣的,可是網頁名不一樣不要緊

JS跨域,兩個不一樣的域,在a的應用的js腳本中調用了b的後端地址

默認狀況下JS不能跨域的,爲何?由於安全啊,JSONP跨域跨域解決

可是咱們用流行的官方的跨域解決方案,CORS

IE版本不能低於10

服務端加頭,客戶端也要贊成

更方便的,使用springmvc註解

 爲何個人oerder表不讓主鍵自增?

對於互聯網項目,可能某個表會佔用很大的空間,讓你服務器硬盤滿了怎麼辦?

數據庫分片,把數據庫進行拆分,經過數據庫中間件進行連接,能夠理解成數據庫的集羣

若是採用數據庫自增的話,可能會產生重複的id,數據庫可能物理分離,可是邏輯是一個的

分佈式ID生成解決方案

1UUID(不用,1太長2沒發排序)

2redis(產生自增的序號,主鍵的生成須要訪問redis,對redis有依賴)

3Oracle 數據庫對象-序列(與表無關),只有數據庫用oracle才能用

4程序本身寫算法(不重複),使用分佈式ID生成器

分佈式ID生成器(推特寫的),算法snowflake,雪花算法

第十八天(微信支付)

二維碼生成插件qrious使用

 越細,安全級別越高

用模式2

  1. appid:微信公衆帳號或開放平臺APP的惟一標識
  2. mch_id:商戶號  (配置文件中的partner)
  3. partnerkey:商戶密鑰
  4. sign:數字簽名, 根據微信官方提供的密鑰和一套算法生成的一個加密信息, 就是爲了保證交易的安全性

微信支付接口調用的總體思路:

API要求組裝參數,以XML方式發送(POST)給微信支付接口(URL,微信支付接口也是以XML方式給予響應。程序根據返回的結果(其中包括支付URL)生成二維碼或判斷訂單狀態。

httpclient,模擬瀏覽器的行爲

第十九天

秒殺是單獨寫的 

秒殺技術實現核心思想是運用緩存減小數據庫瞬間的訪問壓力!讀取商品詳細信息時運用緩存,當用戶點擊搶購時減小緩存中的庫存數量,當庫存數爲0時或活動期結束時,同步到數據庫。 產生的秒殺預訂單也不會馬上寫到數據庫中,而是先寫到緩存,當用戶付款成功後再寫入數據庫。

顯示秒殺商品列表環境搭建

1新建模塊module,創服務接口用jar,選擇父類,pom.xml引入pojo的依賴

2服務實現,用war,加依賴,修改端口等,修改web.xml

3加spring配置文件夾,修改端口,修改dubbox(前三個是服務層)

4web層,建war,加依賴,修改端口

5加web.xml並修改

6加spring配置文件夾,修改dubox服務(記得spring的安全框架的東西要在,記得檢查)

7拷靜態頁面到web層的src/webapp/web-inf下面

8拷AngularJS等插件到web層的src/webapp/plugins

9代碼生成器

10建包,生成的文件拷過去

11把pojo實現可序列化接口

開始寫後端代碼

1在服務層接口添加方法,而後在服務層實現

2在服務層條件查詢秒殺商品(審覈經過,庫存大於0,開始日期小於等於當前日期,截止日期大於等於當前日期)

3在web層引入服務層

4該寫前端了,在web層,把base.js拷入src/webapp/js下

5src/webapp/js下建立service文件夾,而後建立文件aaaservice.js,調用後端控制層代碼

6src/webapp/js下建立control文件夾而後建立文件aaacontrol.js,調用前端服務層層代碼

7寫頁面,先引入js,秒殺控制層js,秒殺服務層js,base,js,angular.min.js的頭

8在<body>裏面寫ng-app="項目名",ng-control="引入的控制層的名",ng-init="初始化查詢?"

9在須要的地方添加ng-repeat

10在須要的地方寫變量{{pojo.xxx}}綁定變量

11pojo安裝下,inteface安裝下,service啓動下,web啓動下

12改錯誤,而後去web.xml改跳轉頁面

13由於以前從數據庫拿效率低,服務器壓力大,因此把第一次數據庫查出來的遍歷放進緩存()

14去控制層注入查出來的數據變量

接下來寫秒殺詳情頁面,從緩存中讀取出商品id,返回一個entity

 15去web層寫前端,把id傳回來

16接收id,而後傳id

不寫了麻煩本身看

#?id={{}}在連接中傳參數

定時操做,純前端解決,這裏用angularJS

$interval

而後秒數用方法轉格式,用方法converTiomeString

 第二十天

任務調度springtask,自動服務調用

在企業級應用中,常常會制定一些「計劃任務,即在某個時間點作某件事情,核心是以時間爲關注點,即在一個特定的時間點,系統執行指定的一個操做。常見的任務調度框架有QuartzSpringTask等。(Quartz會複雜一些)

cron表達式,定義時間規則,能夠百度生產器

MavenProfile,實現不一樣環境的動態切換

Profile用戶配置文件

在common裏面寫dubbox,註冊中心地址集中配置,爲後面集羣搭建方便

數據庫MongoDB

MongoDB 是一個跨平臺的,面向文檔的數據庫,是當前 NoSQL 數據庫產品中最熱門的一種。它介於關係數據庫和非關係數據庫之間,是非關係數據庫當中功能最豐富,最像關係數據庫的產品。它支持的數據結構很是鬆散,是相似JSON   BSON 格式,所以能夠存儲比較複雜的數據類型。

何時用呢??通常,數據量大的時候,或者對數據庫頻繁寫入的時候,數據量價值不是特別高的狀況下

好比訂單,什麼的很重要,就不能用mongodb,好比評價,足跡,日誌就能夠用這個mongodb

和redis比,redis能存的不大啊,這個大啊

MongoDB簡介

3.1什麼是MongoDB

MongoDB 是一個跨平臺的,面向文檔的數據庫,是當前 NoSQL 數據庫產品中最熱門的一種。它介於關係數據庫和非關係數據庫之間,是非關係數據庫當中功能最豐富,最像關係數據庫的產品。它支持的數據結構很是鬆散,是相似JSON   BSON 格式,所以能夠存儲比較複雜的數據類型。

MongoDB 的官方網站地址是:http://www.mongodb.org/

  

 MongoDB特色

MongoDB 最大的特色是他支持的查詢語言很是強大,其語法有點相似於面向對象的查詢語言,幾乎能夠實現相似關係數據庫單表查詢的絕大部分功能,並且還支持對數據創建索引。它是一個面向集合的,模式自由的文檔型數據庫。

具體特色總結以下:

(1)面向集合存儲,易於存儲對象類型的數據

(2)模式自由

(3)支持動態查詢

(4)支持徹底索引,包含內部對象

(5)支持複製和故障恢復

(6)使用高效的二進制數據存儲,包括大型對象(如視頻等)

(7)自動處理碎片,以支持雲計算層次的擴展性

(8)支持 PythonPHPRubyJavaCC#JavascriptPerl C++語言的驅動程序,社區中也提供了對 Erlang .NET 等平臺的驅動程序

(9) 文件存儲格式爲 BSON(一種 JSON 的擴展)

MongoDB體系結構

MongoDB 的邏輯結構是一種層次結構。主要由:

文檔(document)、集合(collection)、數據庫(database)這三部分組成的。邏輯結構是面向用戶

的,用戶使用 MongoDB 開發應用程序使用的就是邏輯結構。

1MongoDB 的文檔(document),至關於關係數據庫中的一行記錄。

2)多個文檔組成一個集合(collection),至關於關係數據庫的表。

3)多個集合(collection),邏輯上組織在一塊兒,就是數據庫(database)。

4)一個 MongoDB 實例支持多個數據庫(database)。

 

品優購電商系統部署

第一天(集羣解決方案)

集羣,一臺計算機承載的能力是有限的,找一堆來分擔

節點,集羣中的一個計算機

搭建三種

1Zookeeper集羣

2SolrCloud集羣

3RedisCluster集羣

 

集羣的特色

 

集羣擁有如下兩個特色:

 

1.   可擴展性:集羣的性能不限制於單一的服務實體,新的服務實體能夠動態的添加到集羣,從而加強集羣的性能。

 

2.   高可用性:集羣當其中一個節點發生故障時,這臺節點上面所運行的應用程序將在另外一臺節點被自動接管,消除單點故障對於加強數據可用性、可達性和可靠性是很是重要的。

 

集羣的兩大能力

 

集羣必須擁有如下兩大能力:

 

1.     負載均衡:負載均衡把任務比較均勻的分佈到集羣環境下的計算和網絡資源,以提升數據吞吐量。

 

2.     錯誤恢復:若是集羣中的某一臺服務器因爲故障或者維護須要沒法使用,資源和應用程序將轉移到可用的集羣節點上。這種因爲某個節點的資源不能工做,另外一個可用節點中的資源可以透明的接管並繼續完成任務的過程,叫作錯誤恢復。

 

負載均衡和錯誤恢復要求各服務實體中有執行同一任務的資源存在,並且對於同一任務的各個資源來講,執行任務所需的信息視圖必須是相同的。

 

集羣與分佈式的區別

相同點:

分佈式和集羣都是須要有不少節點服務器經過網絡協同工做完成總體的任務目標。

不一樣點:

分佈式是指將業務系統進行拆分,即分佈式的每個節點都是實現不一樣的功能。而集羣每一個節點作的是同一件事情。

Zookeeper集羣,提供分佈式鎖服務,用以協調分佈式應用,因此說zookeeper是分佈式應用的協做服務

選舉,看中間

Zookeeper集羣簡介

2.1.1爲何搭建Zookeeper集羣

大部分分佈式應用須要一個主控、協調器或者控制器來管理物理分佈的子進程。目前,大多數都要開發私有的協調程序,缺少一個通用機制,協調程序的反覆編寫浪費,且難以造成通用、伸縮性好的協調器,zookeeper提供通用的分佈式鎖服務,用以協調分佈式應用。因此說zookeeper是分佈式應用的協做服務。

 

zookeeper做爲註冊中心,服務器和客戶端都要訪問,若是有大量的併發,確定會有等待。因此能夠經過zookeeper集羣解決。

 

真實的集羣是搭建在服務器上的,測試時候啓動十幾個虛擬機內存吃不消,因此咱們會搭建僞集羣,把全部服務器搭建在一臺虛擬機上,用端口區分

爲了提升選舉效率,儘量奇數

FTP遠程鏈接

 

SolrCloud集羣

dev開發環境,pro生產環境

SolrCloud(solr )Solr 提供的分佈式搜索方案,當你須要大規模,容錯,分佈式索引和檢索能力時使用 SolrCloud。當一個系統的索引數據量少的時候是不須要使用 SolrCloud的,當索引量很大,搜索請求併發很高,這時須要使用 SolrCloud 來知足這些需求。

SolrCloud 是基於 Solr Zookeeper的分佈式搜索方案,它的主要思想是使用 Zookeeper做爲集羣的配置信息中心。

 

什麼是Redis-Cluster

 

爲什麼要搭建Redis集羣。Redis是在內存中保存數據的,而咱們的電腦通常內存都不大,這也就意味着Redis不適合存儲大數據,適合存儲大數據的是Hadoop生態系統的Hbase或者是MogoDBRedis更適合處理高併發,一臺設備的存儲能力是頗有限的,可是多臺設備協同合做,就可讓內存增大不少倍,這就須要用到集羣。

 

Redis集羣搭建的方式有多種,例如使用客戶端分片TwemproxyCodis等,但從redis 3.0以後版本支持redis-cluster集羣,它是Redis官方提出的解決方案Redis-Cluster採用無中心結構,每一個節點保存數據和整個集羣狀態,每一個節點都和其餘全部節點鏈接。

 

客戶端與 redis 節點直連,不須要中間 proxy .客戶端不須要鏈接集羣全部節點鏈接集羣中任何一個可用節點便可

 

全部的 redis 節點彼此互聯(PING-PONG 機制),內部使用二進制協議優化傳輸速度和帶寬.

 

容錯機制-投票

 

(1)選舉過程是集羣中全部master參與,若是半數以上master節點與故障節點通訊超過(cluster-node-timeout),認爲該節點故障,自動觸發故障轉移操做.  故障節點對應的從節點自動升級爲主節點

 

(2)何時整個集羣不可用(cluster_state:fail)? 

 

若是集羣任意master掛掉,且當前master沒有slave.集羣進入fail狀態,也能夠理解成集羣的slot映射[0-16383]不完成時進入fail狀態

 

 

次日

Mycat數據庫中間件

Nginx

keepalived 是集羣管理中保證集羣高可用的一個服務軟件,用來防止單點故障。

Keepalived 的做用是檢測 web 服務器的狀態,若是有一臺 web 服務器死機,或工做出現故障,Keepalived 將檢測到,並將有故障的 web 服務器從系統中剔除,當 web 服務器工做正常後 Keepalived 自動將 web 服務器加入到服務器羣中,這些工做所有自動完成,不須要人工干涉,須要人工作的只是修復故障的 web 服務器。

反向代理用於服務端的

正向代理用於客戶主要

web工程因爲nginx作反向代理實現負載均衡

服務工程由zookerper負責負載均衡

第三天

Docker容器技術,客戶端是操做服務端的

虛擬機已死,容器纔是將來

鏡像:至關容器的源代碼,裏面有的都裝好了,實際上是一組文件的集合

用註冊中心來保存用戶的鏡像

鏡像是靜態的東西,至關模板,用這個模板建立容器(至關於容器是個副本),容器是運行的東西

Docker建在linux系統上,(官方推薦是Ubuntu上)

使用CentOS.x以上的版本

容器啓動的基礎是鏡像,docker引導鏡像成爲內存的空間,容器

拉取鏡像,就是下載鏡像

相關文章
相關標籤/搜索