Java知識分享網 - 輕松學習從此開始!????

Java知識分享網

Java1234官方群25:java1234官方群25
Java1234官方群25:838462530
        

實戰springboot+CAS單點登錄課程(免費領取)

SpringBoot打造全棧在線教育平臺實戰課程

畢設代做論文包查重聯系人QQ:1982956321畢設大神 畢設代做論文包查重

66套java實戰課程無套路領取

Java1234 VIP課程

領取微信掃碼登錄Java實現視頻教程

Java1234至尊VIP(特價活動)

java開發面試必問 PDF 下載


分享到:
時間:2020-11-13 09:43來源:http://www.nukdnfhq.buzz 作者:轉載  侵權舉報
java開發面試必問 PDF 下載
失效鏈接處理
java開發面試必問  PDF 下載



本站整理下載:
提取碼:1m42 
 
 
相關截圖:
 
主要內容:



(1)項目名稱:優配良品網上商城
?開發時間:2016/12-至今
?項目描述:
項目框架:  
后臺: shiro + Spring + Mybatis + SpringMVC(基于注解) + Bootstrap +  OScache + Solr + ActiviMQ(消息隊列) + dubbo + zookeeper +  Echarts + WebService
前臺: Spring + Mybatis + SpringMVC(基于注解) + FreeMarker + Redis + Solr集群 + spring定時器 + jQquery
該項目主要有會員注冊及登錄、商品分類展示、商品信息檢索、購物車、生成訂單、訂單查詢、商品排行、反饋留言、商品類別管理、商品品牌展示、商品管理、會員管理、訂單管理、新聞管理等。包括嚴格的權限管理部分,客服登錄系統后可以對客戶所下訂單進行查詢和取消備注等操作,在取消的同時會對客戶所下訂單進行積分,款項返還等操作。
?開發環境:idea + tomcat7.0 + jdk1.7 + Maven + git
?使用技術:SpringMVC4.0 + Spring3 + Mybatis + dubbo + zookeeper + ActiviMQ + Solr + Nginx + FreeMarker + ECharts  
?運行環境:linux + Tomcat + Mysql + Redis + MongoDB + JDK1.7
?本人角色:高級程序員
?責任描述:在項目中,我參與架構選型與搭建框架,技術攻關,并且負責后臺權限管理、商品管理、報表統計(ECharts)、商品信息檢索引擎搭建(Solr)及部分核心代碼的編寫(大數據量poi導出、shiro安全認證整合)。負責前臺的產品詳情頁(FreeMarker,Redis)、購物車及訂單支付(ActiviMQ + WebService)、產品評論(MongoDB)、支付成功的短信提醒、服務器搭建(Nginx負載均衡Tomcat7.0集群)等,后期還對項目進行優化和安全測試,在項目中擔任高級工程師,并帶了一個新人。
項目總體采用的是Dubbo+zookeeper的分布式框架,可以理解問拆分成了三個項目,前端項目、服務端項目和緩存項目,前端項目包含頁面、靜態資源和控制層;服務端項目包含業務層和數據庫操作層;緩存項目緩存前端項目和服務端項目公用的數據。用戶請求進入前先通過負載均衡設備進行請求分發,采用nginx的負載均衡實現動靜分離,首先呢我們使用nginx+keepalived雙機熱備的方式來實現負載均衡調度器的高可用性,其中keepalived主要是解決了nginx的單點故障,用來檢測服務器狀態,如果一臺web服務器掛了,keepalived將檢測到,并將有故障的機器剔除掉,然后人工進行修復。通過nginx中server標記下添加location規則信息,將css,js這些動態資源交給nginx來處理,將動態請求通過proxy_pass
介紹下dubbo和zookeeper:
Duboo是一個分布式框架,zookeeper是duboo生產者暴露服務的注冊中心。起一個調度和協調功能,當然注冊中心也可以用redis 或者duboo自帶的Multicast 來注冊。
Duboo 通信方式采用長鏈接方式,所以當spring啟動后鏈接就接通,duboo的消費者和生產者就可以直接調用。性能上高于其他http協議的請求。(httpclient數據屬于短請求,一次請求,一次響應,dubbo通道一旦建立(一旦連接),一直處于聯通狀態)dubbo基于tcp/ip協議的,交互性能非常高,支持匿名傳參,隱式傳參,泛化調用(隱式傳參:不是以括號的形勢傳參,將參數存儲到當前請求里面,到了服務端再從請求里面拿出來,request不能傳參。泛化調用:是指采用一個service接口和一個service實現類來實現多個方法的調用)當時是為了解決單個服務器站點的壓力,將項目拆分成頁面加controller屬于消費者,service+dao屬于生產者,所有生產者暴露的端口都注冊在zookeeper里面。這時候,消費者要調用生產者去zookeeper中取就可以了。所以我們部署了多套生產者,所有的消費者的請求可以由多個生產者去提供,具體由哪個生產者提供可以由zookeeper的配置去決定。如果某個生產者掛掉,zookeeper會加壓力導向其他生產者,當這個生產者恢復狀態的時候。Zookeeper會重新啟用它。因為我們用n的執行,如果想讓單個tomcat執行的action---service—dao 請求又多個tomcat來執行就可以使用 zookeeper+duboo  這時候一般是一個tomcat里面部署的是jsp+action所有的service接口都注冊到了zookeeper里面,action去zookeeper里面通過duboo去調用哪個 service+dao 的組合。而且service+dao的組合可以配置多套。一套掛了其他的service+dao組合可以繼續使用
dubbo框架的體系結構有5個核心組成部分,分別是提供者provider,它的作用是為消費者提供數據。注冊中心registry,它的作用是用來注冊和發現服務。消費者consumer,它的作用是調用遠程提供者提供的服務。監控中心Monitor用來統計服務的調用次數以及調用時間,還有container用來充當容器來加載,運行服務提供者。新建dubbo-provider.xml配置文件,通過dubbo:application配置提供者應用名,通過dubbo:registry配置注冊中心的地址,通過dubbo:protocol配置協議,以及通過dubbo:service來暴露要發布的接口。
最后我們在需要使用dubbo接口的項目中配置消費者信息,新建dubbo-consumer.xml文件,通過dubbo:application配置消費者應用名,通過dubbo:registry指明要訂閱的注冊中心地址,通過dubbo:reference指定要訂閱的服務接口。除此之外考慮到dubbo的健壯性和性能我們對它的參數項進行的調優。通過在dubbo:protocol中threadpool="fixed" threads="200"來啟用線程池,通過在dubbo:service中connections=5來指定建立長連接的數量。
配置dubbo集群來提高健壯性以及可用性。dubbo默認的集群容錯機制是Failover即失敗自動切換,默認的重試次數為2,可以通過retries調整。dubbo默認的負載均衡策略是Random隨機,可以按權重設置隨機概率。我們在寫完dubbo提供者之后,為了測試接口的正確性,我們會進行直連測試。首先會在提供者端,通過將dubbo:registry的register設置為false,使其只訂閱服務而不注冊現在正在開發的服務;
在消費者端,通過設置dubbo:reference的url,直連提供者進行測試。被動說:
所謂dubbo集群就是將dubbo的提供者部署多份,在不同的機器上或者說在同一臺機器上用不同的端口號。從而在啟動時可以向注冊中心進行注冊,這樣結合dubbo的集群容錯策略以及負載均衡策略可以提高可用性。
dubbo負載均衡策略:隨機,輪詢,最少活躍調用數。
dubbo的集群容錯:失敗自動切換,快速失敗,失敗安全。
dubbo+zookeerper怎樣實現session共享(在消費端):
我們的消費者只有一個模塊,所有的請求首先都是進入這個模塊里面,生產者有多個模塊,session都在消費者這個action里面,所有的請求都是首先進入這個項目里面,我們的生產者有多個模塊。如果有多個消費者的情況下,會存在session共享問題,我們可以將session的id作為key值,用戶對象作為value值存儲到redis里面。當每次發送的請求的時候,拿著瀏覽器的session的id去redis里面取,如果能取到,證明用戶已經存在,如果不能取到,就重新登錄。
為什么用dubbo+zeekeeper?介紹一下?
實現了分布式部署,如果不用的話,傳統的項目就是action>servcie>dao,有三部分的請求,單個兒tomcat,用了dubbo+zookeerper后,分成了消費者和生產者,劃分成不同的模塊,有幾個模塊就有幾個tomcat,大大降低了tomcat的壓力,而且后期隨著訪問量的增加,我們可以不斷的增加生產者,每個單個web服務節點者所受到的壓力明顯降低。
生產者和消費者是怎么交互的?
dubbo首先向zookeerper暴露端口,消費者向它們這邊訂閱服務通過zookeerper,消費者發送請求,zookeerper用來調度,調度的方式有三種,輪循,隨機,把這些請求都拿給生產者,如果其中一個生產者掛掉,如果有新的生產者,會把請求分發給新的生產者。
你看過dubbo底層嗎?
生產者跟消費者之間相當于長連接長請求,傳統的request請求,response響應,請求一次,響應一次,開關一次,dubbo是基于 tcp/ip協議的,其他的源碼閑的時候,基本上通過maven來看過沒有刻意的去了解,因為平時這個業務開發狀況很繁瑣。
zookeeper的作用:
dubbo是把項目實現分離,分為消費端跟服務端,在消費者這邊的配置文件中添上zookeeper地址,讓它連上zookeeper,每個服務端都暴露一個端口給zookeeper,這樣就實現服務端在zookeeper中注冊,消費者發送請求給zookeeper,zookeeper接收請求,zookeeper再分發給這些服務端。
項目安全性怎么解決?
是指攻擊安全還是訪問量過大安全還是數據安全?
如果是攻擊性的話,input框都采用了js驗證,用java代替重復效驗,避免輸入不必要的空格或者sql注入。
如果是訪問的安全的話,頁面做了大量的頁面靜態化,緩存,通常訪問量不會增加服務器造成負擔。
如果是數據安全這一塊的話,系統用的是linux,數據庫的賬號密碼都做了加密處理。
如果是數據遺失或是自然災害,數據庫做了讀寫分離,而且一個主庫,兩個從庫,其中一個從庫做了備份,而且是定時備份。
在登錄過程中,為了防止程序直接登錄,也做了一些驗證碼,包括支付的資金賬戶安全,我們的系統沒有錢,主要是通過超鏈接將錢存儲到網絡支付寶qq賬號,最主要還是支付寶的安全和網民的安全,而且這個賬號只能出不能進。
購物車在redis中是怎么存的?
   我們的購物車,用的是redis 來實現的。 當加入購物車的時候 用戶id作為redis 的key,產品集合作為redis的value。商品存的是 ,商品id 商品名稱,和商品購買數量。
   當加入商品到購物車的時候,首先判斷當前用戶id對應的的產品集合里面是否含有當前產品,有則數量加一。沒有則新添加該商品。
 
