品優購專案筆記day01——(SOA架構,Dubbox及小demo,Zookeeper,專案打包,管理中心linux環境部署與專案架構搭建)
此部落格是為了記錄業餘時間每一天課程的所學
1.什麼是SOA架構
SOA是Service-Oriented Architecture的首字母簡稱,它是一種支援面向服務的架構樣式。從服務、基於服務開發和服務的結果來看,面向服務是一種思考方式。其實SOA架構更多應用於網際網路專案開發。
為什麼網際網路專案會採用SOA架構呢?隨著網際網路的發展,網站應用的規模不斷擴大,常規的垂直應用架構已無法應對,分散式服務架構以及流動計算架構勢在必行,迫切需一個治理系統確保架構有條不紊的演進。
這個專案用的dubbox就是SOA解決方案的一種
2.品優購架構圖
3.框架組合
品優購採用當前流行的前後端程式設計架構。
後端框架採用Spring +SpringMVC+mybatis +Dubbox 。前端採用angularJS + Bootstrap。
4.Dubbox
Dubbox 是一個分散式服務框架,其前身是阿里巴巴開源專案Dubbo ,被國內電商及網際網路專案中使用,後期阿里巴巴停止了該專案的維護,噹噹網便在Dubbo基礎上進行優化,並繼續維護,為了與原有的Dubbo區分,故將其命名為Dubbox。
Dubbox 致力於提供高效能和透明化的RPC遠端服務呼叫方案,以及SOA服務治理方案。簡單的說,dubbox就是個服務框架,如果沒有分散式的需求,其實是不需要用的,只有在分散式的時候,才有dubbo
x這樣的分散式服務框架的需求,並且本質上是個服務呼叫的東東,說白了就是個遠端服務呼叫的分散式框架。節點角色說明:
· Provider: 暴露服務的服務提供方。
· Consumer: 呼叫遠端服務的服務消費方。
· Registry: 服務註冊與發現的註冊中心。
· Monitor: 統計服務的呼叫次調和呼叫時間的監控中心。
· Container: 服務執行容器。
呼叫關係說明:
· 0. 服務容器負責啟動,載入,執行服務提供者。
· 1. 服務提供者在啟動時,向註冊中心註冊自己提供的服務。
· 2. 服務消費者在啟動時,向註冊中心訂閱自己所需的服務。
· 3. 註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連線推
送變更資料給消費者。
· 4. 服務消費者,從提供者地址列表中,基於軟負載均衡演算法,選一臺提供者進行呼叫,
如果呼叫失敗,再選另一臺呼叫。
· 5. 服務消費者和提供者,在記憶體中累計呼叫次數和呼叫時間,定時每分鐘傳送一次統計
資料到監控中心。
5.註冊中心Zookeeper
官方推薦使用 zookeeper 註冊中心。註冊中心負責服務地址的註冊與查詢,相當於目錄服務,服務提供者和消費者只在啟動時與註冊中心互動,註冊中心不轉發請求,壓力較小。
Zookeeper 是 Apacahe Hadoop 的子專案,是一個樹型的目錄服務,支援變更推送,適合作為Dubbox 服務的註冊中心,工業強度較高,可用於生產環境。
6.註冊中心安裝到linux環境並啟動
1.開啟VMWARE,將雙擊字尾為vmx的映象檔案(映象中JDK裝好了,並且dubbox的jar也部署安裝了)
2.在VMWARE中把網路介面卡改為僅主機模式,把子網IP改為25網段,後面要連FASTDNS,也是25網段
3.開啟虛擬機器,登陸賬戶名 root 密碼 itcast
開啟終端,輸入ipconfig檢視伺服器ip,這裡為192.168.25.131
4.工作中是需要客戶端連線linux伺服器的,開啟CRT(還可以用XSHELL等)
new session 輸入IP使用者名稱密碼進行連線
5.Alt+P 進入SFTP ,輸入put d:\setup\zookeeper-3.4.6.tar.gz 上傳(或者直接拖上來)
6.tar -zxvf zookeeper-3.4.6.tar.gz 解壓
7.在zookeeper資料夾下建立data資料夾
mkdir data
8.進入conf目錄 ,把 zoo_sample.cfg 改名為 zoo.cfg
cd conf
mv zoo_sample.cfg zoo.cfg
9.然後修改配置
vim zoo.cfg --開啟配置檔案
點選 i 進入插入模式
將dataDir配置的路徑改為我們建立的data資料夾的路徑
dataDir=root/zookeeper-3.4.6/data
然後點Esc退出,輸入 :wq 進行儲存
10.啟動zookeeper服務
./zkServer.sh start 進行啟動
./zkServer.sh stop 停止
./zkServer.sh status 檢視狀態
7.dubboxjar包安裝與部署(用的映象所以這個步驟不需要)
先將dubbo-2.8.4.jar包放到d:\setup, 然後輸入命令
mvn install:install-file -Dfile=d:\setup\dubbo-2.8.4.jar -DgroupId=com.alibaba -DartifactId=dubbo -Dversion=2.8.4 -Dpackaging=jar
8.配置dubbox約束
9.dubbox小demo編寫
(1).服務端
1.建立maven工程,war,把pom.xml內容考進來,修改埠號為8081
2.發現報錯,新建WEB-INF資料夾,把web.xml考進來
3.程式碼
新建介面
package com.itheima.demo.service;
public interface UserService {
public String getName();
}新建實現類(注意Service導的是dubbo的包,代表是個對外發布的服務)
package com.itheima.demo.service.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.itheima.demo.service.UserService;@Service
public class UserServiceImpl implements UserService {@Override
public String getName() {
// TODO Auto-generated method stub
return "juejue";
}}
4.把applicationContext-service.xml考到resources下,注意命名與xml中載入的形式相符加入如下配置,應用名稱是專案名,註冊中心地址是我們ifconfig查的ip,服務地址是介面所在包名
<!-- 引用dubbo 服務 -->
<!-- 當前應用名稱,表明是一個服務 -->
<dubbo:application name="dubboxdemo-service" />
<!-- 註冊中心地址 -->
<dubbo:registry address = "zookeeper://192.168.25.131:2181"/>
<!-- 包掃描,掃描服務提供的地址 -->
<dubbo:annotation package = "com.itheima.demo.service"/>5.執行服務
右鍵專案 --》run as --》maven build... -->Goals裡輸入 tomcat7:run(報錯可能是因為註冊中心zookeeper沒啟動)
(2)呼叫端
1.建立maven工程,war,把pom.xml內容考進來,修改埠號為8082
2.發現報錯,新建WEB-INF資料夾,把web.xml考進來
3.把服務端的service介面包拷過來,然後新增controller層,這裡要使用reference標籤
4. <!-- 當前應用名稱 -->
springMvc.xml中配置如下
<dubbo:application name="dubboxdemo-web" />
<!-- 註冊中心地址 -->
<dubbo:registry address="zookeeper://192.168.25.130:2181"/>
<!-- 包掃描,掃描服務消費方的地址 -->
<dubbo:annotation package="com.itheima.demo.controller" />5.執行服務
右鍵專案 --》run as --》maven build... -->Goals裡輸入 tomcat7:run
效果如下,說明成功呼叫服務
10.管理中心專案部署到linux伺服器上
有個介面方便對服務的檢視,兩種方式,在配套軟體的懶人資源裡找到
2.找到dubbo-admin所在路徑,打成war包,這樣就可以在target資料夾中找到
把版本去掉,改名為dubbo-admin.war(改了方便點)
3.然後上傳到linux伺服器上
alt+p 切換為檔案上傳模式 --> put D:\setUp\dubbo-admin.war 上傳到根目錄 -->
4.部署
put D:\setUp\apache-tomcat-7.0.52.tar.gz 把tomcat也傳上來 --》將tomcat解壓 tar -zxvf apache-tomcat-7.0.52.tar.gz --》mv dubbo-admin.war apache-tomcat-7.0.52/webapps 將管理中心專案的war包放在tomcat的webapps下 就部署好了!
5.訪問管理中心
然後就可以檢視服務,服務的提供者與消費者等資訊了
10.工程結構分析與設計
最終完整的工程結構如下:既按層分也按業務分
shop-web:商家管理後臺,manager-web:運營商管理後臺
工程說明:
pinyougou-common 把所有工程都要用到的東西都放到common裡,比如工具類
pinyougou-parent 聚合工程 定義所有要用到jar的版本
pinyougou-pojo 通用實體類層
pinyougou-dao 通用資料訪問層
pinyougou-xxxxx-interface 某服務層介面 web與service都會引用interface,就不用像demo那樣寫兩次介面類了
pinyougou-xxxxx-service 某服務層實現
pinyougou-xxxxx-web 某web工程
11.建立資料庫表
執行資原始檔夾中pinyougou-db.sql
12.搭建框架
建立父工程,pinyougou-parent pom工程,在第一天搭建中拷貝pom.xml,定義相關依賴的版本號
下面建立工程時父工程都選擇pinyougou-parent
新建maven module pinyougou-pojo jar工程
新建maven module pinyougou-dao jar工程
新建maven module pinyougou-dao jar工程
新建maven module pinyougou-common jar工程
新建maven module pinyougou-sellergoods-interface jar工程 //商家商品介面
新建maven module pinyougou-sellergoods-service war工程 //服務,要部署到tomcat所以war
新建maven module pinyougou-manager-web war工程 //運營商管理後臺
新建maven module pinyougou-shop-web war工程 //商家管理後臺
將配置檔案都拷進去,然後新增模組間的依賴
dao依賴pojo,service依賴dao,web與service都依賴interface,interface依賴pojo
如果分了幾個版本找不到當前版本就maven reposoitories下重建下索引,然後不同service與web埠
統一配置9001 9101 9002 9102這樣,方便記
同時跑很多服務時要加上這一行,不同服務配不同埠
執行子模組時如果報缺少依賴的錯,先把父專案install下
13.逆向工程實體類與資料訪問層 //記得改資料庫名與密碼
把生成的檔案考到對應專案的resources資料夾下,
實體類除example類都要實現serializable可序列化介面,因為要在網路上傳輸
14.後端程式碼 //使用rest'Cont'ro'ller註解就相當於controller+responsebody
(1)服務層介面
在pinyougou-sellergoods-interface 工程建立BrandService介面
package com.pinyougou.sellergoods.service;
import java.util.List;
import com.pinyougou.pojo.TbBrand;
/**
* 品牌服務層介面
* @author Administrator
*
*/
public interface BrandService {
/**
* 返回全部列表
* @return
*/
public List<TbBrand> findAll();
}
(2) 服務實現類
在pinyougou-sellergoods-service 工程建立BrandServiceImpl類
package com.pinyougou.sellergoods.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import com.alibaba.dubbo.config.annotation.Service;
import com.pinyougou.mapper.TbBrandMapper;
import com.pinyougou.pojo.TbBrand;
import com.pinyougou.sellergoods.service.BrandService;
@Service
public class BrandServiceImpl implements BrandService {
@Autowired
private TbBrandMapper brandMapper;
@Override
public List<TbBrand> findAll() {
return brandMapper.selectByExample(null);
}
}
(3) 控制層程式碼
在pinyougou-manager-web工程建立com.pinyougou.manager.controller包,包下建立BrandController類
package com.pinyougou.manager.controller;
import java.util.List;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.pinyougou.pojo.TbBrand;
import com.pinyougou.sellergoods.service.BrandService;
/**
* 品牌controller
* @author Administrator
*/
@RestController
@RequestMapping("/brand")
public class BrandController {
@Reference
private BrandService brandService;
/**
* 返回全部列表
* @return
*/
@RequestMapping("/findAll")
public List<TbBrand> findAll(){
return brandService.findAll();
}
}
(4)測試
啟動pinyougou-sellergoods-service
啟動pinyougou-manager-web
位址列輸入http://localhost:9101/brand/findAll.do
可以看到瀏覽器輸出了json資料。
15.常見錯誤
(1).在註冊中心找不到對應的服務
java.lang.IllegalStateException: Failed to check the status of the service com.pinyougou.sellergoods.service.BrandService. No provider available for the service com.pinyougou.sellergoods.service.BrandService from the url zookeeper://192.168.25.129:2181/com.alibaba.dubbo.registry.RegistryService?application=pinyougou-manager-web&dubbo=2.8.4&interface=com.pinyougou.sellergoods.service.BrandService&methods=update,get,delete,selectOptionList,add,getListByPage&pid=3980&revision=0.0.1-SNAPSHOT&side=consumer×tamp=1501146823396 to the consumer 172.16.17.14 use dubbo version 2.8.4
這種錯誤是服務層程式碼沒有成功註冊到註冊中心導致,請檢查一下你的服務層程式碼是否添加了@service註解,並且該註解的包一定是com.alibaba.dubbo.config.annotation包,不是org.springframework.stereotype.Service,這個地方極容易出錯。另外還有一個原因就是你的服務層工程由於某些原因沒有正常啟動,也無法註冊到註冊中心裡,還有掃描包跟自己定義
的包格式要匹配
(2).無法連線到註冊中心
org.I0Itec.zkclient.exception.ZkTimeoutException: Unable to connect to zookeeper server within timeout: 5000 org.I0Itec.zkclient.ZkClient.connect(ZkClient.java:876) org.I0Itec.zkclient.ZkClient.<init>(ZkClient.java:98) org.I0Itec.zkclient.ZkClient.<init>(ZkClient.java:92) org.I0Itec.zkclient.ZkClient.<init>(ZkClient.java:80)
com.alibaba.dubbo.remoting.zookeeper.zkclient.ZkclientZookeeperClient.<init>(ZkclientZookeeperClient.java:26)
請檢查IP與埠是否填寫正確,檢查註冊中心是否正常啟動