1. 程式人生 > >SpringBoot+Dubbo搭建微服務

SpringBoot+Dubbo搭建微服務

文章目錄

一、分散式基本知識

1.1) 架構演變

在這裡插入圖片描述

先給出dubbo官方的圖,圖片表示了架構的演變。然後我說一下自己的理解。

應用最開始是單體應用,即一個應用包括了所有應用模組。

隨後就是垂直應用架構,也就是將系統拆分為多個應用模組。

隨後就是RPC架構,之前的垂直應用架構其實可以說是在一個程序內的通訊,而RPC就是一種進步,RPC是程序之間的通訊,遠端過程呼叫就是這麼來的。

有了RPC之後,雖然可以實現程序之間的通訊,但是伺服器集群后的伺服器資源利用有些時候容易造成浪費,比如有個系統,一般情況都是不能很好地預估需要分配多少機器的,很容易造成一種情況就是業務訪問很頻繁的模組分配了不足的機器,而訪問不是很頻繁的模組分配了太多的機器,這種情況就不能實現資源的很好利用,所以針對這種情況就有了SOA(Service Oriented Architecture)的出現,SOA其實就是一個服務註冊中心,可以實現資源排程,合理地分配資源,提高資源排程,是一個治理中心。

1.2)、分散式基本概念

所以我們瞭解了架構演變之後,就可以更好的理解分散式,分散式其實就是一種可以實現不同程序之間通訊的架構,然後程序之間怎麼通訊的?一般都是通過RPC框架實現。比如Java方面的,Dubbo框架或者Spring Cloud。

二、RCP簡介

2.1) RPC概念

RPC:全稱遠端過程呼叫,是一種程序間的通訊的方式,它所做的事情就是實現程序內的通訊,允許呼叫另外一個地址空間,可以是共享網路裡的另外一臺機器。

2.2) RPC核心模組

RPC有兩個核心模組:通訊和序列化

三、Dubbo原理簡介

3.1) Dubbo簡介

Dubbo是阿里巴巴開源的一款Java RPC框架,現在已經捐贈給Apache
官網:

http://dubbo.apache.org/

3.2) 核心功能

a、智慧容錯和負載均衡

b、服務註冊和發現

c、面向介面的遠端方法呼叫

3.3) 原理簡介

在這裡插入圖片描述

上圖是Dubbo官方的圖

角色

Provider:暴露服務的服務提供者

Container:服務執行的容器

Consumer:呼叫遠端服務的消費者

Registry:服務註冊和發現的註冊中心

Minitor:統計服務呼叫次數和時間的監控中心

呼叫

下面根據我的理解說明一下

0:伺服器容器負責啟動、載入、執行服務提供者

1:服務提供者在啟動後就可以向註冊中心暴露服務

2:服務消費者在啟動後就可以向註冊中心訂閱想要的服務

3:註冊中心向服務消費者返回服務呼叫列表

4:服務消費者基於軟負載均衡演算法呼叫服務提供者的服務,這個服務提供者有可能是一個服務提供者列表,呼叫那個服務提供者就是根據負載均衡來呼叫了

5:服務提供者和服務消費者定時將儲存在記憶體中的服務呼叫次數和服務呼叫時間推送給監控中心

四、Dubbo安裝部署

4.1) Zookeeper安裝

因為沒有實踐過linux系統的安裝,所以本部落格只介紹window系統的安裝,當然linux安裝dubbo環境也不會難。Dubbo的註冊中心實現有很多種,比如Redis、Multicast等等,不過官方推薦的還是Zookeeper,所以本部落格選Zookeeper註冊中心搭建進行介紹。

下載Zookeeper
https://archive.apache.org/dist/zookeeper/
ps:先下載Zookeeper,因為3.5.X的都是公測版或者內測版,所以有可能不太穩定,不建議下載。

修改配置檔案
解壓下載好的Zookeeper壓縮檔案,zookeeper-3.4.13的配置檔案在conf資料夾下面,可以看到裡面有個zoo_sample.cfg的檔案,我們需要修改檔名稱,不然會出現檔案找不到,將檔名稱改為zoo.cfg

這裡主要改一下Zookeeper臨時資料夾,預設是linux系統的tmp/zookeeper,我修改後的配置如下:

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
# Linux系統下的臨時目錄
# dataDir=/tmp/zookeeper
dataDir=../tmp/zookeeper
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1