問靜態化的商品詳情頁面,如果數據庫價格變動,頁面會重新生成嗎?
 答:不會重新生成。我們的價格和數量是來自redis緩存的。一般我們將商品更新到,redis中,key是表名加id例如  sm_product_proid  , value是產品對象。存儲價格數量。
問購物車的商品會存到redis里面,假如有一件襯衣賣68,有一千萬人將其加入購物車,而第二天老板將數據庫價格改成88了,那購物車里面的價格會變化嗎?
  答:會變化。我的購物車用戶id做為key,value是產品集合,而且默認過期時間是7天,產品集合只存儲產品id ,數量,名稱。 當顯示該商品的時候我需要用產品id 去其他redis 庫里面獲取價格。其他的redis庫里面已經存儲了所有產品id作為key,value是商品 價格數量。當老板變動數據庫價格的時候我只需要更新,單獨存儲的這邊redis產品。
solr搜索引擎:
在整個項目中實現商品搜索功能電商項目中,因為用戶有時候不是多么清楚他所需要的東西的名稱或者商店的名稱,有時候僅僅是只知道他所需要的商品是干嘛用的,又或者是有多個要求,為了滿足用戶的諸多需求更準確的查詢到用戶所需要的商品,所以就用到了Solr搜索引擎
solr是一個基于Lucene的全文搜索服務器,相比Lucene更高效、使用更便捷,在進行模糊匹配的時候,他可以 用來替代數據庫中的like ,從而在匹配準確性以及性能進行大幅度的提高。因為官方的分詞器對中文支持不好所以使用了第三方的IK分詞器來進行分詞。在建立索引的時候我們通過在schema.xml配置IK分詞器來完成中文分詞。從而實現了高亮顯示關鍵詞,分頁,排序,多字段,多條件的高性能搜索。
其實目前有很多優秀的中文分詞組件 :像mmseg4j,IK Analyzer ,Paoding
通過查詢資料發現用 IKAnalyzer比較好IK 比其他中文分詞維護的勤快,和 Solr 集成也相對容易。
其中我們在配IK分詞器的時候,當時遇到了三個問題:
分詞器版本與solr服務版本的匹配:
當時用的solr是4.10.4版本的因為這個版本比較好用,穩定,5.以上的版本bug比較多,配IK分詞器的2012FF_u1版本,開始時用的是u6,然后配完效果出不來,上網查了好多資料,又問了之前加的一個搜索引擎群,才知道是版本問題,u3,u5,u6的都不好用,只有u1的和solr4.10版本的合適,改完之后問題確實解決了
加入分詞器的schema文件要把version改為1.5基本的CRUD操作都可以。
但是搜索卻只能全字匹配或者只能單個字符匹配出結果。這是絕對不能容忍的。定位問題接近了一天,找有經驗的同事給 排查也沒排查出來問題。最后我自己一點一點比對multicore文件夾下的配置文件跟F:\solr\solr-4.6.0\example\solr \collection1這個文件夾下的配置文件的配置區別。當我把schema.xml的version屬性從1.1升到跟collection1下的相同文件的1.5一致之后。重啟服務器,問題解決了!、
分詞器的詞典編碼格式為UTF-8無BOM格式
在從數據中取數據生成索引的時候,因為表中的數據量比較大,防止一次取出所導致內存溢出問題,我采用了分段批量提取的方式進行,
此外我們為了提高solr搜索的性能對其進行了主從配置。
1. 我們solr使用的是solr4.7版本
2. 通過修改schema.xml來添加要進行索引的字段以及增加ik分詞器
3. 通過solrj將數據庫中的數據生成solr中的索引文件,注:solrj是java程序調用solr服務所用的jar包。
4. 通過在solrconfig.xml中配置requestHandler name=“/Replication”來進行主從同步的配置,在從solr中通過masterUrl指明要從哪些主solr服務器中同步數據
我們為了提高用戶體驗度還使用了solr的spellCheck可以用于查詢輸入的自動完成功能auto-complete。他是基于動態代碼方式建立內容,suggestion可通過讀文件方式建立內容,并有點擊率排序。使用facet在查詢結果上根據分類添加了count信息, 然后用戶根據count信息做進一步的查詢, facet的主要好處就是可以任意對搜索條件進行組合, 避免無效搜索, 改善搜索體驗.
購物車實現cookie+redis:
一、未登錄狀態下添加商品到購物車 
在不登陸的情況下也可以添加購物車。把購物車信息寫入cookie。 
優點: 
1、不占用服務端存儲空間 
2、用戶體驗好。 
3、代碼實現簡單。 
缺點: 
1、cookie中保存的容量有限。最大4k 
2、把購物車信息保存在cookie中,更換設備購物車信息不能同步
實現思路:
(1) 從cookie中獲取商品列表信息(單獨提出來寫成個通用的方法) 
(2) 遍歷購物車列表,判斷需要添加的商品在購物車列表是否存在 
(3) 商品存在的話,那么取出該商品原來的數量+添加的數量作為該商品現在的數量 
(4) 如果商品不存在,那么調用服務,根據傳來的商品id查詢商品數量,設置商品的數量為頁面傳來的數量,取商品的第一張圖片(購物車列表只展示一張圖片)。 
(5) 把修改后的購物車列表重新存入到cookie中 
(6) 返回邏輯視圖”cartSuccess”
2、展示購物車列表
單擊“去購物車結算按鈕”向服務端發送請求,服務端應該返回邏輯視圖”cart” 
請求地址:8090/cart/cart.html 
返回邏輯視圖:”cart”也就是購物車列表頁面
3、登錄狀態下購物車列表頁面修改商品數量
購物車列表頁面單擊”+”,”-”會向服務端發送ajax請求。 
頁面需要根據調整的數量重新顯示商品總計(已經實現了也就是輸入框的值*價格)和小計(用js,待實現) 
服務端要求修改cookie中對應商品的數量
4、未登錄狀態下刪除購物車商品 
(1)從cookie中獲取購物車列表 
(2)遍歷,查找到要刪除的商品 
(3)將該商品從購物車列表移除 
(4)更新后的購物車列表重新寫入cookie 
(5)重定向到購物車列表頁面


 

------分隔線----------------------------
鋒哥公眾號


鋒哥微信


關注公眾號
【Java資料站】
回復 666
獲取 
66套java
從菜雞到大神
項目實戰課程
山东麻将怎么开牌 09年火箭76人 棋牌游戏中心 25选5开奖走势图 福建11选五预测任选5 下载免费单机捕鱼达人 白城麻将吉祥棋牌下 信誉炸金花下载 湖南麻将红中飞怎么打 4887管家婆结果开奖结果小说 贵州省11选5开奖走势图 麻将来了官网下载 ewin棋牌网页登录 泳坛夺金和尾走势图 重庆快乐十分人工计划 云南11选五5最大遗漏查询 银河棋牌安全吗