1. 程式人生 > >品優購專案筆記day01——(SOA架構,Dubbox及小demo,Zookeeper,專案打包,管理中心linux環境部署與專案架構搭建)

品優購專案筆記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與埠是否填寫正確,檢查註冊中心是否正常啟動