啟動Zookeeper
在bin目錄下面,有個zkServer.cmd檔案,這是Zookeeper服務端啟動的檔案,點選啟動

zkCli.cmd是客戶端啟動檔案,我們點選啟動,Zookeeper是一個樹形目錄結構的

### get根目錄
[zk: localhost:2181(CONNECTED) 1] get /
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x0
cversion = -1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1
### 看一下根目錄下面有什麼,預設有Zookeeper這個目錄
[zk: localhost:2181(CONNECTED) 2] ls /
[zookeeper]
### 在根目錄下面建立一個taoshop的目錄,並寫值"mytest"
[zk: localhost:2181(CONNECTED) 3] create -e /taoshop mytest
Created /taoshop
### 檢視一下,建立成功
[zk: localhost:2181(CONNECTED) 4] ls /
[taoshop, zookeeper]
### 檢視一下taoshop目錄下面有什麼,可以看到"mytest"這個儲存的值
[zk: localhost:2181(CONNECTED) 5] get /taoshop
mytest
cZxid = 0x6
ctime = Sun Nov 04 20:54:19 CST 2018
mZxid = 0x6
mtime = Sun Nov 04 20:54:19 CST 2018
pZxid = 0x6
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x1000250f2010000
dataLength = 6
numChildren = 0

4.2) Dubbo監控平臺部署

下載一下Dubbo提供的監控平臺,可以先去下載master分支,有看到一個develop分支,不過感覺develop分支的還沒穩定下來,根據自己需要下載,我就是下載master版本的
https://github.com/apache/incubator-dubbo-ops/tree/master

可以git clone一下https://github.com/apache/incubator-dubbo-ops.git

git clone https://github.com/apache/incubator-dubbo-ops.git

然後到dubbo-admin下面打包一下
incubator-dubbo-ops-master/dubbo-admin

mvn clean package

完成後,到該目錄target下面發現一個jar,cmd執行

java -jar dubbo-admin-0.0.1-SNAPSHOT.jar

當然也可以寫個簡單的bat指令碼來執行,不用每次都敲命令,建立一個startDubboAdmin.bat檔案
敲上以下指令碼,然後儲存,下次就不用再敲命令了,不過jar檔案要和bat檔案放在同級目錄

@echo off
java -jar dubbo-admin-0.0.1-SNAPSHOT.jar

訪問Dubbo管理平臺

http://localhost:7001/

輸入賬號密碼root/root

在這裡插入圖片描述

Dubbo監控平臺配置
在官方下載的incubator-dubbo-ops-master/dubbo-monitor-simple下面
使用maven命令打包一下

mvn clean package

然後在target資料夾下面會生成
dubbo-monitor-simple-2.0.0-assembly.tar.gz壓縮資料夾,我們解壓一下,然後
在dubbo-monitor-simple-2.0.0-assembly/dubbo-moitor-simple-2.0.0/assembly.bin資料夾下面可以看到start.bat檔案,start.sh是linux系統的。win系統可以點選start.bat執行,執行之後訪問127.0.0.1:8080,可以看到Dubbo官方提供的一個監控平臺頁面
在這裡插入圖片描述

五、Dubbo例子

下面簡單寫個例子實踐一下Dubbo
Dubbo是處理分散式架構的一種很不錯的RPC框架,官方文件比較齊全。
下面是Dubbo官方給的架構分包建議。ps:Dubbo現在暫不能支援分散式事務,所以服務定義的時候要設計好,儘量避免分散式事務的處理

建議將服務介面,服務模型,服務異常等均放在 API 包中,因為服務模型及異常也是 API 的一部分,同時,這樣做也符合分包原則:重用釋出等價原則(REP),共同重用原則(CRP)。

服務提供者實現
maven加上jar,Zookeeper注意加上去除log4j依賴,假如你專案引入其它版本的log4j的話,容易造成jar衝突

  <exclusions>
       <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
     </exclusion>
    <exclusion>
                  <groupId>log4j</groupId>
                  <artifactId>log4j</artifactId>
       </exclusion>
   </exclusions>

dubbo配置,我放在一個common工程,taoshop-common-rpc

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <dubbo.springboot.version>1.0.0</dubbo.springboot.version>
        <zookeeper.version>3.4.6</zookeeper.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>io.dubbo.springboot</groupId>
            <artifactId>spring-boot-starter-dubbo</artifactId>
            <version>${dubbo.springboot.version}</version>
        </dependency>

         <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>2.12.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>${zookeeper.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>


    </dependencies>

provider工程一般是Service工程,我新建一個taoshop-provider-item訂單工程

<!--API介面工程 -->
<dependency>
            <groupId>com.muses.taoshop.provider-api</groupId>
            <artifactId>taoshop-provider-api-item</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
<!-- 有dubbo相關jar的工程-->
        <dependency>
            <groupId>com.muses.taoshop.common</groupId>
            <artifactId>taoshop-common-rpc</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

dubbo配置:

spring.dubbo.application.name=taoshop-provider-item
spring.dubbo.registry.protocol=zookeeper
spring.dubbo.registry.address=127.0.0.1:2181
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
spring.dubbo.scan=com.muses.taoshop

業務介面實現:
注意點:這裡要加上dubbo提供的@Service註解,而不是spring框架提供的@Service註解

com.alibaba.dubbo.config.annotation.Service

package com.muses.taoshop.item.service;

import com.alibaba.dubbo.config.annotation.Service;
import com.muses.taoshop.item.entity.ItemDetail;
import com.muses.taoshop.item.entity.ItemPortal;
import com.muses.taoshop.item.entity.ItemSpec;
import com.muses.taoshop.item.mapper.ItemMapper;
import org.springframework.beans.factory.annotation.Autowired;


import java.util.List;

/**
 * <pre>
 *  商品資訊服務實現類
 * </pre>
 *
 * @author nicky
 * @version 1.00.00
 * <pre>
 * 修改記錄
 *    修改後版本:     修改人:  修改日期: 2018.06.24 22:37    修改內容:
 * </pre>
 */
@Service(version = "1.0.0")
public class ItemServiceImpl implements IItemService {

    @Autowired
    ItemMapper itemMapper;

    /**
     * 在入口網站列出商品粗略資訊
     *
     * @return
     */
    @Override
    public List<ItemPortal> listItemPortal() {
        return itemMapper.listItemPortal();
    }

    /**
     * 獲取商品詳情資訊
     * @return ItemDetail
     */
    @Override
    public ItemDetail getItemDetailInfo(int spuId){
        ItemDetail itemDetail = itemMapper.getItemDetail(spuId);
        return  itemDetail;
    }


}

隨意寫個SpringBoot啟動類:

package com.muses.taoshop.item;

/**
 * <pre>
 *  服務提供者
 * </pre>
 *
 * @author nicky
 * @version 1.00.00
 * <pre>
 * 修改記錄
 *    修改後版本:     修改人:  修改日期: 2018.11.17 23:24    修改內容:
 * </pre>
 */
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ImportResource;


import java.util.concurrent.CountDownLatch;

@SpringBootApplication
//@ImportResource({"classpath:dubbo-provider.xml"})
public class ItemProviderApplication {
  //  private static final Logger logger = Logger.getLogger(ItemProviderApplication.class);

    @Bean
    public CountDownLatch closeLatch() {
        return new CountDownLatch(1);
    }

    public static void main(String[] args) throws InterruptedException {
        ApplicationContext ctx = SpringApplication.run(ItemProviderApplication.class, args);
//		logger.info("專案啟動!");
//		CountDownLatch closeLatch = ctx.getBean(CountDownLatch.class);
//		closeLatch.await();
    }

}

啟動一下provider,在監控平臺上可以看到啟動成功的服務,服務介面暴露成功
在這裡插入圖片描述

服務消費者
Dubbo配置:

spring.dubbo.application.name=taoshop-consume-portal
spring.dubbo.registry.protocol=zookeeper
spring.dubbo.registry.address=127.0.0.1:2181
spring.dubbo.scan=com.muses.taoshop
spring.dubbo.monitor.protocol=registry

xml配置就是這樣的
自動發現

<dubbo:monitor protocol="registry"></dubbo:monitor>

引用,主要是引入import com.alibaba.dubbo.config.annotation.Reference;

@Reference
IItemService iItemService;

參考資料

SpringBoot+Dubbo

零基礎搭建一套微服務框架(Spring Boot + Dubbo + Docker + Jenkins)