'十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記'

Apache Java Tomcat WebApp 可視化技術 瀏覽器 Redis Windows 開發的那些小事 2019-09-07
"

一、Dubbo介紹

引用官方的一段介紹

Apache Dubbo (incubating) |ˈdʌbəʊ| is a high-performance, java based RPC framework open-sourced by Alibaba. As in many RPC systems, dubbo is based around the idea of defining a service, specifying the methods that can be called remotely with their parameters and return types. On the server side, the server implements this interface and runs a dubbo server to handle client calls. On the client side, the client has a stub that provides the same methods as the server.

Dubbo是阿里出的一個高性能的分佈式微服務框架,它的特點是性能高、界面友好、文檔齊全(特別是中文文檔),是很多中小型公司快速搭建微服務的首選技術。前段時間被阿里重新進行維護,並進入Apache孵化器。遷移到Apache後也推出了新的starter,簡單試用後感覺不錯,為此特地寫下這一系列筆記,用以記錄。(整個項目的源碼在最後一章,感興趣的童鞋可以下載自己搭建試試,也可以將其作為腳手架搭建你自己的微服務)

二、搭建註冊中心

在dubbo中,每一個服務都是分佈式的,消費者與提供者的關係並不是一對一的關係,而是一對多,並且服務提供者的實例位置是未知的,如果都由開發者使用靜態文件去維護這個關係顯示不合適的,一方面是徒增工作量,另一方面是靈活度不高,如果服務提供者更換了服務器地址,那麼需要重新配置等,所以目前比較推崇的方案是所有服務提供者均主動將自己的信息註冊到同個地方中,而消費者只要一律從這個地方取他需要的東西即可,這個地方就是所謂的註冊中心。目前dubbo可以選擇的註冊中心包括zookeeper、redis等,一般建議使用zookeeper,下面演示一下在windows中如何搭建zookeeper註冊中心。

1、下載zookeeper

直接在官網的鏡像站下 (https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/zookeeper-3.4.12.tar.gz)

2、解壓並配置zookeeper

為了演示,直接使用官方示例配置。把解壓出來的\\zookeeper-3.4.12\\conf\\zoo_sample.cfg 文件名改為zoo.cfg即可,如下圖:

"

一、Dubbo介紹

引用官方的一段介紹

Apache Dubbo (incubating) |ˈdʌbəʊ| is a high-performance, java based RPC framework open-sourced by Alibaba. As in many RPC systems, dubbo is based around the idea of defining a service, specifying the methods that can be called remotely with their parameters and return types. On the server side, the server implements this interface and runs a dubbo server to handle client calls. On the client side, the client has a stub that provides the same methods as the server.

Dubbo是阿里出的一個高性能的分佈式微服務框架,它的特點是性能高、界面友好、文檔齊全(特別是中文文檔),是很多中小型公司快速搭建微服務的首選技術。前段時間被阿里重新進行維護,並進入Apache孵化器。遷移到Apache後也推出了新的starter,簡單試用後感覺不錯,為此特地寫下這一系列筆記,用以記錄。(整個項目的源碼在最後一章,感興趣的童鞋可以下載自己搭建試試,也可以將其作為腳手架搭建你自己的微服務)

二、搭建註冊中心

在dubbo中,每一個服務都是分佈式的,消費者與提供者的關係並不是一對一的關係,而是一對多,並且服務提供者的實例位置是未知的,如果都由開發者使用靜態文件去維護這個關係顯示不合適的,一方面是徒增工作量,另一方面是靈活度不高,如果服務提供者更換了服務器地址,那麼需要重新配置等,所以目前比較推崇的方案是所有服務提供者均主動將自己的信息註冊到同個地方中,而消費者只要一律從這個地方取他需要的東西即可,這個地方就是所謂的註冊中心。目前dubbo可以選擇的註冊中心包括zookeeper、redis等,一般建議使用zookeeper,下面演示一下在windows中如何搭建zookeeper註冊中心。

1、下載zookeeper

直接在官網的鏡像站下 (https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/zookeeper-3.4.12.tar.gz)

2、解壓並配置zookeeper

為了演示,直接使用官方示例配置。把解壓出來的\\zookeeper-3.4.12\\conf\\zoo_sample.cfg 文件名改為zoo.cfg即可,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、運行zookeeper註冊中心

雙擊運行/zookeeper-3.4.12/bin/zkServer.cmd,出現以下窗口代表運行成功。

"

一、Dubbo介紹

引用官方的一段介紹

Apache Dubbo (incubating) |ˈdʌbəʊ| is a high-performance, java based RPC framework open-sourced by Alibaba. As in many RPC systems, dubbo is based around the idea of defining a service, specifying the methods that can be called remotely with their parameters and return types. On the server side, the server implements this interface and runs a dubbo server to handle client calls. On the client side, the client has a stub that provides the same methods as the server.

Dubbo是阿里出的一個高性能的分佈式微服務框架,它的特點是性能高、界面友好、文檔齊全(特別是中文文檔),是很多中小型公司快速搭建微服務的首選技術。前段時間被阿里重新進行維護,並進入Apache孵化器。遷移到Apache後也推出了新的starter,簡單試用後感覺不錯,為此特地寫下這一系列筆記,用以記錄。(整個項目的源碼在最後一章,感興趣的童鞋可以下載自己搭建試試,也可以將其作為腳手架搭建你自己的微服務)

二、搭建註冊中心

在dubbo中,每一個服務都是分佈式的,消費者與提供者的關係並不是一對一的關係,而是一對多,並且服務提供者的實例位置是未知的,如果都由開發者使用靜態文件去維護這個關係顯示不合適的,一方面是徒增工作量,另一方面是靈活度不高,如果服務提供者更換了服務器地址,那麼需要重新配置等,所以目前比較推崇的方案是所有服務提供者均主動將自己的信息註冊到同個地方中,而消費者只要一律從這個地方取他需要的東西即可,這個地方就是所謂的註冊中心。目前dubbo可以選擇的註冊中心包括zookeeper、redis等,一般建議使用zookeeper,下面演示一下在windows中如何搭建zookeeper註冊中心。

1、下載zookeeper

直接在官網的鏡像站下 (https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/zookeeper-3.4.12.tar.gz)

2、解壓並配置zookeeper

為了演示,直接使用官方示例配置。把解壓出來的\\zookeeper-3.4.12\\conf\\zoo_sample.cfg 文件名改為zoo.cfg即可,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、運行zookeeper註冊中心

雙擊運行/zookeeper-3.4.12/bin/zkServer.cmd,出現以下窗口代表運行成功。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

三、搭建Dubbo Admin

在Dubbo中,一大殺器就是它的可視化監控界面,在這個界面中可以查看服務者、提供者的數量、狀態等,並對服務降級、容錯、屏蔽等提供了可視化操作。下面演示如何搭建Dubbo Admin。

1、下載源碼並解壓

點擊下面地址下載dubbo admin項目源碼 (https://codeload.github.com/apache/incubator-dubbo-ops/zip/master)

下載後解壓出來,如下圖:

"

一、Dubbo介紹

引用官方的一段介紹

Apache Dubbo (incubating) |ˈdʌbəʊ| is a high-performance, java based RPC framework open-sourced by Alibaba. As in many RPC systems, dubbo is based around the idea of defining a service, specifying the methods that can be called remotely with their parameters and return types. On the server side, the server implements this interface and runs a dubbo server to handle client calls. On the client side, the client has a stub that provides the same methods as the server.

Dubbo是阿里出的一個高性能的分佈式微服務框架,它的特點是性能高、界面友好、文檔齊全(特別是中文文檔),是很多中小型公司快速搭建微服務的首選技術。前段時間被阿里重新進行維護,並進入Apache孵化器。遷移到Apache後也推出了新的starter,簡單試用後感覺不錯,為此特地寫下這一系列筆記,用以記錄。(整個項目的源碼在最後一章,感興趣的童鞋可以下載自己搭建試試,也可以將其作為腳手架搭建你自己的微服務)

二、搭建註冊中心

在dubbo中,每一個服務都是分佈式的,消費者與提供者的關係並不是一對一的關係,而是一對多,並且服務提供者的實例位置是未知的,如果都由開發者使用靜態文件去維護這個關係顯示不合適的,一方面是徒增工作量,另一方面是靈活度不高,如果服務提供者更換了服務器地址,那麼需要重新配置等,所以目前比較推崇的方案是所有服務提供者均主動將自己的信息註冊到同個地方中,而消費者只要一律從這個地方取他需要的東西即可,這個地方就是所謂的註冊中心。目前dubbo可以選擇的註冊中心包括zookeeper、redis等,一般建議使用zookeeper,下面演示一下在windows中如何搭建zookeeper註冊中心。

1、下載zookeeper

直接在官網的鏡像站下 (https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/zookeeper-3.4.12.tar.gz)

2、解壓並配置zookeeper

為了演示,直接使用官方示例配置。把解壓出來的\\zookeeper-3.4.12\\conf\\zoo_sample.cfg 文件名改為zoo.cfg即可,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、運行zookeeper註冊中心

雙擊運行/zookeeper-3.4.12/bin/zkServer.cmd,出現以下窗口代表運行成功。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

三、搭建Dubbo Admin

在Dubbo中,一大殺器就是它的可視化監控界面,在這個界面中可以查看服務者、提供者的數量、狀態等,並對服務降級、容錯、屏蔽等提供了可視化操作。下面演示如何搭建Dubbo Admin。

1、下載源碼並解壓

點擊下面地址下載dubbo admin項目源碼 (https://codeload.github.com/apache/incubator-dubbo-ops/zip/master)

下載後解壓出來,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

2、打包

打開cmd,進入第一步解壓出來的dubbo-admin文件夾中,執行mvn clean package

(ps:要是提示未存在mvn命令,就把maven文件夾的bin目錄添加到系統環境變量PATH中)

"

一、Dubbo介紹

引用官方的一段介紹

Apache Dubbo (incubating) |ˈdʌbəʊ| is a high-performance, java based RPC framework open-sourced by Alibaba. As in many RPC systems, dubbo is based around the idea of defining a service, specifying the methods that can be called remotely with their parameters and return types. On the server side, the server implements this interface and runs a dubbo server to handle client calls. On the client side, the client has a stub that provides the same methods as the server.

Dubbo是阿里出的一個高性能的分佈式微服務框架,它的特點是性能高、界面友好、文檔齊全(特別是中文文檔),是很多中小型公司快速搭建微服務的首選技術。前段時間被阿里重新進行維護,並進入Apache孵化器。遷移到Apache後也推出了新的starter,簡單試用後感覺不錯,為此特地寫下這一系列筆記,用以記錄。(整個項目的源碼在最後一章,感興趣的童鞋可以下載自己搭建試試,也可以將其作為腳手架搭建你自己的微服務)

二、搭建註冊中心

在dubbo中,每一個服務都是分佈式的,消費者與提供者的關係並不是一對一的關係,而是一對多,並且服務提供者的實例位置是未知的,如果都由開發者使用靜態文件去維護這個關係顯示不合適的,一方面是徒增工作量,另一方面是靈活度不高,如果服務提供者更換了服務器地址,那麼需要重新配置等,所以目前比較推崇的方案是所有服務提供者均主動將自己的信息註冊到同個地方中,而消費者只要一律從這個地方取他需要的東西即可,這個地方就是所謂的註冊中心。目前dubbo可以選擇的註冊中心包括zookeeper、redis等,一般建議使用zookeeper,下面演示一下在windows中如何搭建zookeeper註冊中心。

1、下載zookeeper

直接在官網的鏡像站下 (https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/zookeeper-3.4.12.tar.gz)

2、解壓並配置zookeeper

為了演示,直接使用官方示例配置。把解壓出來的\\zookeeper-3.4.12\\conf\\zoo_sample.cfg 文件名改為zoo.cfg即可,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、運行zookeeper註冊中心

雙擊運行/zookeeper-3.4.12/bin/zkServer.cmd,出現以下窗口代表運行成功。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

三、搭建Dubbo Admin

在Dubbo中,一大殺器就是它的可視化監控界面,在這個界面中可以查看服務者、提供者的數量、狀態等,並對服務降級、容錯、屏蔽等提供了可視化操作。下面演示如何搭建Dubbo Admin。

1、下載源碼並解壓

點擊下面地址下載dubbo admin項目源碼 (https://codeload.github.com/apache/incubator-dubbo-ops/zip/master)

下載後解壓出來,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

2、打包

打開cmd,進入第一步解壓出來的dubbo-admin文件夾中,執行mvn clean package

(ps:要是提示未存在mvn命令,就把maven文件夾的bin目錄添加到系統環境變量PATH中)

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、配置dubbo admin

打開上面那步打出來的war包(\\incubator-dubbo-ops-master\\dubbo-admin\\target\\dubbo-admin-2.0.0.war),編輯WEB-INF文件夾中的dubbo.properties文件,如下圖

"

一、Dubbo介紹

引用官方的一段介紹

Apache Dubbo (incubating) |ˈdʌbəʊ| is a high-performance, java based RPC framework open-sourced by Alibaba. As in many RPC systems, dubbo is based around the idea of defining a service, specifying the methods that can be called remotely with their parameters and return types. On the server side, the server implements this interface and runs a dubbo server to handle client calls. On the client side, the client has a stub that provides the same methods as the server.

Dubbo是阿里出的一個高性能的分佈式微服務框架,它的特點是性能高、界面友好、文檔齊全(特別是中文文檔),是很多中小型公司快速搭建微服務的首選技術。前段時間被阿里重新進行維護,並進入Apache孵化器。遷移到Apache後也推出了新的starter,簡單試用後感覺不錯,為此特地寫下這一系列筆記,用以記錄。(整個項目的源碼在最後一章,感興趣的童鞋可以下載自己搭建試試,也可以將其作為腳手架搭建你自己的微服務)

二、搭建註冊中心

在dubbo中,每一個服務都是分佈式的,消費者與提供者的關係並不是一對一的關係,而是一對多,並且服務提供者的實例位置是未知的,如果都由開發者使用靜態文件去維護這個關係顯示不合適的,一方面是徒增工作量,另一方面是靈活度不高,如果服務提供者更換了服務器地址,那麼需要重新配置等,所以目前比較推崇的方案是所有服務提供者均主動將自己的信息註冊到同個地方中,而消費者只要一律從這個地方取他需要的東西即可,這個地方就是所謂的註冊中心。目前dubbo可以選擇的註冊中心包括zookeeper、redis等,一般建議使用zookeeper,下面演示一下在windows中如何搭建zookeeper註冊中心。

1、下載zookeeper

直接在官網的鏡像站下 (https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/zookeeper-3.4.12.tar.gz)

2、解壓並配置zookeeper

為了演示,直接使用官方示例配置。把解壓出來的\\zookeeper-3.4.12\\conf\\zoo_sample.cfg 文件名改為zoo.cfg即可,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、運行zookeeper註冊中心

雙擊運行/zookeeper-3.4.12/bin/zkServer.cmd,出現以下窗口代表運行成功。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

三、搭建Dubbo Admin

在Dubbo中,一大殺器就是它的可視化監控界面,在這個界面中可以查看服務者、提供者的數量、狀態等,並對服務降級、容錯、屏蔽等提供了可視化操作。下面演示如何搭建Dubbo Admin。

1、下載源碼並解壓

點擊下面地址下載dubbo admin項目源碼 (https://codeload.github.com/apache/incubator-dubbo-ops/zip/master)

下載後解壓出來,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

2、打包

打開cmd,進入第一步解壓出來的dubbo-admin文件夾中,執行mvn clean package

(ps:要是提示未存在mvn命令,就把maven文件夾的bin目錄添加到系統環境變量PATH中)

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、配置dubbo admin

打開上面那步打出來的war包(\\incubator-dubbo-ops-master\\dubbo-admin\\target\\dubbo-admin-2.0.0.war),編輯WEB-INF文件夾中的dubbo.properties文件,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將紅框處的IP地址改為你的註冊中心的地址,由於我們的註冊中心是在本地運行的,故此處無需做修改。

"

一、Dubbo介紹

引用官方的一段介紹

Apache Dubbo (incubating) |ˈdʌbəʊ| is a high-performance, java based RPC framework open-sourced by Alibaba. As in many RPC systems, dubbo is based around the idea of defining a service, specifying the methods that can be called remotely with their parameters and return types. On the server side, the server implements this interface and runs a dubbo server to handle client calls. On the client side, the client has a stub that provides the same methods as the server.

Dubbo是阿里出的一個高性能的分佈式微服務框架,它的特點是性能高、界面友好、文檔齊全(特別是中文文檔),是很多中小型公司快速搭建微服務的首選技術。前段時間被阿里重新進行維護,並進入Apache孵化器。遷移到Apache後也推出了新的starter,簡單試用後感覺不錯,為此特地寫下這一系列筆記,用以記錄。(整個項目的源碼在最後一章,感興趣的童鞋可以下載自己搭建試試,也可以將其作為腳手架搭建你自己的微服務)

二、搭建註冊中心

在dubbo中,每一個服務都是分佈式的,消費者與提供者的關係並不是一對一的關係,而是一對多,並且服務提供者的實例位置是未知的,如果都由開發者使用靜態文件去維護這個關係顯示不合適的,一方面是徒增工作量,另一方面是靈活度不高,如果服務提供者更換了服務器地址,那麼需要重新配置等,所以目前比較推崇的方案是所有服務提供者均主動將自己的信息註冊到同個地方中,而消費者只要一律從這個地方取他需要的東西即可,這個地方就是所謂的註冊中心。目前dubbo可以選擇的註冊中心包括zookeeper、redis等,一般建議使用zookeeper,下面演示一下在windows中如何搭建zookeeper註冊中心。

1、下載zookeeper

直接在官網的鏡像站下 (https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/zookeeper-3.4.12.tar.gz)

2、解壓並配置zookeeper

為了演示,直接使用官方示例配置。把解壓出來的\\zookeeper-3.4.12\\conf\\zoo_sample.cfg 文件名改為zoo.cfg即可,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、運行zookeeper註冊中心

雙擊運行/zookeeper-3.4.12/bin/zkServer.cmd,出現以下窗口代表運行成功。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

三、搭建Dubbo Admin

在Dubbo中,一大殺器就是它的可視化監控界面,在這個界面中可以查看服務者、提供者的數量、狀態等,並對服務降級、容錯、屏蔽等提供了可視化操作。下面演示如何搭建Dubbo Admin。

1、下載源碼並解壓

點擊下面地址下載dubbo admin項目源碼 (https://codeload.github.com/apache/incubator-dubbo-ops/zip/master)

下載後解壓出來,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

2、打包

打開cmd,進入第一步解壓出來的dubbo-admin文件夾中,執行mvn clean package

(ps:要是提示未存在mvn命令,就把maven文件夾的bin目錄添加到系統環境變量PATH中)

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、配置dubbo admin

打開上面那步打出來的war包(\\incubator-dubbo-ops-master\\dubbo-admin\\target\\dubbo-admin-2.0.0.war),編輯WEB-INF文件夾中的dubbo.properties文件,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將紅框處的IP地址改為你的註冊中心的地址,由於我們的註冊中心是在本地運行的,故此處無需做修改。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

4、運行Dubbo Admin

將war包改名為ROOT.war後放到tomcat的webapp目錄中,然後運行tomcat。使用瀏覽器打開http://127.0.0.1:8080,提示輸入賬號密碼,賬號和密碼默認均為root,登陸後的界面如下:

"

一、Dubbo介紹

引用官方的一段介紹

Apache Dubbo (incubating) |ˈdʌbəʊ| is a high-performance, java based RPC framework open-sourced by Alibaba. As in many RPC systems, dubbo is based around the idea of defining a service, specifying the methods that can be called remotely with their parameters and return types. On the server side, the server implements this interface and runs a dubbo server to handle client calls. On the client side, the client has a stub that provides the same methods as the server.

Dubbo是阿里出的一個高性能的分佈式微服務框架,它的特點是性能高、界面友好、文檔齊全(特別是中文文檔),是很多中小型公司快速搭建微服務的首選技術。前段時間被阿里重新進行維護,並進入Apache孵化器。遷移到Apache後也推出了新的starter,簡單試用後感覺不錯,為此特地寫下這一系列筆記,用以記錄。(整個項目的源碼在最後一章,感興趣的童鞋可以下載自己搭建試試,也可以將其作為腳手架搭建你自己的微服務)

二、搭建註冊中心

在dubbo中,每一個服務都是分佈式的,消費者與提供者的關係並不是一對一的關係,而是一對多,並且服務提供者的實例位置是未知的,如果都由開發者使用靜態文件去維護這個關係顯示不合適的,一方面是徒增工作量,另一方面是靈活度不高,如果服務提供者更換了服務器地址,那麼需要重新配置等,所以目前比較推崇的方案是所有服務提供者均主動將自己的信息註冊到同個地方中,而消費者只要一律從這個地方取他需要的東西即可,這個地方就是所謂的註冊中心。目前dubbo可以選擇的註冊中心包括zookeeper、redis等,一般建議使用zookeeper,下面演示一下在windows中如何搭建zookeeper註冊中心。

1、下載zookeeper

直接在官網的鏡像站下 (https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/zookeeper-3.4.12.tar.gz)

2、解壓並配置zookeeper

為了演示,直接使用官方示例配置。把解壓出來的\\zookeeper-3.4.12\\conf\\zoo_sample.cfg 文件名改為zoo.cfg即可,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、運行zookeeper註冊中心

雙擊運行/zookeeper-3.4.12/bin/zkServer.cmd,出現以下窗口代表運行成功。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

三、搭建Dubbo Admin

在Dubbo中,一大殺器就是它的可視化監控界面,在這個界面中可以查看服務者、提供者的數量、狀態等,並對服務降級、容錯、屏蔽等提供了可視化操作。下面演示如何搭建Dubbo Admin。

1、下載源碼並解壓

點擊下面地址下載dubbo admin項目源碼 (https://codeload.github.com/apache/incubator-dubbo-ops/zip/master)

下載後解壓出來,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

2、打包

打開cmd,進入第一步解壓出來的dubbo-admin文件夾中,執行mvn clean package

(ps:要是提示未存在mvn命令,就把maven文件夾的bin目錄添加到系統環境變量PATH中)

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、配置dubbo admin

打開上面那步打出來的war包(\\incubator-dubbo-ops-master\\dubbo-admin\\target\\dubbo-admin-2.0.0.war),編輯WEB-INF文件夾中的dubbo.properties文件,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將紅框處的IP地址改為你的註冊中心的地址,由於我們的註冊中心是在本地運行的,故此處無需做修改。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

4、運行Dubbo Admin

將war包改名為ROOT.war後放到tomcat的webapp目錄中,然後運行tomcat。使用瀏覽器打開http://127.0.0.1:8080,提示輸入賬號密碼,賬號和密碼默認均為root,登陸後的界面如下:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

四、搭建API項目

由於Dubbo是採用RPC調用方式,這也是與Spring Cloud比較大的區別之一。在Spring Cloud中,服務通過HTTP接口提供給其它服務調用,對於調用者與被調用者來說,只要雙方保證滿足http接口的契約即可,但是在dubbo中,是嚴格要求調用接口的類路徑、參數等雙方一致。所以需要構建一個API項目,該項目裡面存放服務接口即公共實體,雙方依賴這個項目完成遠程調用。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
</project>

公共實體-People.java

package com.czh.dubbo.common.entity;
import java.io.Serializable;
public class People implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1415852192397895853L;
// 人員編號
private int id;
// 姓名
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "People [id=" + id + ", name=" + name + "]";
}
}

公共服務接口-PeopleService.java

package com.czh.dubbo.common.service;
import com.czh.dubbo.common.entity.People;
public interface PeopleService {
People getPeople(People people);
}

五、搭建服務提供者

服務提供者就是被消費者所調用的,它需要實現公共服務接口,並通過dubbo把自己的服務暴露出來。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

com.alibaba.boot是遷移過後出的一個最新的dubbo spring boot starter,也是目前官方推薦使用的。值得注意的是,該starter不包含註冊中心客戶端,需要自己配置。一般推薦使用zookeeper作為註冊中心,所以需要手動引入zkclient。

application.properties

#web服務端口,由於我們不需要使用web服務,所以將其設為隨機端口
server.port=-1
#dubbo服務端口,我們無需知道dubbo服務運行在哪個端口,故也將其設為隨機端口
dubbo.protocol.port = -1
#dubbo服務名稱
dubbo.application.name = dubbo-provider
#dubbo服務所在包路徑
dubbo.scan.basePackages = com.czh.dubbo.provider.service
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#設置服務的日誌輸出級別為debug級
logging.level.com.czh.dubbo.provider.service=debug

服務實現類PeopleServiceImpl

package com.czh.dubbo.provider.service;
import java.util.Random;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.dubbo.config.annotation.Service;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
//注意,這裡的service註解用的不是spring的註解,而是com.alibaba.dubbo.config.annotation.Service;
@Service
public class PeopleServiceImpl implements PeopleService{
private static final Logger logger = LoggerFactory.getLogger(PeopleServiceImpl.class);
/**
* 這個方法的作用是接收傳過來的People實體,將其ID賦為隨機數
*/
@Override
public People getPeople(People people) {
people.setId(new Random().nextInt(10000));
logger.debug("People:{},ID:{}",people.getName(),people.getId());
return people;
}
}

六、搭建服務消費者

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

application.properties

#web服務端口
server.port=80
#消費者名稱
dubbo.application.name=dubbo-consumer
#需要使用到提供者服務的包路徑
dubbo.scan.base-packages=com.czh.dubbo.consumer.controller
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181

控制器PeopleController

package com.czh.dubbo.consumer.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
@RestController
public class PeopleController {
@Reference
private PeopleService peopleService;
@GetMapping("/people/{name}")
public People getPeople(@PathVariable("name") String name) {
People people = new People();
people.setName(name);
return peopleService.getPeople(people);
}
}

至此,整個項目便搭建完畢,三個項目的項目結構如下

"

一、Dubbo介紹

引用官方的一段介紹

Apache Dubbo (incubating) |ˈdʌbəʊ| is a high-performance, java based RPC framework open-sourced by Alibaba. As in many RPC systems, dubbo is based around the idea of defining a service, specifying the methods that can be called remotely with their parameters and return types. On the server side, the server implements this interface and runs a dubbo server to handle client calls. On the client side, the client has a stub that provides the same methods as the server.

Dubbo是阿里出的一個高性能的分佈式微服務框架,它的特點是性能高、界面友好、文檔齊全(特別是中文文檔),是很多中小型公司快速搭建微服務的首選技術。前段時間被阿里重新進行維護,並進入Apache孵化器。遷移到Apache後也推出了新的starter,簡單試用後感覺不錯,為此特地寫下這一系列筆記,用以記錄。(整個項目的源碼在最後一章,感興趣的童鞋可以下載自己搭建試試,也可以將其作為腳手架搭建你自己的微服務)

二、搭建註冊中心

在dubbo中,每一個服務都是分佈式的,消費者與提供者的關係並不是一對一的關係,而是一對多,並且服務提供者的實例位置是未知的,如果都由開發者使用靜態文件去維護這個關係顯示不合適的,一方面是徒增工作量,另一方面是靈活度不高,如果服務提供者更換了服務器地址,那麼需要重新配置等,所以目前比較推崇的方案是所有服務提供者均主動將自己的信息註冊到同個地方中,而消費者只要一律從這個地方取他需要的東西即可,這個地方就是所謂的註冊中心。目前dubbo可以選擇的註冊中心包括zookeeper、redis等,一般建議使用zookeeper,下面演示一下在windows中如何搭建zookeeper註冊中心。

1、下載zookeeper

直接在官網的鏡像站下 (https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/zookeeper-3.4.12.tar.gz)

2、解壓並配置zookeeper

為了演示,直接使用官方示例配置。把解壓出來的\\zookeeper-3.4.12\\conf\\zoo_sample.cfg 文件名改為zoo.cfg即可,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、運行zookeeper註冊中心

雙擊運行/zookeeper-3.4.12/bin/zkServer.cmd,出現以下窗口代表運行成功。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

三、搭建Dubbo Admin

在Dubbo中,一大殺器就是它的可視化監控界面,在這個界面中可以查看服務者、提供者的數量、狀態等,並對服務降級、容錯、屏蔽等提供了可視化操作。下面演示如何搭建Dubbo Admin。

1、下載源碼並解壓

點擊下面地址下載dubbo admin項目源碼 (https://codeload.github.com/apache/incubator-dubbo-ops/zip/master)

下載後解壓出來,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

2、打包

打開cmd,進入第一步解壓出來的dubbo-admin文件夾中,執行mvn clean package

(ps:要是提示未存在mvn命令,就把maven文件夾的bin目錄添加到系統環境變量PATH中)

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、配置dubbo admin

打開上面那步打出來的war包(\\incubator-dubbo-ops-master\\dubbo-admin\\target\\dubbo-admin-2.0.0.war),編輯WEB-INF文件夾中的dubbo.properties文件,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將紅框處的IP地址改為你的註冊中心的地址,由於我們的註冊中心是在本地運行的,故此處無需做修改。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

4、運行Dubbo Admin

將war包改名為ROOT.war後放到tomcat的webapp目錄中,然後運行tomcat。使用瀏覽器打開http://127.0.0.1:8080,提示輸入賬號密碼,賬號和密碼默認均為root,登陸後的界面如下:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

四、搭建API項目

由於Dubbo是採用RPC調用方式,這也是與Spring Cloud比較大的區別之一。在Spring Cloud中,服務通過HTTP接口提供給其它服務調用,對於調用者與被調用者來說,只要雙方保證滿足http接口的契約即可,但是在dubbo中,是嚴格要求調用接口的類路徑、參數等雙方一致。所以需要構建一個API項目,該項目裡面存放服務接口即公共實體,雙方依賴這個項目完成遠程調用。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
</project>

公共實體-People.java

package com.czh.dubbo.common.entity;
import java.io.Serializable;
public class People implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1415852192397895853L;
// 人員編號
private int id;
// 姓名
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "People [id=" + id + ", name=" + name + "]";
}
}

公共服務接口-PeopleService.java

package com.czh.dubbo.common.service;
import com.czh.dubbo.common.entity.People;
public interface PeopleService {
People getPeople(People people);
}

五、搭建服務提供者

服務提供者就是被消費者所調用的,它需要實現公共服務接口,並通過dubbo把自己的服務暴露出來。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

com.alibaba.boot是遷移過後出的一個最新的dubbo spring boot starter,也是目前官方推薦使用的。值得注意的是,該starter不包含註冊中心客戶端,需要自己配置。一般推薦使用zookeeper作為註冊中心,所以需要手動引入zkclient。

application.properties

#web服務端口,由於我們不需要使用web服務,所以將其設為隨機端口
server.port=-1
#dubbo服務端口,我們無需知道dubbo服務運行在哪個端口,故也將其設為隨機端口
dubbo.protocol.port = -1
#dubbo服務名稱
dubbo.application.name = dubbo-provider
#dubbo服務所在包路徑
dubbo.scan.basePackages = com.czh.dubbo.provider.service
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#設置服務的日誌輸出級別為debug級
logging.level.com.czh.dubbo.provider.service=debug

服務實現類PeopleServiceImpl

package com.czh.dubbo.provider.service;
import java.util.Random;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.dubbo.config.annotation.Service;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
//注意,這裡的service註解用的不是spring的註解,而是com.alibaba.dubbo.config.annotation.Service;
@Service
public class PeopleServiceImpl implements PeopleService{
private static final Logger logger = LoggerFactory.getLogger(PeopleServiceImpl.class);
/**
* 這個方法的作用是接收傳過來的People實體,將其ID賦為隨機數
*/
@Override
public People getPeople(People people) {
people.setId(new Random().nextInt(10000));
logger.debug("People:{},ID:{}",people.getName(),people.getId());
return people;
}
}

六、搭建服務消費者

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

application.properties

#web服務端口
server.port=80
#消費者名稱
dubbo.application.name=dubbo-consumer
#需要使用到提供者服務的包路徑
dubbo.scan.base-packages=com.czh.dubbo.consumer.controller
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181

控制器PeopleController

package com.czh.dubbo.consumer.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
@RestController
public class PeopleController {
@Reference
private PeopleService peopleService;
@GetMapping("/people/{name}")
public People getPeople(@PathVariable("name") String name) {
People people = new People();
people.setName(name);
return peopleService.getPeople(people);
}
}

至此,整個項目便搭建完畢,三個項目的項目結構如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

七、上線運行

1、打包運行

安裝API項目到本地maven倉庫

在dubbo-common項目的pom.xml文件上點擊右鍵,Run as - Maven install

"

一、Dubbo介紹

引用官方的一段介紹

Apache Dubbo (incubating) |ˈdʌbəʊ| is a high-performance, java based RPC framework open-sourced by Alibaba. As in many RPC systems, dubbo is based around the idea of defining a service, specifying the methods that can be called remotely with their parameters and return types. On the server side, the server implements this interface and runs a dubbo server to handle client calls. On the client side, the client has a stub that provides the same methods as the server.

Dubbo是阿里出的一個高性能的分佈式微服務框架,它的特點是性能高、界面友好、文檔齊全(特別是中文文檔),是很多中小型公司快速搭建微服務的首選技術。前段時間被阿里重新進行維護,並進入Apache孵化器。遷移到Apache後也推出了新的starter,簡單試用後感覺不錯,為此特地寫下這一系列筆記,用以記錄。(整個項目的源碼在最後一章,感興趣的童鞋可以下載自己搭建試試,也可以將其作為腳手架搭建你自己的微服務)

二、搭建註冊中心

在dubbo中,每一個服務都是分佈式的,消費者與提供者的關係並不是一對一的關係,而是一對多,並且服務提供者的實例位置是未知的,如果都由開發者使用靜態文件去維護這個關係顯示不合適的,一方面是徒增工作量,另一方面是靈活度不高,如果服務提供者更換了服務器地址,那麼需要重新配置等,所以目前比較推崇的方案是所有服務提供者均主動將自己的信息註冊到同個地方中,而消費者只要一律從這個地方取他需要的東西即可,這個地方就是所謂的註冊中心。目前dubbo可以選擇的註冊中心包括zookeeper、redis等,一般建議使用zookeeper,下面演示一下在windows中如何搭建zookeeper註冊中心。

1、下載zookeeper

直接在官網的鏡像站下 (https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/zookeeper-3.4.12.tar.gz)

2、解壓並配置zookeeper

為了演示,直接使用官方示例配置。把解壓出來的\\zookeeper-3.4.12\\conf\\zoo_sample.cfg 文件名改為zoo.cfg即可,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、運行zookeeper註冊中心

雙擊運行/zookeeper-3.4.12/bin/zkServer.cmd,出現以下窗口代表運行成功。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

三、搭建Dubbo Admin

在Dubbo中,一大殺器就是它的可視化監控界面,在這個界面中可以查看服務者、提供者的數量、狀態等,並對服務降級、容錯、屏蔽等提供了可視化操作。下面演示如何搭建Dubbo Admin。

1、下載源碼並解壓

點擊下面地址下載dubbo admin項目源碼 (https://codeload.github.com/apache/incubator-dubbo-ops/zip/master)

下載後解壓出來,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

2、打包

打開cmd,進入第一步解壓出來的dubbo-admin文件夾中,執行mvn clean package

(ps:要是提示未存在mvn命令,就把maven文件夾的bin目錄添加到系統環境變量PATH中)

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、配置dubbo admin

打開上面那步打出來的war包(\\incubator-dubbo-ops-master\\dubbo-admin\\target\\dubbo-admin-2.0.0.war),編輯WEB-INF文件夾中的dubbo.properties文件,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將紅框處的IP地址改為你的註冊中心的地址,由於我們的註冊中心是在本地運行的,故此處無需做修改。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

4、運行Dubbo Admin

將war包改名為ROOT.war後放到tomcat的webapp目錄中,然後運行tomcat。使用瀏覽器打開http://127.0.0.1:8080,提示輸入賬號密碼,賬號和密碼默認均為root,登陸後的界面如下:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

四、搭建API項目

由於Dubbo是採用RPC調用方式,這也是與Spring Cloud比較大的區別之一。在Spring Cloud中,服務通過HTTP接口提供給其它服務調用,對於調用者與被調用者來說,只要雙方保證滿足http接口的契約即可,但是在dubbo中,是嚴格要求調用接口的類路徑、參數等雙方一致。所以需要構建一個API項目,該項目裡面存放服務接口即公共實體,雙方依賴這個項目完成遠程調用。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
</project>

公共實體-People.java

package com.czh.dubbo.common.entity;
import java.io.Serializable;
public class People implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1415852192397895853L;
// 人員編號
private int id;
// 姓名
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "People [id=" + id + ", name=" + name + "]";
}
}

公共服務接口-PeopleService.java

package com.czh.dubbo.common.service;
import com.czh.dubbo.common.entity.People;
public interface PeopleService {
People getPeople(People people);
}

五、搭建服務提供者

服務提供者就是被消費者所調用的,它需要實現公共服務接口,並通過dubbo把自己的服務暴露出來。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

com.alibaba.boot是遷移過後出的一個最新的dubbo spring boot starter,也是目前官方推薦使用的。值得注意的是,該starter不包含註冊中心客戶端,需要自己配置。一般推薦使用zookeeper作為註冊中心,所以需要手動引入zkclient。

application.properties

#web服務端口,由於我們不需要使用web服務,所以將其設為隨機端口
server.port=-1
#dubbo服務端口,我們無需知道dubbo服務運行在哪個端口,故也將其設為隨機端口
dubbo.protocol.port = -1
#dubbo服務名稱
dubbo.application.name = dubbo-provider
#dubbo服務所在包路徑
dubbo.scan.basePackages = com.czh.dubbo.provider.service
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#設置服務的日誌輸出級別為debug級
logging.level.com.czh.dubbo.provider.service=debug

服務實現類PeopleServiceImpl

package com.czh.dubbo.provider.service;
import java.util.Random;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.dubbo.config.annotation.Service;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
//注意,這裡的service註解用的不是spring的註解,而是com.alibaba.dubbo.config.annotation.Service;
@Service
public class PeopleServiceImpl implements PeopleService{
private static final Logger logger = LoggerFactory.getLogger(PeopleServiceImpl.class);
/**
* 這個方法的作用是接收傳過來的People實體,將其ID賦為隨機數
*/
@Override
public People getPeople(People people) {
people.setId(new Random().nextInt(10000));
logger.debug("People:{},ID:{}",people.getName(),people.getId());
return people;
}
}

六、搭建服務消費者

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

application.properties

#web服務端口
server.port=80
#消費者名稱
dubbo.application.name=dubbo-consumer
#需要使用到提供者服務的包路徑
dubbo.scan.base-packages=com.czh.dubbo.consumer.controller
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181

控制器PeopleController

package com.czh.dubbo.consumer.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
@RestController
public class PeopleController {
@Reference
private PeopleService peopleService;
@GetMapping("/people/{name}")
public People getPeople(@PathVariable("name") String name) {
People people = new People();
people.setName(name);
return peopleService.getPeople(people);
}
}

至此,整個項目便搭建完畢,三個項目的項目結構如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

七、上線運行

1、打包運行

安裝API項目到本地maven倉庫

在dubbo-common項目的pom.xml文件上點擊右鍵,Run as - Maven install

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打包服務提供者與服務消費者

在這兩個項目的pom.xml文件執行以下操作:點擊右鍵,Run as - Maven build… 在彈出的選項框中Golas 填寫:clean package,如下圖

"

一、Dubbo介紹

引用官方的一段介紹

Apache Dubbo (incubating) |ˈdʌbəʊ| is a high-performance, java based RPC framework open-sourced by Alibaba. As in many RPC systems, dubbo is based around the idea of defining a service, specifying the methods that can be called remotely with their parameters and return types. On the server side, the server implements this interface and runs a dubbo server to handle client calls. On the client side, the client has a stub that provides the same methods as the server.

Dubbo是阿里出的一個高性能的分佈式微服務框架,它的特點是性能高、界面友好、文檔齊全(特別是中文文檔),是很多中小型公司快速搭建微服務的首選技術。前段時間被阿里重新進行維護,並進入Apache孵化器。遷移到Apache後也推出了新的starter,簡單試用後感覺不錯,為此特地寫下這一系列筆記,用以記錄。(整個項目的源碼在最後一章,感興趣的童鞋可以下載自己搭建試試,也可以將其作為腳手架搭建你自己的微服務)

二、搭建註冊中心

在dubbo中,每一個服務都是分佈式的,消費者與提供者的關係並不是一對一的關係,而是一對多,並且服務提供者的實例位置是未知的,如果都由開發者使用靜態文件去維護這個關係顯示不合適的,一方面是徒增工作量,另一方面是靈活度不高,如果服務提供者更換了服務器地址,那麼需要重新配置等,所以目前比較推崇的方案是所有服務提供者均主動將自己的信息註冊到同個地方中,而消費者只要一律從這個地方取他需要的東西即可,這個地方就是所謂的註冊中心。目前dubbo可以選擇的註冊中心包括zookeeper、redis等,一般建議使用zookeeper,下面演示一下在windows中如何搭建zookeeper註冊中心。

1、下載zookeeper

直接在官網的鏡像站下 (https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/zookeeper-3.4.12.tar.gz)

2、解壓並配置zookeeper

為了演示,直接使用官方示例配置。把解壓出來的\\zookeeper-3.4.12\\conf\\zoo_sample.cfg 文件名改為zoo.cfg即可,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、運行zookeeper註冊中心

雙擊運行/zookeeper-3.4.12/bin/zkServer.cmd,出現以下窗口代表運行成功。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

三、搭建Dubbo Admin

在Dubbo中,一大殺器就是它的可視化監控界面,在這個界面中可以查看服務者、提供者的數量、狀態等,並對服務降級、容錯、屏蔽等提供了可視化操作。下面演示如何搭建Dubbo Admin。

1、下載源碼並解壓

點擊下面地址下載dubbo admin項目源碼 (https://codeload.github.com/apache/incubator-dubbo-ops/zip/master)

下載後解壓出來,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

2、打包

打開cmd,進入第一步解壓出來的dubbo-admin文件夾中,執行mvn clean package

(ps:要是提示未存在mvn命令,就把maven文件夾的bin目錄添加到系統環境變量PATH中)

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、配置dubbo admin

打開上面那步打出來的war包(\\incubator-dubbo-ops-master\\dubbo-admin\\target\\dubbo-admin-2.0.0.war),編輯WEB-INF文件夾中的dubbo.properties文件,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將紅框處的IP地址改為你的註冊中心的地址,由於我們的註冊中心是在本地運行的,故此處無需做修改。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

4、運行Dubbo Admin

將war包改名為ROOT.war後放到tomcat的webapp目錄中,然後運行tomcat。使用瀏覽器打開http://127.0.0.1:8080,提示輸入賬號密碼,賬號和密碼默認均為root,登陸後的界面如下:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

四、搭建API項目

由於Dubbo是採用RPC調用方式,這也是與Spring Cloud比較大的區別之一。在Spring Cloud中,服務通過HTTP接口提供給其它服務調用,對於調用者與被調用者來說,只要雙方保證滿足http接口的契約即可,但是在dubbo中,是嚴格要求調用接口的類路徑、參數等雙方一致。所以需要構建一個API項目,該項目裡面存放服務接口即公共實體,雙方依賴這個項目完成遠程調用。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
</project>

公共實體-People.java

package com.czh.dubbo.common.entity;
import java.io.Serializable;
public class People implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1415852192397895853L;
// 人員編號
private int id;
// 姓名
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "People [id=" + id + ", name=" + name + "]";
}
}

公共服務接口-PeopleService.java

package com.czh.dubbo.common.service;
import com.czh.dubbo.common.entity.People;
public interface PeopleService {
People getPeople(People people);
}

五、搭建服務提供者

服務提供者就是被消費者所調用的,它需要實現公共服務接口,並通過dubbo把自己的服務暴露出來。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

com.alibaba.boot是遷移過後出的一個最新的dubbo spring boot starter,也是目前官方推薦使用的。值得注意的是,該starter不包含註冊中心客戶端,需要自己配置。一般推薦使用zookeeper作為註冊中心,所以需要手動引入zkclient。

application.properties

#web服務端口,由於我們不需要使用web服務,所以將其設為隨機端口
server.port=-1
#dubbo服務端口,我們無需知道dubbo服務運行在哪個端口,故也將其設為隨機端口
dubbo.protocol.port = -1
#dubbo服務名稱
dubbo.application.name = dubbo-provider
#dubbo服務所在包路徑
dubbo.scan.basePackages = com.czh.dubbo.provider.service
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#設置服務的日誌輸出級別為debug級
logging.level.com.czh.dubbo.provider.service=debug

服務實現類PeopleServiceImpl

package com.czh.dubbo.provider.service;
import java.util.Random;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.dubbo.config.annotation.Service;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
//注意,這裡的service註解用的不是spring的註解,而是com.alibaba.dubbo.config.annotation.Service;
@Service
public class PeopleServiceImpl implements PeopleService{
private static final Logger logger = LoggerFactory.getLogger(PeopleServiceImpl.class);
/**
* 這個方法的作用是接收傳過來的People實體,將其ID賦為隨機數
*/
@Override
public People getPeople(People people) {
people.setId(new Random().nextInt(10000));
logger.debug("People:{},ID:{}",people.getName(),people.getId());
return people;
}
}

六、搭建服務消費者

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

application.properties

#web服務端口
server.port=80
#消費者名稱
dubbo.application.name=dubbo-consumer
#需要使用到提供者服務的包路徑
dubbo.scan.base-packages=com.czh.dubbo.consumer.controller
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181

控制器PeopleController

package com.czh.dubbo.consumer.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
@RestController
public class PeopleController {
@Reference
private PeopleService peopleService;
@GetMapping("/people/{name}")
public People getPeople(@PathVariable("name") String name) {
People people = new People();
people.setName(name);
return peopleService.getPeople(people);
}
}

至此,整個項目便搭建完畢,三個項目的項目結構如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

七、上線運行

1、打包運行

安裝API項目到本地maven倉庫

在dubbo-common項目的pom.xml文件上點擊右鍵,Run as - Maven install

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打包服務提供者與服務消費者

在這兩個項目的pom.xml文件執行以下操作:點擊右鍵,Run as - Maven build… 在彈出的選項框中Golas 填寫:clean package,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

點擊run,打包成功後如下圖:

"

一、Dubbo介紹

引用官方的一段介紹

Apache Dubbo (incubating) |ˈdʌbəʊ| is a high-performance, java based RPC framework open-sourced by Alibaba. As in many RPC systems, dubbo is based around the idea of defining a service, specifying the methods that can be called remotely with their parameters and return types. On the server side, the server implements this interface and runs a dubbo server to handle client calls. On the client side, the client has a stub that provides the same methods as the server.

Dubbo是阿里出的一個高性能的分佈式微服務框架,它的特點是性能高、界面友好、文檔齊全(特別是中文文檔),是很多中小型公司快速搭建微服務的首選技術。前段時間被阿里重新進行維護,並進入Apache孵化器。遷移到Apache後也推出了新的starter,簡單試用後感覺不錯,為此特地寫下這一系列筆記,用以記錄。(整個項目的源碼在最後一章,感興趣的童鞋可以下載自己搭建試試,也可以將其作為腳手架搭建你自己的微服務)

二、搭建註冊中心

在dubbo中,每一個服務都是分佈式的,消費者與提供者的關係並不是一對一的關係,而是一對多,並且服務提供者的實例位置是未知的,如果都由開發者使用靜態文件去維護這個關係顯示不合適的,一方面是徒增工作量,另一方面是靈活度不高,如果服務提供者更換了服務器地址,那麼需要重新配置等,所以目前比較推崇的方案是所有服務提供者均主動將自己的信息註冊到同個地方中,而消費者只要一律從這個地方取他需要的東西即可,這個地方就是所謂的註冊中心。目前dubbo可以選擇的註冊中心包括zookeeper、redis等,一般建議使用zookeeper,下面演示一下在windows中如何搭建zookeeper註冊中心。

1、下載zookeeper

直接在官網的鏡像站下 (https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/zookeeper-3.4.12.tar.gz)

2、解壓並配置zookeeper

為了演示,直接使用官方示例配置。把解壓出來的\\zookeeper-3.4.12\\conf\\zoo_sample.cfg 文件名改為zoo.cfg即可,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、運行zookeeper註冊中心

雙擊運行/zookeeper-3.4.12/bin/zkServer.cmd,出現以下窗口代表運行成功。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

三、搭建Dubbo Admin

在Dubbo中,一大殺器就是它的可視化監控界面,在這個界面中可以查看服務者、提供者的數量、狀態等,並對服務降級、容錯、屏蔽等提供了可視化操作。下面演示如何搭建Dubbo Admin。

1、下載源碼並解壓

點擊下面地址下載dubbo admin項目源碼 (https://codeload.github.com/apache/incubator-dubbo-ops/zip/master)

下載後解壓出來,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

2、打包

打開cmd,進入第一步解壓出來的dubbo-admin文件夾中,執行mvn clean package

(ps:要是提示未存在mvn命令,就把maven文件夾的bin目錄添加到系統環境變量PATH中)

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、配置dubbo admin

打開上面那步打出來的war包(\\incubator-dubbo-ops-master\\dubbo-admin\\target\\dubbo-admin-2.0.0.war),編輯WEB-INF文件夾中的dubbo.properties文件,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將紅框處的IP地址改為你的註冊中心的地址,由於我們的註冊中心是在本地運行的,故此處無需做修改。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

4、運行Dubbo Admin

將war包改名為ROOT.war後放到tomcat的webapp目錄中,然後運行tomcat。使用瀏覽器打開http://127.0.0.1:8080,提示輸入賬號密碼,賬號和密碼默認均為root,登陸後的界面如下:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

四、搭建API項目

由於Dubbo是採用RPC調用方式,這也是與Spring Cloud比較大的區別之一。在Spring Cloud中,服務通過HTTP接口提供給其它服務調用,對於調用者與被調用者來說,只要雙方保證滿足http接口的契約即可,但是在dubbo中,是嚴格要求調用接口的類路徑、參數等雙方一致。所以需要構建一個API項目,該項目裡面存放服務接口即公共實體,雙方依賴這個項目完成遠程調用。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
</project>

公共實體-People.java

package com.czh.dubbo.common.entity;
import java.io.Serializable;
public class People implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1415852192397895853L;
// 人員編號
private int id;
// 姓名
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "People [id=" + id + ", name=" + name + "]";
}
}

公共服務接口-PeopleService.java

package com.czh.dubbo.common.service;
import com.czh.dubbo.common.entity.People;
public interface PeopleService {
People getPeople(People people);
}

五、搭建服務提供者

服務提供者就是被消費者所調用的,它需要實現公共服務接口,並通過dubbo把自己的服務暴露出來。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

com.alibaba.boot是遷移過後出的一個最新的dubbo spring boot starter,也是目前官方推薦使用的。值得注意的是,該starter不包含註冊中心客戶端,需要自己配置。一般推薦使用zookeeper作為註冊中心,所以需要手動引入zkclient。

application.properties

#web服務端口,由於我們不需要使用web服務,所以將其設為隨機端口
server.port=-1
#dubbo服務端口,我們無需知道dubbo服務運行在哪個端口,故也將其設為隨機端口
dubbo.protocol.port = -1
#dubbo服務名稱
dubbo.application.name = dubbo-provider
#dubbo服務所在包路徑
dubbo.scan.basePackages = com.czh.dubbo.provider.service
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#設置服務的日誌輸出級別為debug級
logging.level.com.czh.dubbo.provider.service=debug

服務實現類PeopleServiceImpl

package com.czh.dubbo.provider.service;
import java.util.Random;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.dubbo.config.annotation.Service;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
//注意,這裡的service註解用的不是spring的註解,而是com.alibaba.dubbo.config.annotation.Service;
@Service
public class PeopleServiceImpl implements PeopleService{
private static final Logger logger = LoggerFactory.getLogger(PeopleServiceImpl.class);
/**
* 這個方法的作用是接收傳過來的People實體,將其ID賦為隨機數
*/
@Override
public People getPeople(People people) {
people.setId(new Random().nextInt(10000));
logger.debug("People:{},ID:{}",people.getName(),people.getId());
return people;
}
}

六、搭建服務消費者

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

application.properties

#web服務端口
server.port=80
#消費者名稱
dubbo.application.name=dubbo-consumer
#需要使用到提供者服務的包路徑
dubbo.scan.base-packages=com.czh.dubbo.consumer.controller
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181

控制器PeopleController

package com.czh.dubbo.consumer.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
@RestController
public class PeopleController {
@Reference
private PeopleService peopleService;
@GetMapping("/people/{name}")
public People getPeople(@PathVariable("name") String name) {
People people = new People();
people.setName(name);
return peopleService.getPeople(people);
}
}

至此,整個項目便搭建完畢,三個項目的項目結構如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

七、上線運行

1、打包運行

安裝API項目到本地maven倉庫

在dubbo-common項目的pom.xml文件上點擊右鍵,Run as - Maven install

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打包服務提供者與服務消費者

在這兩個項目的pom.xml文件執行以下操作:點擊右鍵,Run as - Maven build… 在彈出的選項框中Golas 填寫:clean package,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

點擊run,打包成功後如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將兩個項目的target文件夾中拿出打好的jar包放到某個文件夾下備用,如下圖

"

一、Dubbo介紹

引用官方的一段介紹

Apache Dubbo (incubating) |ˈdʌbəʊ| is a high-performance, java based RPC framework open-sourced by Alibaba. As in many RPC systems, dubbo is based around the idea of defining a service, specifying the methods that can be called remotely with their parameters and return types. On the server side, the server implements this interface and runs a dubbo server to handle client calls. On the client side, the client has a stub that provides the same methods as the server.

Dubbo是阿里出的一個高性能的分佈式微服務框架,它的特點是性能高、界面友好、文檔齊全(特別是中文文檔),是很多中小型公司快速搭建微服務的首選技術。前段時間被阿里重新進行維護,並進入Apache孵化器。遷移到Apache後也推出了新的starter,簡單試用後感覺不錯,為此特地寫下這一系列筆記,用以記錄。(整個項目的源碼在最後一章,感興趣的童鞋可以下載自己搭建試試,也可以將其作為腳手架搭建你自己的微服務)

二、搭建註冊中心

在dubbo中,每一個服務都是分佈式的,消費者與提供者的關係並不是一對一的關係,而是一對多,並且服務提供者的實例位置是未知的,如果都由開發者使用靜態文件去維護這個關係顯示不合適的,一方面是徒增工作量,另一方面是靈活度不高,如果服務提供者更換了服務器地址,那麼需要重新配置等,所以目前比較推崇的方案是所有服務提供者均主動將自己的信息註冊到同個地方中,而消費者只要一律從這個地方取他需要的東西即可,這個地方就是所謂的註冊中心。目前dubbo可以選擇的註冊中心包括zookeeper、redis等,一般建議使用zookeeper,下面演示一下在windows中如何搭建zookeeper註冊中心。

1、下載zookeeper

直接在官網的鏡像站下 (https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/zookeeper-3.4.12.tar.gz)

2、解壓並配置zookeeper

為了演示,直接使用官方示例配置。把解壓出來的\\zookeeper-3.4.12\\conf\\zoo_sample.cfg 文件名改為zoo.cfg即可,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、運行zookeeper註冊中心

雙擊運行/zookeeper-3.4.12/bin/zkServer.cmd,出現以下窗口代表運行成功。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

三、搭建Dubbo Admin

在Dubbo中,一大殺器就是它的可視化監控界面,在這個界面中可以查看服務者、提供者的數量、狀態等,並對服務降級、容錯、屏蔽等提供了可視化操作。下面演示如何搭建Dubbo Admin。

1、下載源碼並解壓

點擊下面地址下載dubbo admin項目源碼 (https://codeload.github.com/apache/incubator-dubbo-ops/zip/master)

下載後解壓出來,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

2、打包

打開cmd,進入第一步解壓出來的dubbo-admin文件夾中,執行mvn clean package

(ps:要是提示未存在mvn命令,就把maven文件夾的bin目錄添加到系統環境變量PATH中)

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、配置dubbo admin

打開上面那步打出來的war包(\\incubator-dubbo-ops-master\\dubbo-admin\\target\\dubbo-admin-2.0.0.war),編輯WEB-INF文件夾中的dubbo.properties文件,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將紅框處的IP地址改為你的註冊中心的地址,由於我們的註冊中心是在本地運行的,故此處無需做修改。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

4、運行Dubbo Admin

將war包改名為ROOT.war後放到tomcat的webapp目錄中,然後運行tomcat。使用瀏覽器打開http://127.0.0.1:8080,提示輸入賬號密碼,賬號和密碼默認均為root,登陸後的界面如下:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

四、搭建API項目

由於Dubbo是採用RPC調用方式,這也是與Spring Cloud比較大的區別之一。在Spring Cloud中,服務通過HTTP接口提供給其它服務調用,對於調用者與被調用者來說,只要雙方保證滿足http接口的契約即可,但是在dubbo中,是嚴格要求調用接口的類路徑、參數等雙方一致。所以需要構建一個API項目,該項目裡面存放服務接口即公共實體,雙方依賴這個項目完成遠程調用。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
</project>

公共實體-People.java

package com.czh.dubbo.common.entity;
import java.io.Serializable;
public class People implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1415852192397895853L;
// 人員編號
private int id;
// 姓名
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "People [id=" + id + ", name=" + name + "]";
}
}

公共服務接口-PeopleService.java

package com.czh.dubbo.common.service;
import com.czh.dubbo.common.entity.People;
public interface PeopleService {
People getPeople(People people);
}

五、搭建服務提供者

服務提供者就是被消費者所調用的,它需要實現公共服務接口,並通過dubbo把自己的服務暴露出來。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

com.alibaba.boot是遷移過後出的一個最新的dubbo spring boot starter,也是目前官方推薦使用的。值得注意的是,該starter不包含註冊中心客戶端,需要自己配置。一般推薦使用zookeeper作為註冊中心,所以需要手動引入zkclient。

application.properties

#web服務端口,由於我們不需要使用web服務,所以將其設為隨機端口
server.port=-1
#dubbo服務端口,我們無需知道dubbo服務運行在哪個端口,故也將其設為隨機端口
dubbo.protocol.port = -1
#dubbo服務名稱
dubbo.application.name = dubbo-provider
#dubbo服務所在包路徑
dubbo.scan.basePackages = com.czh.dubbo.provider.service
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#設置服務的日誌輸出級別為debug級
logging.level.com.czh.dubbo.provider.service=debug

服務實現類PeopleServiceImpl

package com.czh.dubbo.provider.service;
import java.util.Random;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.dubbo.config.annotation.Service;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
//注意,這裡的service註解用的不是spring的註解,而是com.alibaba.dubbo.config.annotation.Service;
@Service
public class PeopleServiceImpl implements PeopleService{
private static final Logger logger = LoggerFactory.getLogger(PeopleServiceImpl.class);
/**
* 這個方法的作用是接收傳過來的People實體,將其ID賦為隨機數
*/
@Override
public People getPeople(People people) {
people.setId(new Random().nextInt(10000));
logger.debug("People:{},ID:{}",people.getName(),people.getId());
return people;
}
}

六、搭建服務消費者

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

application.properties

#web服務端口
server.port=80
#消費者名稱
dubbo.application.name=dubbo-consumer
#需要使用到提供者服務的包路徑
dubbo.scan.base-packages=com.czh.dubbo.consumer.controller
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181

控制器PeopleController

package com.czh.dubbo.consumer.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
@RestController
public class PeopleController {
@Reference
private PeopleService peopleService;
@GetMapping("/people/{name}")
public People getPeople(@PathVariable("name") String name) {
People people = new People();
people.setName(name);
return peopleService.getPeople(people);
}
}

至此,整個項目便搭建完畢,三個項目的項目結構如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

七、上線運行

1、打包運行

安裝API項目到本地maven倉庫

在dubbo-common項目的pom.xml文件上點擊右鍵,Run as - Maven install

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打包服務提供者與服務消費者

在這兩個項目的pom.xml文件執行以下操作:點擊右鍵,Run as - Maven build… 在彈出的選項框中Golas 填寫:clean package,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

點擊run,打包成功後如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將兩個項目的target文件夾中拿出打好的jar包放到某個文件夾下備用,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

使用java -jar 命令依次運行dubbo-provider 與dubbo-consumer,順序不能搞錯,並且得確保provider啟動完成後再啟動consumer,否則後期會出現空指針異常。

至此,我們總共啟動了四個服務,分別是zookeeper註冊中心、dubbo-admin、dubbo-provider、dubbo-consumer,如下圖:

"

一、Dubbo介紹

引用官方的一段介紹

Apache Dubbo (incubating) |ˈdʌbəʊ| is a high-performance, java based RPC framework open-sourced by Alibaba. As in many RPC systems, dubbo is based around the idea of defining a service, specifying the methods that can be called remotely with their parameters and return types. On the server side, the server implements this interface and runs a dubbo server to handle client calls. On the client side, the client has a stub that provides the same methods as the server.

Dubbo是阿里出的一個高性能的分佈式微服務框架,它的特點是性能高、界面友好、文檔齊全(特別是中文文檔),是很多中小型公司快速搭建微服務的首選技術。前段時間被阿里重新進行維護,並進入Apache孵化器。遷移到Apache後也推出了新的starter,簡單試用後感覺不錯,為此特地寫下這一系列筆記,用以記錄。(整個項目的源碼在最後一章,感興趣的童鞋可以下載自己搭建試試,也可以將其作為腳手架搭建你自己的微服務)

二、搭建註冊中心

在dubbo中,每一個服務都是分佈式的,消費者與提供者的關係並不是一對一的關係,而是一對多,並且服務提供者的實例位置是未知的,如果都由開發者使用靜態文件去維護這個關係顯示不合適的,一方面是徒增工作量,另一方面是靈活度不高,如果服務提供者更換了服務器地址,那麼需要重新配置等,所以目前比較推崇的方案是所有服務提供者均主動將自己的信息註冊到同個地方中,而消費者只要一律從這個地方取他需要的東西即可,這個地方就是所謂的註冊中心。目前dubbo可以選擇的註冊中心包括zookeeper、redis等,一般建議使用zookeeper,下面演示一下在windows中如何搭建zookeeper註冊中心。

1、下載zookeeper

直接在官網的鏡像站下 (https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/zookeeper-3.4.12.tar.gz)

2、解壓並配置zookeeper

為了演示,直接使用官方示例配置。把解壓出來的\\zookeeper-3.4.12\\conf\\zoo_sample.cfg 文件名改為zoo.cfg即可,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、運行zookeeper註冊中心

雙擊運行/zookeeper-3.4.12/bin/zkServer.cmd,出現以下窗口代表運行成功。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

三、搭建Dubbo Admin

在Dubbo中,一大殺器就是它的可視化監控界面,在這個界面中可以查看服務者、提供者的數量、狀態等,並對服務降級、容錯、屏蔽等提供了可視化操作。下面演示如何搭建Dubbo Admin。

1、下載源碼並解壓

點擊下面地址下載dubbo admin項目源碼 (https://codeload.github.com/apache/incubator-dubbo-ops/zip/master)

下載後解壓出來,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

2、打包

打開cmd,進入第一步解壓出來的dubbo-admin文件夾中,執行mvn clean package

(ps:要是提示未存在mvn命令,就把maven文件夾的bin目錄添加到系統環境變量PATH中)

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、配置dubbo admin

打開上面那步打出來的war包(\\incubator-dubbo-ops-master\\dubbo-admin\\target\\dubbo-admin-2.0.0.war),編輯WEB-INF文件夾中的dubbo.properties文件,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將紅框處的IP地址改為你的註冊中心的地址,由於我們的註冊中心是在本地運行的,故此處無需做修改。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

4、運行Dubbo Admin

將war包改名為ROOT.war後放到tomcat的webapp目錄中,然後運行tomcat。使用瀏覽器打開http://127.0.0.1:8080,提示輸入賬號密碼,賬號和密碼默認均為root,登陸後的界面如下:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

四、搭建API項目

由於Dubbo是採用RPC調用方式,這也是與Spring Cloud比較大的區別之一。在Spring Cloud中,服務通過HTTP接口提供給其它服務調用,對於調用者與被調用者來說,只要雙方保證滿足http接口的契約即可,但是在dubbo中,是嚴格要求調用接口的類路徑、參數等雙方一致。所以需要構建一個API項目,該項目裡面存放服務接口即公共實體,雙方依賴這個項目完成遠程調用。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
</project>

公共實體-People.java

package com.czh.dubbo.common.entity;
import java.io.Serializable;
public class People implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1415852192397895853L;
// 人員編號
private int id;
// 姓名
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "People [id=" + id + ", name=" + name + "]";
}
}

公共服務接口-PeopleService.java

package com.czh.dubbo.common.service;
import com.czh.dubbo.common.entity.People;
public interface PeopleService {
People getPeople(People people);
}

五、搭建服務提供者

服務提供者就是被消費者所調用的,它需要實現公共服務接口,並通過dubbo把自己的服務暴露出來。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

com.alibaba.boot是遷移過後出的一個最新的dubbo spring boot starter,也是目前官方推薦使用的。值得注意的是,該starter不包含註冊中心客戶端,需要自己配置。一般推薦使用zookeeper作為註冊中心,所以需要手動引入zkclient。

application.properties

#web服務端口,由於我們不需要使用web服務,所以將其設為隨機端口
server.port=-1
#dubbo服務端口,我們無需知道dubbo服務運行在哪個端口,故也將其設為隨機端口
dubbo.protocol.port = -1
#dubbo服務名稱
dubbo.application.name = dubbo-provider
#dubbo服務所在包路徑
dubbo.scan.basePackages = com.czh.dubbo.provider.service
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#設置服務的日誌輸出級別為debug級
logging.level.com.czh.dubbo.provider.service=debug

服務實現類PeopleServiceImpl

package com.czh.dubbo.provider.service;
import java.util.Random;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.dubbo.config.annotation.Service;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
//注意,這裡的service註解用的不是spring的註解,而是com.alibaba.dubbo.config.annotation.Service;
@Service
public class PeopleServiceImpl implements PeopleService{
private static final Logger logger = LoggerFactory.getLogger(PeopleServiceImpl.class);
/**
* 這個方法的作用是接收傳過來的People實體,將其ID賦為隨機數
*/
@Override
public People getPeople(People people) {
people.setId(new Random().nextInt(10000));
logger.debug("People:{},ID:{}",people.getName(),people.getId());
return people;
}
}

六、搭建服務消費者

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

application.properties

#web服務端口
server.port=80
#消費者名稱
dubbo.application.name=dubbo-consumer
#需要使用到提供者服務的包路徑
dubbo.scan.base-packages=com.czh.dubbo.consumer.controller
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181

控制器PeopleController

package com.czh.dubbo.consumer.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
@RestController
public class PeopleController {
@Reference
private PeopleService peopleService;
@GetMapping("/people/{name}")
public People getPeople(@PathVariable("name") String name) {
People people = new People();
people.setName(name);
return peopleService.getPeople(people);
}
}

至此,整個項目便搭建完畢,三個項目的項目結構如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

七、上線運行

1、打包運行

安裝API項目到本地maven倉庫

在dubbo-common項目的pom.xml文件上點擊右鍵,Run as - Maven install

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打包服務提供者與服務消費者

在這兩個項目的pom.xml文件執行以下操作:點擊右鍵,Run as - Maven build… 在彈出的選項框中Golas 填寫:clean package,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

點擊run,打包成功後如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將兩個項目的target文件夾中拿出打好的jar包放到某個文件夾下備用,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

使用java -jar 命令依次運行dubbo-provider 與dubbo-consumer,順序不能搞錯,並且得確保provider啟動完成後再啟動consumer,否則後期會出現空指針異常。

至此,我們總共啟動了四個服務,分別是zookeeper註冊中心、dubbo-admin、dubbo-provider、dubbo-consumer,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打開dubbo監控網頁檢查服務消費者和提供者是否已經註冊成功:

"

一、Dubbo介紹

引用官方的一段介紹

Apache Dubbo (incubating) |ˈdʌbəʊ| is a high-performance, java based RPC framework open-sourced by Alibaba. As in many RPC systems, dubbo is based around the idea of defining a service, specifying the methods that can be called remotely with their parameters and return types. On the server side, the server implements this interface and runs a dubbo server to handle client calls. On the client side, the client has a stub that provides the same methods as the server.

Dubbo是阿里出的一個高性能的分佈式微服務框架,它的特點是性能高、界面友好、文檔齊全(特別是中文文檔),是很多中小型公司快速搭建微服務的首選技術。前段時間被阿里重新進行維護,並進入Apache孵化器。遷移到Apache後也推出了新的starter,簡單試用後感覺不錯,為此特地寫下這一系列筆記,用以記錄。(整個項目的源碼在最後一章,感興趣的童鞋可以下載自己搭建試試,也可以將其作為腳手架搭建你自己的微服務)

二、搭建註冊中心

在dubbo中,每一個服務都是分佈式的,消費者與提供者的關係並不是一對一的關係,而是一對多,並且服務提供者的實例位置是未知的,如果都由開發者使用靜態文件去維護這個關係顯示不合適的,一方面是徒增工作量,另一方面是靈活度不高,如果服務提供者更換了服務器地址,那麼需要重新配置等,所以目前比較推崇的方案是所有服務提供者均主動將自己的信息註冊到同個地方中,而消費者只要一律從這個地方取他需要的東西即可,這個地方就是所謂的註冊中心。目前dubbo可以選擇的註冊中心包括zookeeper、redis等,一般建議使用zookeeper,下面演示一下在windows中如何搭建zookeeper註冊中心。

1、下載zookeeper

直接在官網的鏡像站下 (https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/zookeeper-3.4.12.tar.gz)

2、解壓並配置zookeeper

為了演示,直接使用官方示例配置。把解壓出來的\\zookeeper-3.4.12\\conf\\zoo_sample.cfg 文件名改為zoo.cfg即可,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、運行zookeeper註冊中心

雙擊運行/zookeeper-3.4.12/bin/zkServer.cmd,出現以下窗口代表運行成功。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

三、搭建Dubbo Admin

在Dubbo中,一大殺器就是它的可視化監控界面,在這個界面中可以查看服務者、提供者的數量、狀態等,並對服務降級、容錯、屏蔽等提供了可視化操作。下面演示如何搭建Dubbo Admin。

1、下載源碼並解壓

點擊下面地址下載dubbo admin項目源碼 (https://codeload.github.com/apache/incubator-dubbo-ops/zip/master)

下載後解壓出來,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

2、打包

打開cmd,進入第一步解壓出來的dubbo-admin文件夾中,執行mvn clean package

(ps:要是提示未存在mvn命令,就把maven文件夾的bin目錄添加到系統環境變量PATH中)

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、配置dubbo admin

打開上面那步打出來的war包(\\incubator-dubbo-ops-master\\dubbo-admin\\target\\dubbo-admin-2.0.0.war),編輯WEB-INF文件夾中的dubbo.properties文件,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將紅框處的IP地址改為你的註冊中心的地址,由於我們的註冊中心是在本地運行的,故此處無需做修改。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

4、運行Dubbo Admin

將war包改名為ROOT.war後放到tomcat的webapp目錄中,然後運行tomcat。使用瀏覽器打開http://127.0.0.1:8080,提示輸入賬號密碼,賬號和密碼默認均為root,登陸後的界面如下:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

四、搭建API項目

由於Dubbo是採用RPC調用方式,這也是與Spring Cloud比較大的區別之一。在Spring Cloud中,服務通過HTTP接口提供給其它服務調用,對於調用者與被調用者來說,只要雙方保證滿足http接口的契約即可,但是在dubbo中,是嚴格要求調用接口的類路徑、參數等雙方一致。所以需要構建一個API項目,該項目裡面存放服務接口即公共實體,雙方依賴這個項目完成遠程調用。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
</project>

公共實體-People.java

package com.czh.dubbo.common.entity;
import java.io.Serializable;
public class People implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1415852192397895853L;
// 人員編號
private int id;
// 姓名
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "People [id=" + id + ", name=" + name + "]";
}
}

公共服務接口-PeopleService.java

package com.czh.dubbo.common.service;
import com.czh.dubbo.common.entity.People;
public interface PeopleService {
People getPeople(People people);
}

五、搭建服務提供者

服務提供者就是被消費者所調用的,它需要實現公共服務接口,並通過dubbo把自己的服務暴露出來。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

com.alibaba.boot是遷移過後出的一個最新的dubbo spring boot starter,也是目前官方推薦使用的。值得注意的是,該starter不包含註冊中心客戶端,需要自己配置。一般推薦使用zookeeper作為註冊中心,所以需要手動引入zkclient。

application.properties

#web服務端口,由於我們不需要使用web服務,所以將其設為隨機端口
server.port=-1
#dubbo服務端口,我們無需知道dubbo服務運行在哪個端口,故也將其設為隨機端口
dubbo.protocol.port = -1
#dubbo服務名稱
dubbo.application.name = dubbo-provider
#dubbo服務所在包路徑
dubbo.scan.basePackages = com.czh.dubbo.provider.service
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#設置服務的日誌輸出級別為debug級
logging.level.com.czh.dubbo.provider.service=debug

服務實現類PeopleServiceImpl

package com.czh.dubbo.provider.service;
import java.util.Random;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.dubbo.config.annotation.Service;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
//注意,這裡的service註解用的不是spring的註解,而是com.alibaba.dubbo.config.annotation.Service;
@Service
public class PeopleServiceImpl implements PeopleService{
private static final Logger logger = LoggerFactory.getLogger(PeopleServiceImpl.class);
/**
* 這個方法的作用是接收傳過來的People實體,將其ID賦為隨機數
*/
@Override
public People getPeople(People people) {
people.setId(new Random().nextInt(10000));
logger.debug("People:{},ID:{}",people.getName(),people.getId());
return people;
}
}

六、搭建服務消費者

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

application.properties

#web服務端口
server.port=80
#消費者名稱
dubbo.application.name=dubbo-consumer
#需要使用到提供者服務的包路徑
dubbo.scan.base-packages=com.czh.dubbo.consumer.controller
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181

控制器PeopleController

package com.czh.dubbo.consumer.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
@RestController
public class PeopleController {
@Reference
private PeopleService peopleService;
@GetMapping("/people/{name}")
public People getPeople(@PathVariable("name") String name) {
People people = new People();
people.setName(name);
return peopleService.getPeople(people);
}
}

至此,整個項目便搭建完畢,三個項目的項目結構如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

七、上線運行

1、打包運行

安裝API項目到本地maven倉庫

在dubbo-common項目的pom.xml文件上點擊右鍵,Run as - Maven install

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打包服務提供者與服務消費者

在這兩個項目的pom.xml文件執行以下操作:點擊右鍵,Run as - Maven build… 在彈出的選項框中Golas 填寫:clean package,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

點擊run,打包成功後如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將兩個項目的target文件夾中拿出打好的jar包放到某個文件夾下備用,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

使用java -jar 命令依次運行dubbo-provider 與dubbo-consumer,順序不能搞錯,並且得確保provider啟動完成後再啟動consumer,否則後期會出現空指針異常。

至此,我們總共啟動了四個服務,分別是zookeeper註冊中心、dubbo-admin、dubbo-provider、dubbo-consumer,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打開dubbo監控網頁檢查服務消費者和提供者是否已經註冊成功:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

"

一、Dubbo介紹

引用官方的一段介紹

Apache Dubbo (incubating) |ˈdʌbəʊ| is a high-performance, java based RPC framework open-sourced by Alibaba. As in many RPC systems, dubbo is based around the idea of defining a service, specifying the methods that can be called remotely with their parameters and return types. On the server side, the server implements this interface and runs a dubbo server to handle client calls. On the client side, the client has a stub that provides the same methods as the server.

Dubbo是阿里出的一個高性能的分佈式微服務框架,它的特點是性能高、界面友好、文檔齊全(特別是中文文檔),是很多中小型公司快速搭建微服務的首選技術。前段時間被阿里重新進行維護,並進入Apache孵化器。遷移到Apache後也推出了新的starter,簡單試用後感覺不錯,為此特地寫下這一系列筆記,用以記錄。(整個項目的源碼在最後一章,感興趣的童鞋可以下載自己搭建試試,也可以將其作為腳手架搭建你自己的微服務)

二、搭建註冊中心

在dubbo中,每一個服務都是分佈式的,消費者與提供者的關係並不是一對一的關係,而是一對多,並且服務提供者的實例位置是未知的,如果都由開發者使用靜態文件去維護這個關係顯示不合適的,一方面是徒增工作量,另一方面是靈活度不高,如果服務提供者更換了服務器地址,那麼需要重新配置等,所以目前比較推崇的方案是所有服務提供者均主動將自己的信息註冊到同個地方中,而消費者只要一律從這個地方取他需要的東西即可,這個地方就是所謂的註冊中心。目前dubbo可以選擇的註冊中心包括zookeeper、redis等,一般建議使用zookeeper,下面演示一下在windows中如何搭建zookeeper註冊中心。

1、下載zookeeper

直接在官網的鏡像站下 (https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/zookeeper-3.4.12.tar.gz)

2、解壓並配置zookeeper

為了演示,直接使用官方示例配置。把解壓出來的\\zookeeper-3.4.12\\conf\\zoo_sample.cfg 文件名改為zoo.cfg即可,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、運行zookeeper註冊中心

雙擊運行/zookeeper-3.4.12/bin/zkServer.cmd,出現以下窗口代表運行成功。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

三、搭建Dubbo Admin

在Dubbo中,一大殺器就是它的可視化監控界面,在這個界面中可以查看服務者、提供者的數量、狀態等,並對服務降級、容錯、屏蔽等提供了可視化操作。下面演示如何搭建Dubbo Admin。

1、下載源碼並解壓

點擊下面地址下載dubbo admin項目源碼 (https://codeload.github.com/apache/incubator-dubbo-ops/zip/master)

下載後解壓出來,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

2、打包

打開cmd,進入第一步解壓出來的dubbo-admin文件夾中,執行mvn clean package

(ps:要是提示未存在mvn命令,就把maven文件夾的bin目錄添加到系統環境變量PATH中)

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、配置dubbo admin

打開上面那步打出來的war包(\\incubator-dubbo-ops-master\\dubbo-admin\\target\\dubbo-admin-2.0.0.war),編輯WEB-INF文件夾中的dubbo.properties文件,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將紅框處的IP地址改為你的註冊中心的地址,由於我們的註冊中心是在本地運行的,故此處無需做修改。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

4、運行Dubbo Admin

將war包改名為ROOT.war後放到tomcat的webapp目錄中,然後運行tomcat。使用瀏覽器打開http://127.0.0.1:8080,提示輸入賬號密碼,賬號和密碼默認均為root,登陸後的界面如下:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

四、搭建API項目

由於Dubbo是採用RPC調用方式,這也是與Spring Cloud比較大的區別之一。在Spring Cloud中,服務通過HTTP接口提供給其它服務調用,對於調用者與被調用者來說,只要雙方保證滿足http接口的契約即可,但是在dubbo中,是嚴格要求調用接口的類路徑、參數等雙方一致。所以需要構建一個API項目,該項目裡面存放服務接口即公共實體,雙方依賴這個項目完成遠程調用。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
</project>

公共實體-People.java

package com.czh.dubbo.common.entity;
import java.io.Serializable;
public class People implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1415852192397895853L;
// 人員編號
private int id;
// 姓名
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "People [id=" + id + ", name=" + name + "]";
}
}

公共服務接口-PeopleService.java

package com.czh.dubbo.common.service;
import com.czh.dubbo.common.entity.People;
public interface PeopleService {
People getPeople(People people);
}

五、搭建服務提供者

服務提供者就是被消費者所調用的,它需要實現公共服務接口,並通過dubbo把自己的服務暴露出來。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

com.alibaba.boot是遷移過後出的一個最新的dubbo spring boot starter,也是目前官方推薦使用的。值得注意的是,該starter不包含註冊中心客戶端,需要自己配置。一般推薦使用zookeeper作為註冊中心,所以需要手動引入zkclient。

application.properties

#web服務端口,由於我們不需要使用web服務,所以將其設為隨機端口
server.port=-1
#dubbo服務端口,我們無需知道dubbo服務運行在哪個端口,故也將其設為隨機端口
dubbo.protocol.port = -1
#dubbo服務名稱
dubbo.application.name = dubbo-provider
#dubbo服務所在包路徑
dubbo.scan.basePackages = com.czh.dubbo.provider.service
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#設置服務的日誌輸出級別為debug級
logging.level.com.czh.dubbo.provider.service=debug

服務實現類PeopleServiceImpl

package com.czh.dubbo.provider.service;
import java.util.Random;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.dubbo.config.annotation.Service;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
//注意,這裡的service註解用的不是spring的註解,而是com.alibaba.dubbo.config.annotation.Service;
@Service
public class PeopleServiceImpl implements PeopleService{
private static final Logger logger = LoggerFactory.getLogger(PeopleServiceImpl.class);
/**
* 這個方法的作用是接收傳過來的People實體,將其ID賦為隨機數
*/
@Override
public People getPeople(People people) {
people.setId(new Random().nextInt(10000));
logger.debug("People:{},ID:{}",people.getName(),people.getId());
return people;
}
}

六、搭建服務消費者

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

application.properties

#web服務端口
server.port=80
#消費者名稱
dubbo.application.name=dubbo-consumer
#需要使用到提供者服務的包路徑
dubbo.scan.base-packages=com.czh.dubbo.consumer.controller
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181

控制器PeopleController

package com.czh.dubbo.consumer.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
@RestController
public class PeopleController {
@Reference
private PeopleService peopleService;
@GetMapping("/people/{name}")
public People getPeople(@PathVariable("name") String name) {
People people = new People();
people.setName(name);
return peopleService.getPeople(people);
}
}

至此,整個項目便搭建完畢,三個項目的項目結構如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

七、上線運行

1、打包運行

安裝API項目到本地maven倉庫

在dubbo-common項目的pom.xml文件上點擊右鍵,Run as - Maven install

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打包服務提供者與服務消費者

在這兩個項目的pom.xml文件執行以下操作:點擊右鍵,Run as - Maven build… 在彈出的選項框中Golas 填寫:clean package,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

點擊run,打包成功後如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將兩個項目的target文件夾中拿出打好的jar包放到某個文件夾下備用,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

使用java -jar 命令依次運行dubbo-provider 與dubbo-consumer,順序不能搞錯,並且得確保provider啟動完成後再啟動consumer,否則後期會出現空指針異常。

至此,我們總共啟動了四個服務,分別是zookeeper註冊中心、dubbo-admin、dubbo-provider、dubbo-consumer,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打開dubbo監控網頁檢查服務消費者和提供者是否已經註冊成功:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到,提供者與消費者已成功註冊到註冊中心

2、基本調用

使用瀏覽器訪問此地址http://127.0.0.1/people/test,觀察服務提供者的控制檯輸出內容

"

一、Dubbo介紹

引用官方的一段介紹

Apache Dubbo (incubating) |ˈdʌbəʊ| is a high-performance, java based RPC framework open-sourced by Alibaba. As in many RPC systems, dubbo is based around the idea of defining a service, specifying the methods that can be called remotely with their parameters and return types. On the server side, the server implements this interface and runs a dubbo server to handle client calls. On the client side, the client has a stub that provides the same methods as the server.

Dubbo是阿里出的一個高性能的分佈式微服務框架,它的特點是性能高、界面友好、文檔齊全(特別是中文文檔),是很多中小型公司快速搭建微服務的首選技術。前段時間被阿里重新進行維護,並進入Apache孵化器。遷移到Apache後也推出了新的starter,簡單試用後感覺不錯,為此特地寫下這一系列筆記,用以記錄。(整個項目的源碼在最後一章,感興趣的童鞋可以下載自己搭建試試,也可以將其作為腳手架搭建你自己的微服務)

二、搭建註冊中心

在dubbo中,每一個服務都是分佈式的,消費者與提供者的關係並不是一對一的關係,而是一對多,並且服務提供者的實例位置是未知的,如果都由開發者使用靜態文件去維護這個關係顯示不合適的,一方面是徒增工作量,另一方面是靈活度不高,如果服務提供者更換了服務器地址,那麼需要重新配置等,所以目前比較推崇的方案是所有服務提供者均主動將自己的信息註冊到同個地方中,而消費者只要一律從這個地方取他需要的東西即可,這個地方就是所謂的註冊中心。目前dubbo可以選擇的註冊中心包括zookeeper、redis等,一般建議使用zookeeper,下面演示一下在windows中如何搭建zookeeper註冊中心。

1、下載zookeeper

直接在官網的鏡像站下 (https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/zookeeper-3.4.12.tar.gz)

2、解壓並配置zookeeper

為了演示,直接使用官方示例配置。把解壓出來的\\zookeeper-3.4.12\\conf\\zoo_sample.cfg 文件名改為zoo.cfg即可,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、運行zookeeper註冊中心

雙擊運行/zookeeper-3.4.12/bin/zkServer.cmd,出現以下窗口代表運行成功。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

三、搭建Dubbo Admin

在Dubbo中,一大殺器就是它的可視化監控界面,在這個界面中可以查看服務者、提供者的數量、狀態等,並對服務降級、容錯、屏蔽等提供了可視化操作。下面演示如何搭建Dubbo Admin。

1、下載源碼並解壓

點擊下面地址下載dubbo admin項目源碼 (https://codeload.github.com/apache/incubator-dubbo-ops/zip/master)

下載後解壓出來,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

2、打包

打開cmd,進入第一步解壓出來的dubbo-admin文件夾中,執行mvn clean package

(ps:要是提示未存在mvn命令,就把maven文件夾的bin目錄添加到系統環境變量PATH中)

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、配置dubbo admin

打開上面那步打出來的war包(\\incubator-dubbo-ops-master\\dubbo-admin\\target\\dubbo-admin-2.0.0.war),編輯WEB-INF文件夾中的dubbo.properties文件,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將紅框處的IP地址改為你的註冊中心的地址,由於我們的註冊中心是在本地運行的,故此處無需做修改。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

4、運行Dubbo Admin

將war包改名為ROOT.war後放到tomcat的webapp目錄中,然後運行tomcat。使用瀏覽器打開http://127.0.0.1:8080,提示輸入賬號密碼,賬號和密碼默認均為root,登陸後的界面如下:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

四、搭建API項目

由於Dubbo是採用RPC調用方式,這也是與Spring Cloud比較大的區別之一。在Spring Cloud中,服務通過HTTP接口提供給其它服務調用,對於調用者與被調用者來說,只要雙方保證滿足http接口的契約即可,但是在dubbo中,是嚴格要求調用接口的類路徑、參數等雙方一致。所以需要構建一個API項目,該項目裡面存放服務接口即公共實體,雙方依賴這個項目完成遠程調用。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
</project>

公共實體-People.java

package com.czh.dubbo.common.entity;
import java.io.Serializable;
public class People implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1415852192397895853L;
// 人員編號
private int id;
// 姓名
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "People [id=" + id + ", name=" + name + "]";
}
}

公共服務接口-PeopleService.java

package com.czh.dubbo.common.service;
import com.czh.dubbo.common.entity.People;
public interface PeopleService {
People getPeople(People people);
}

五、搭建服務提供者

服務提供者就是被消費者所調用的,它需要實現公共服務接口,並通過dubbo把自己的服務暴露出來。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

com.alibaba.boot是遷移過後出的一個最新的dubbo spring boot starter,也是目前官方推薦使用的。值得注意的是,該starter不包含註冊中心客戶端,需要自己配置。一般推薦使用zookeeper作為註冊中心,所以需要手動引入zkclient。

application.properties

#web服務端口,由於我們不需要使用web服務,所以將其設為隨機端口
server.port=-1
#dubbo服務端口,我們無需知道dubbo服務運行在哪個端口,故也將其設為隨機端口
dubbo.protocol.port = -1
#dubbo服務名稱
dubbo.application.name = dubbo-provider
#dubbo服務所在包路徑
dubbo.scan.basePackages = com.czh.dubbo.provider.service
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#設置服務的日誌輸出級別為debug級
logging.level.com.czh.dubbo.provider.service=debug

服務實現類PeopleServiceImpl

package com.czh.dubbo.provider.service;
import java.util.Random;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.dubbo.config.annotation.Service;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
//注意,這裡的service註解用的不是spring的註解,而是com.alibaba.dubbo.config.annotation.Service;
@Service
public class PeopleServiceImpl implements PeopleService{
private static final Logger logger = LoggerFactory.getLogger(PeopleServiceImpl.class);
/**
* 這個方法的作用是接收傳過來的People實體,將其ID賦為隨機數
*/
@Override
public People getPeople(People people) {
people.setId(new Random().nextInt(10000));
logger.debug("People:{},ID:{}",people.getName(),people.getId());
return people;
}
}

六、搭建服務消費者

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

application.properties

#web服務端口
server.port=80
#消費者名稱
dubbo.application.name=dubbo-consumer
#需要使用到提供者服務的包路徑
dubbo.scan.base-packages=com.czh.dubbo.consumer.controller
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181

控制器PeopleController

package com.czh.dubbo.consumer.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
@RestController
public class PeopleController {
@Reference
private PeopleService peopleService;
@GetMapping("/people/{name}")
public People getPeople(@PathVariable("name") String name) {
People people = new People();
people.setName(name);
return peopleService.getPeople(people);
}
}

至此,整個項目便搭建完畢,三個項目的項目結構如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

七、上線運行

1、打包運行

安裝API項目到本地maven倉庫

在dubbo-common項目的pom.xml文件上點擊右鍵,Run as - Maven install

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打包服務提供者與服務消費者

在這兩個項目的pom.xml文件執行以下操作:點擊右鍵,Run as - Maven build… 在彈出的選項框中Golas 填寫:clean package,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

點擊run,打包成功後如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將兩個項目的target文件夾中拿出打好的jar包放到某個文件夾下備用,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

使用java -jar 命令依次運行dubbo-provider 與dubbo-consumer,順序不能搞錯,並且得確保provider啟動完成後再啟動consumer,否則後期會出現空指針異常。

至此,我們總共啟動了四個服務,分別是zookeeper註冊中心、dubbo-admin、dubbo-provider、dubbo-consumer,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打開dubbo監控網頁檢查服務消費者和提供者是否已經註冊成功:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到,提供者與消費者已成功註冊到註冊中心

2、基本調用

使用瀏覽器訪問此地址http://127.0.0.1/people/test,觀察服務提供者的控制檯輸出內容

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

後臺控制檯已輸出日誌了,證明調用成功,那麼瀏覽器是否能夠拿到數據呢?

"

一、Dubbo介紹

引用官方的一段介紹

Apache Dubbo (incubating) |ˈdʌbəʊ| is a high-performance, java based RPC framework open-sourced by Alibaba. As in many RPC systems, dubbo is based around the idea of defining a service, specifying the methods that can be called remotely with their parameters and return types. On the server side, the server implements this interface and runs a dubbo server to handle client calls. On the client side, the client has a stub that provides the same methods as the server.

Dubbo是阿里出的一個高性能的分佈式微服務框架,它的特點是性能高、界面友好、文檔齊全(特別是中文文檔),是很多中小型公司快速搭建微服務的首選技術。前段時間被阿里重新進行維護,並進入Apache孵化器。遷移到Apache後也推出了新的starter,簡單試用後感覺不錯,為此特地寫下這一系列筆記,用以記錄。(整個項目的源碼在最後一章,感興趣的童鞋可以下載自己搭建試試,也可以將其作為腳手架搭建你自己的微服務)

二、搭建註冊中心

在dubbo中,每一個服務都是分佈式的,消費者與提供者的關係並不是一對一的關係,而是一對多,並且服務提供者的實例位置是未知的,如果都由開發者使用靜態文件去維護這個關係顯示不合適的,一方面是徒增工作量,另一方面是靈活度不高,如果服務提供者更換了服務器地址,那麼需要重新配置等,所以目前比較推崇的方案是所有服務提供者均主動將自己的信息註冊到同個地方中,而消費者只要一律從這個地方取他需要的東西即可,這個地方就是所謂的註冊中心。目前dubbo可以選擇的註冊中心包括zookeeper、redis等,一般建議使用zookeeper,下面演示一下在windows中如何搭建zookeeper註冊中心。

1、下載zookeeper

直接在官網的鏡像站下 (https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/zookeeper-3.4.12.tar.gz)

2、解壓並配置zookeeper

為了演示,直接使用官方示例配置。把解壓出來的\\zookeeper-3.4.12\\conf\\zoo_sample.cfg 文件名改為zoo.cfg即可,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、運行zookeeper註冊中心

雙擊運行/zookeeper-3.4.12/bin/zkServer.cmd,出現以下窗口代表運行成功。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

三、搭建Dubbo Admin

在Dubbo中,一大殺器就是它的可視化監控界面,在這個界面中可以查看服務者、提供者的數量、狀態等,並對服務降級、容錯、屏蔽等提供了可視化操作。下面演示如何搭建Dubbo Admin。

1、下載源碼並解壓

點擊下面地址下載dubbo admin項目源碼 (https://codeload.github.com/apache/incubator-dubbo-ops/zip/master)

下載後解壓出來,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

2、打包

打開cmd,進入第一步解壓出來的dubbo-admin文件夾中,執行mvn clean package

(ps:要是提示未存在mvn命令,就把maven文件夾的bin目錄添加到系統環境變量PATH中)

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、配置dubbo admin

打開上面那步打出來的war包(\\incubator-dubbo-ops-master\\dubbo-admin\\target\\dubbo-admin-2.0.0.war),編輯WEB-INF文件夾中的dubbo.properties文件,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將紅框處的IP地址改為你的註冊中心的地址,由於我們的註冊中心是在本地運行的,故此處無需做修改。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

4、運行Dubbo Admin

將war包改名為ROOT.war後放到tomcat的webapp目錄中,然後運行tomcat。使用瀏覽器打開http://127.0.0.1:8080,提示輸入賬號密碼,賬號和密碼默認均為root,登陸後的界面如下:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

四、搭建API項目

由於Dubbo是採用RPC調用方式,這也是與Spring Cloud比較大的區別之一。在Spring Cloud中,服務通過HTTP接口提供給其它服務調用,對於調用者與被調用者來說,只要雙方保證滿足http接口的契約即可,但是在dubbo中,是嚴格要求調用接口的類路徑、參數等雙方一致。所以需要構建一個API項目,該項目裡面存放服務接口即公共實體,雙方依賴這個項目完成遠程調用。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
</project>

公共實體-People.java

package com.czh.dubbo.common.entity;
import java.io.Serializable;
public class People implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1415852192397895853L;
// 人員編號
private int id;
// 姓名
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "People [id=" + id + ", name=" + name + "]";
}
}

公共服務接口-PeopleService.java

package com.czh.dubbo.common.service;
import com.czh.dubbo.common.entity.People;
public interface PeopleService {
People getPeople(People people);
}

五、搭建服務提供者

服務提供者就是被消費者所調用的,它需要實現公共服務接口,並通過dubbo把自己的服務暴露出來。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

com.alibaba.boot是遷移過後出的一個最新的dubbo spring boot starter,也是目前官方推薦使用的。值得注意的是,該starter不包含註冊中心客戶端,需要自己配置。一般推薦使用zookeeper作為註冊中心,所以需要手動引入zkclient。

application.properties

#web服務端口,由於我們不需要使用web服務,所以將其設為隨機端口
server.port=-1
#dubbo服務端口,我們無需知道dubbo服務運行在哪個端口,故也將其設為隨機端口
dubbo.protocol.port = -1
#dubbo服務名稱
dubbo.application.name = dubbo-provider
#dubbo服務所在包路徑
dubbo.scan.basePackages = com.czh.dubbo.provider.service
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#設置服務的日誌輸出級別為debug級
logging.level.com.czh.dubbo.provider.service=debug

服務實現類PeopleServiceImpl

package com.czh.dubbo.provider.service;
import java.util.Random;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.dubbo.config.annotation.Service;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
//注意,這裡的service註解用的不是spring的註解,而是com.alibaba.dubbo.config.annotation.Service;
@Service
public class PeopleServiceImpl implements PeopleService{
private static final Logger logger = LoggerFactory.getLogger(PeopleServiceImpl.class);
/**
* 這個方法的作用是接收傳過來的People實體,將其ID賦為隨機數
*/
@Override
public People getPeople(People people) {
people.setId(new Random().nextInt(10000));
logger.debug("People:{},ID:{}",people.getName(),people.getId());
return people;
}
}

六、搭建服務消費者

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

application.properties

#web服務端口
server.port=80
#消費者名稱
dubbo.application.name=dubbo-consumer
#需要使用到提供者服務的包路徑
dubbo.scan.base-packages=com.czh.dubbo.consumer.controller
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181

控制器PeopleController

package com.czh.dubbo.consumer.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
@RestController
public class PeopleController {
@Reference
private PeopleService peopleService;
@GetMapping("/people/{name}")
public People getPeople(@PathVariable("name") String name) {
People people = new People();
people.setName(name);
return peopleService.getPeople(people);
}
}

至此,整個項目便搭建完畢,三個項目的項目結構如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

七、上線運行

1、打包運行

安裝API項目到本地maven倉庫

在dubbo-common項目的pom.xml文件上點擊右鍵,Run as - Maven install

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打包服務提供者與服務消費者

在這兩個項目的pom.xml文件執行以下操作:點擊右鍵,Run as - Maven build… 在彈出的選項框中Golas 填寫:clean package,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

點擊run,打包成功後如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將兩個項目的target文件夾中拿出打好的jar包放到某個文件夾下備用,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

使用java -jar 命令依次運行dubbo-provider 與dubbo-consumer,順序不能搞錯,並且得確保provider啟動完成後再啟動consumer,否則後期會出現空指針異常。

至此,我們總共啟動了四個服務,分別是zookeeper註冊中心、dubbo-admin、dubbo-provider、dubbo-consumer,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打開dubbo監控網頁檢查服務消費者和提供者是否已經註冊成功:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到,提供者與消費者已成功註冊到註冊中心

2、基本調用

使用瀏覽器訪問此地址http://127.0.0.1/people/test,觀察服務提供者的控制檯輸出內容

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

後臺控制檯已輸出日誌了,證明調用成功,那麼瀏覽器是否能夠拿到數據呢?

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到瀏覽器也拿到數據了,證明已經成功完成調用了。

3、容錯與屏蔽

容錯

顧名思義就是當服務提供者出現異常時,消費者是否能夠正常處理,在這裡,我們關閉掉服務提供者,再進行調用,觀察是否會報錯

"

一、Dubbo介紹

引用官方的一段介紹

Apache Dubbo (incubating) |ˈdʌbəʊ| is a high-performance, java based RPC framework open-sourced by Alibaba. As in many RPC systems, dubbo is based around the idea of defining a service, specifying the methods that can be called remotely with their parameters and return types. On the server side, the server implements this interface and runs a dubbo server to handle client calls. On the client side, the client has a stub that provides the same methods as the server.

Dubbo是阿里出的一個高性能的分佈式微服務框架,它的特點是性能高、界面友好、文檔齊全(特別是中文文檔),是很多中小型公司快速搭建微服務的首選技術。前段時間被阿里重新進行維護,並進入Apache孵化器。遷移到Apache後也推出了新的starter,簡單試用後感覺不錯,為此特地寫下這一系列筆記,用以記錄。(整個項目的源碼在最後一章,感興趣的童鞋可以下載自己搭建試試,也可以將其作為腳手架搭建你自己的微服務)

二、搭建註冊中心

在dubbo中,每一個服務都是分佈式的,消費者與提供者的關係並不是一對一的關係,而是一對多,並且服務提供者的實例位置是未知的,如果都由開發者使用靜態文件去維護這個關係顯示不合適的,一方面是徒增工作量,另一方面是靈活度不高,如果服務提供者更換了服務器地址,那麼需要重新配置等,所以目前比較推崇的方案是所有服務提供者均主動將自己的信息註冊到同個地方中,而消費者只要一律從這個地方取他需要的東西即可,這個地方就是所謂的註冊中心。目前dubbo可以選擇的註冊中心包括zookeeper、redis等,一般建議使用zookeeper,下面演示一下在windows中如何搭建zookeeper註冊中心。

1、下載zookeeper

直接在官網的鏡像站下 (https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/zookeeper-3.4.12.tar.gz)

2、解壓並配置zookeeper

為了演示,直接使用官方示例配置。把解壓出來的\\zookeeper-3.4.12\\conf\\zoo_sample.cfg 文件名改為zoo.cfg即可,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、運行zookeeper註冊中心

雙擊運行/zookeeper-3.4.12/bin/zkServer.cmd,出現以下窗口代表運行成功。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

三、搭建Dubbo Admin

在Dubbo中,一大殺器就是它的可視化監控界面,在這個界面中可以查看服務者、提供者的數量、狀態等,並對服務降級、容錯、屏蔽等提供了可視化操作。下面演示如何搭建Dubbo Admin。

1、下載源碼並解壓

點擊下面地址下載dubbo admin項目源碼 (https://codeload.github.com/apache/incubator-dubbo-ops/zip/master)

下載後解壓出來,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

2、打包

打開cmd,進入第一步解壓出來的dubbo-admin文件夾中,執行mvn clean package

(ps:要是提示未存在mvn命令,就把maven文件夾的bin目錄添加到系統環境變量PATH中)

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、配置dubbo admin

打開上面那步打出來的war包(\\incubator-dubbo-ops-master\\dubbo-admin\\target\\dubbo-admin-2.0.0.war),編輯WEB-INF文件夾中的dubbo.properties文件,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將紅框處的IP地址改為你的註冊中心的地址,由於我們的註冊中心是在本地運行的,故此處無需做修改。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

4、運行Dubbo Admin

將war包改名為ROOT.war後放到tomcat的webapp目錄中,然後運行tomcat。使用瀏覽器打開http://127.0.0.1:8080,提示輸入賬號密碼,賬號和密碼默認均為root,登陸後的界面如下:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

四、搭建API項目

由於Dubbo是採用RPC調用方式,這也是與Spring Cloud比較大的區別之一。在Spring Cloud中,服務通過HTTP接口提供給其它服務調用,對於調用者與被調用者來說,只要雙方保證滿足http接口的契約即可,但是在dubbo中,是嚴格要求調用接口的類路徑、參數等雙方一致。所以需要構建一個API項目,該項目裡面存放服務接口即公共實體,雙方依賴這個項目完成遠程調用。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
</project>

公共實體-People.java

package com.czh.dubbo.common.entity;
import java.io.Serializable;
public class People implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1415852192397895853L;
// 人員編號
private int id;
// 姓名
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "People [id=" + id + ", name=" + name + "]";
}
}

公共服務接口-PeopleService.java

package com.czh.dubbo.common.service;
import com.czh.dubbo.common.entity.People;
public interface PeopleService {
People getPeople(People people);
}

五、搭建服務提供者

服務提供者就是被消費者所調用的,它需要實現公共服務接口,並通過dubbo把自己的服務暴露出來。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

com.alibaba.boot是遷移過後出的一個最新的dubbo spring boot starter,也是目前官方推薦使用的。值得注意的是,該starter不包含註冊中心客戶端,需要自己配置。一般推薦使用zookeeper作為註冊中心,所以需要手動引入zkclient。

application.properties

#web服務端口,由於我們不需要使用web服務,所以將其設為隨機端口
server.port=-1
#dubbo服務端口,我們無需知道dubbo服務運行在哪個端口,故也將其設為隨機端口
dubbo.protocol.port = -1
#dubbo服務名稱
dubbo.application.name = dubbo-provider
#dubbo服務所在包路徑
dubbo.scan.basePackages = com.czh.dubbo.provider.service
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#設置服務的日誌輸出級別為debug級
logging.level.com.czh.dubbo.provider.service=debug

服務實現類PeopleServiceImpl

package com.czh.dubbo.provider.service;
import java.util.Random;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.dubbo.config.annotation.Service;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
//注意,這裡的service註解用的不是spring的註解,而是com.alibaba.dubbo.config.annotation.Service;
@Service
public class PeopleServiceImpl implements PeopleService{
private static final Logger logger = LoggerFactory.getLogger(PeopleServiceImpl.class);
/**
* 這個方法的作用是接收傳過來的People實體,將其ID賦為隨機數
*/
@Override
public People getPeople(People people) {
people.setId(new Random().nextInt(10000));
logger.debug("People:{},ID:{}",people.getName(),people.getId());
return people;
}
}

六、搭建服務消費者

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

application.properties

#web服務端口
server.port=80
#消費者名稱
dubbo.application.name=dubbo-consumer
#需要使用到提供者服務的包路徑
dubbo.scan.base-packages=com.czh.dubbo.consumer.controller
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181

控制器PeopleController

package com.czh.dubbo.consumer.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
@RestController
public class PeopleController {
@Reference
private PeopleService peopleService;
@GetMapping("/people/{name}")
public People getPeople(@PathVariable("name") String name) {
People people = new People();
people.setName(name);
return peopleService.getPeople(people);
}
}

至此,整個項目便搭建完畢,三個項目的項目結構如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

七、上線運行

1、打包運行

安裝API項目到本地maven倉庫

在dubbo-common項目的pom.xml文件上點擊右鍵,Run as - Maven install

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打包服務提供者與服務消費者

在這兩個項目的pom.xml文件執行以下操作:點擊右鍵,Run as - Maven build… 在彈出的選項框中Golas 填寫:clean package,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

點擊run,打包成功後如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將兩個項目的target文件夾中拿出打好的jar包放到某個文件夾下備用,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

使用java -jar 命令依次運行dubbo-provider 與dubbo-consumer,順序不能搞錯,並且得確保provider啟動完成後再啟動consumer,否則後期會出現空指針異常。

至此,我們總共啟動了四個服務,分別是zookeeper註冊中心、dubbo-admin、dubbo-provider、dubbo-consumer,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打開dubbo監控網頁檢查服務消費者和提供者是否已經註冊成功:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到,提供者與消費者已成功註冊到註冊中心

2、基本調用

使用瀏覽器訪問此地址http://127.0.0.1/people/test,觀察服務提供者的控制檯輸出內容

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

後臺控制檯已輸出日誌了,證明調用成功,那麼瀏覽器是否能夠拿到數據呢?

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到瀏覽器也拿到數據了,證明已經成功完成調用了。

3、容錯與屏蔽

容錯

顧名思義就是當服務提供者出現異常時,消費者是否能夠正常處理,在這裡,我們關閉掉服務提供者,再進行調用,觀察是否會報錯

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以觀察到前端報異常了。我們進入dubbo-admin在消費者中把服務容錯開啟,如下

"

一、Dubbo介紹

引用官方的一段介紹

Apache Dubbo (incubating) |ˈdʌbəʊ| is a high-performance, java based RPC framework open-sourced by Alibaba. As in many RPC systems, dubbo is based around the idea of defining a service, specifying the methods that can be called remotely with their parameters and return types. On the server side, the server implements this interface and runs a dubbo server to handle client calls. On the client side, the client has a stub that provides the same methods as the server.

Dubbo是阿里出的一個高性能的分佈式微服務框架,它的特點是性能高、界面友好、文檔齊全(特別是中文文檔),是很多中小型公司快速搭建微服務的首選技術。前段時間被阿里重新進行維護,並進入Apache孵化器。遷移到Apache後也推出了新的starter,簡單試用後感覺不錯,為此特地寫下這一系列筆記,用以記錄。(整個項目的源碼在最後一章,感興趣的童鞋可以下載自己搭建試試,也可以將其作為腳手架搭建你自己的微服務)

二、搭建註冊中心

在dubbo中,每一個服務都是分佈式的,消費者與提供者的關係並不是一對一的關係,而是一對多,並且服務提供者的實例位置是未知的,如果都由開發者使用靜態文件去維護這個關係顯示不合適的,一方面是徒增工作量,另一方面是靈活度不高,如果服務提供者更換了服務器地址,那麼需要重新配置等,所以目前比較推崇的方案是所有服務提供者均主動將自己的信息註冊到同個地方中,而消費者只要一律從這個地方取他需要的東西即可,這個地方就是所謂的註冊中心。目前dubbo可以選擇的註冊中心包括zookeeper、redis等,一般建議使用zookeeper,下面演示一下在windows中如何搭建zookeeper註冊中心。

1、下載zookeeper

直接在官網的鏡像站下 (https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/zookeeper-3.4.12.tar.gz)

2、解壓並配置zookeeper

為了演示,直接使用官方示例配置。把解壓出來的\\zookeeper-3.4.12\\conf\\zoo_sample.cfg 文件名改為zoo.cfg即可,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、運行zookeeper註冊中心

雙擊運行/zookeeper-3.4.12/bin/zkServer.cmd,出現以下窗口代表運行成功。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

三、搭建Dubbo Admin

在Dubbo中,一大殺器就是它的可視化監控界面,在這個界面中可以查看服務者、提供者的數量、狀態等,並對服務降級、容錯、屏蔽等提供了可視化操作。下面演示如何搭建Dubbo Admin。

1、下載源碼並解壓

點擊下面地址下載dubbo admin項目源碼 (https://codeload.github.com/apache/incubator-dubbo-ops/zip/master)

下載後解壓出來,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

2、打包

打開cmd,進入第一步解壓出來的dubbo-admin文件夾中,執行mvn clean package

(ps:要是提示未存在mvn命令,就把maven文件夾的bin目錄添加到系統環境變量PATH中)

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、配置dubbo admin

打開上面那步打出來的war包(\\incubator-dubbo-ops-master\\dubbo-admin\\target\\dubbo-admin-2.0.0.war),編輯WEB-INF文件夾中的dubbo.properties文件,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將紅框處的IP地址改為你的註冊中心的地址,由於我們的註冊中心是在本地運行的,故此處無需做修改。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

4、運行Dubbo Admin

將war包改名為ROOT.war後放到tomcat的webapp目錄中,然後運行tomcat。使用瀏覽器打開http://127.0.0.1:8080,提示輸入賬號密碼,賬號和密碼默認均為root,登陸後的界面如下:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

四、搭建API項目

由於Dubbo是採用RPC調用方式,這也是與Spring Cloud比較大的區別之一。在Spring Cloud中,服務通過HTTP接口提供給其它服務調用,對於調用者與被調用者來說,只要雙方保證滿足http接口的契約即可,但是在dubbo中,是嚴格要求調用接口的類路徑、參數等雙方一致。所以需要構建一個API項目,該項目裡面存放服務接口即公共實體,雙方依賴這個項目完成遠程調用。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
</project>

公共實體-People.java

package com.czh.dubbo.common.entity;
import java.io.Serializable;
public class People implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1415852192397895853L;
// 人員編號
private int id;
// 姓名
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "People [id=" + id + ", name=" + name + "]";
}
}

公共服務接口-PeopleService.java

package com.czh.dubbo.common.service;
import com.czh.dubbo.common.entity.People;
public interface PeopleService {
People getPeople(People people);
}

五、搭建服務提供者

服務提供者就是被消費者所調用的,它需要實現公共服務接口,並通過dubbo把自己的服務暴露出來。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

com.alibaba.boot是遷移過後出的一個最新的dubbo spring boot starter,也是目前官方推薦使用的。值得注意的是,該starter不包含註冊中心客戶端,需要自己配置。一般推薦使用zookeeper作為註冊中心,所以需要手動引入zkclient。

application.properties

#web服務端口,由於我們不需要使用web服務,所以將其設為隨機端口
server.port=-1
#dubbo服務端口,我們無需知道dubbo服務運行在哪個端口,故也將其設為隨機端口
dubbo.protocol.port = -1
#dubbo服務名稱
dubbo.application.name = dubbo-provider
#dubbo服務所在包路徑
dubbo.scan.basePackages = com.czh.dubbo.provider.service
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#設置服務的日誌輸出級別為debug級
logging.level.com.czh.dubbo.provider.service=debug

服務實現類PeopleServiceImpl

package com.czh.dubbo.provider.service;
import java.util.Random;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.dubbo.config.annotation.Service;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
//注意,這裡的service註解用的不是spring的註解,而是com.alibaba.dubbo.config.annotation.Service;
@Service
public class PeopleServiceImpl implements PeopleService{
private static final Logger logger = LoggerFactory.getLogger(PeopleServiceImpl.class);
/**
* 這個方法的作用是接收傳過來的People實體,將其ID賦為隨機數
*/
@Override
public People getPeople(People people) {
people.setId(new Random().nextInt(10000));
logger.debug("People:{},ID:{}",people.getName(),people.getId());
return people;
}
}

六、搭建服務消費者

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

application.properties

#web服務端口
server.port=80
#消費者名稱
dubbo.application.name=dubbo-consumer
#需要使用到提供者服務的包路徑
dubbo.scan.base-packages=com.czh.dubbo.consumer.controller
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181

控制器PeopleController

package com.czh.dubbo.consumer.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
@RestController
public class PeopleController {
@Reference
private PeopleService peopleService;
@GetMapping("/people/{name}")
public People getPeople(@PathVariable("name") String name) {
People people = new People();
people.setName(name);
return peopleService.getPeople(people);
}
}

至此,整個項目便搭建完畢,三個項目的項目結構如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

七、上線運行

1、打包運行

安裝API項目到本地maven倉庫

在dubbo-common項目的pom.xml文件上點擊右鍵,Run as - Maven install

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打包服務提供者與服務消費者

在這兩個項目的pom.xml文件執行以下操作:點擊右鍵,Run as - Maven build… 在彈出的選項框中Golas 填寫:clean package,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

點擊run,打包成功後如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將兩個項目的target文件夾中拿出打好的jar包放到某個文件夾下備用,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

使用java -jar 命令依次運行dubbo-provider 與dubbo-consumer,順序不能搞錯,並且得確保provider啟動完成後再啟動consumer,否則後期會出現空指針異常。

至此,我們總共啟動了四個服務,分別是zookeeper註冊中心、dubbo-admin、dubbo-provider、dubbo-consumer,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打開dubbo監控網頁檢查服務消費者和提供者是否已經註冊成功:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到,提供者與消費者已成功註冊到註冊中心

2、基本調用

使用瀏覽器訪問此地址http://127.0.0.1/people/test,觀察服務提供者的控制檯輸出內容

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

後臺控制檯已輸出日誌了,證明調用成功,那麼瀏覽器是否能夠拿到數據呢?

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到瀏覽器也拿到數據了,證明已經成功完成調用了。

3、容錯與屏蔽

容錯

顧名思義就是當服務提供者出現異常時,消費者是否能夠正常處理,在這裡,我們關閉掉服務提供者,再進行調用,觀察是否會報錯

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以觀察到前端報異常了。我們進入dubbo-admin在消費者中把服務容錯開啟,如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

再進行調用可以看到

"

一、Dubbo介紹

引用官方的一段介紹

Apache Dubbo (incubating) |ˈdʌbəʊ| is a high-performance, java based RPC framework open-sourced by Alibaba. As in many RPC systems, dubbo is based around the idea of defining a service, specifying the methods that can be called remotely with their parameters and return types. On the server side, the server implements this interface and runs a dubbo server to handle client calls. On the client side, the client has a stub that provides the same methods as the server.

Dubbo是阿里出的一個高性能的分佈式微服務框架,它的特點是性能高、界面友好、文檔齊全(特別是中文文檔),是很多中小型公司快速搭建微服務的首選技術。前段時間被阿里重新進行維護,並進入Apache孵化器。遷移到Apache後也推出了新的starter,簡單試用後感覺不錯,為此特地寫下這一系列筆記,用以記錄。(整個項目的源碼在最後一章,感興趣的童鞋可以下載自己搭建試試,也可以將其作為腳手架搭建你自己的微服務)

二、搭建註冊中心

在dubbo中,每一個服務都是分佈式的,消費者與提供者的關係並不是一對一的關係,而是一對多,並且服務提供者的實例位置是未知的,如果都由開發者使用靜態文件去維護這個關係顯示不合適的,一方面是徒增工作量,另一方面是靈活度不高,如果服務提供者更換了服務器地址,那麼需要重新配置等,所以目前比較推崇的方案是所有服務提供者均主動將自己的信息註冊到同個地方中,而消費者只要一律從這個地方取他需要的東西即可,這個地方就是所謂的註冊中心。目前dubbo可以選擇的註冊中心包括zookeeper、redis等,一般建議使用zookeeper,下面演示一下在windows中如何搭建zookeeper註冊中心。

1、下載zookeeper

直接在官網的鏡像站下 (https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/zookeeper-3.4.12.tar.gz)

2、解壓並配置zookeeper

為了演示,直接使用官方示例配置。把解壓出來的\\zookeeper-3.4.12\\conf\\zoo_sample.cfg 文件名改為zoo.cfg即可,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、運行zookeeper註冊中心

雙擊運行/zookeeper-3.4.12/bin/zkServer.cmd,出現以下窗口代表運行成功。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

三、搭建Dubbo Admin

在Dubbo中,一大殺器就是它的可視化監控界面,在這個界面中可以查看服務者、提供者的數量、狀態等,並對服務降級、容錯、屏蔽等提供了可視化操作。下面演示如何搭建Dubbo Admin。

1、下載源碼並解壓

點擊下面地址下載dubbo admin項目源碼 (https://codeload.github.com/apache/incubator-dubbo-ops/zip/master)

下載後解壓出來,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

2、打包

打開cmd,進入第一步解壓出來的dubbo-admin文件夾中,執行mvn clean package

(ps:要是提示未存在mvn命令,就把maven文件夾的bin目錄添加到系統環境變量PATH中)

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、配置dubbo admin

打開上面那步打出來的war包(\\incubator-dubbo-ops-master\\dubbo-admin\\target\\dubbo-admin-2.0.0.war),編輯WEB-INF文件夾中的dubbo.properties文件,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將紅框處的IP地址改為你的註冊中心的地址,由於我們的註冊中心是在本地運行的,故此處無需做修改。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

4、運行Dubbo Admin

將war包改名為ROOT.war後放到tomcat的webapp目錄中,然後運行tomcat。使用瀏覽器打開http://127.0.0.1:8080,提示輸入賬號密碼,賬號和密碼默認均為root,登陸後的界面如下:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

四、搭建API項目

由於Dubbo是採用RPC調用方式,這也是與Spring Cloud比較大的區別之一。在Spring Cloud中,服務通過HTTP接口提供給其它服務調用,對於調用者與被調用者來說,只要雙方保證滿足http接口的契約即可,但是在dubbo中,是嚴格要求調用接口的類路徑、參數等雙方一致。所以需要構建一個API項目,該項目裡面存放服務接口即公共實體,雙方依賴這個項目完成遠程調用。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
</project>

公共實體-People.java

package com.czh.dubbo.common.entity;
import java.io.Serializable;
public class People implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1415852192397895853L;
// 人員編號
private int id;
// 姓名
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "People [id=" + id + ", name=" + name + "]";
}
}

公共服務接口-PeopleService.java

package com.czh.dubbo.common.service;
import com.czh.dubbo.common.entity.People;
public interface PeopleService {
People getPeople(People people);
}

五、搭建服務提供者

服務提供者就是被消費者所調用的,它需要實現公共服務接口,並通過dubbo把自己的服務暴露出來。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

com.alibaba.boot是遷移過後出的一個最新的dubbo spring boot starter,也是目前官方推薦使用的。值得注意的是,該starter不包含註冊中心客戶端,需要自己配置。一般推薦使用zookeeper作為註冊中心,所以需要手動引入zkclient。

application.properties

#web服務端口,由於我們不需要使用web服務,所以將其設為隨機端口
server.port=-1
#dubbo服務端口,我們無需知道dubbo服務運行在哪個端口,故也將其設為隨機端口
dubbo.protocol.port = -1
#dubbo服務名稱
dubbo.application.name = dubbo-provider
#dubbo服務所在包路徑
dubbo.scan.basePackages = com.czh.dubbo.provider.service
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#設置服務的日誌輸出級別為debug級
logging.level.com.czh.dubbo.provider.service=debug

服務實現類PeopleServiceImpl

package com.czh.dubbo.provider.service;
import java.util.Random;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.dubbo.config.annotation.Service;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
//注意,這裡的service註解用的不是spring的註解,而是com.alibaba.dubbo.config.annotation.Service;
@Service
public class PeopleServiceImpl implements PeopleService{
private static final Logger logger = LoggerFactory.getLogger(PeopleServiceImpl.class);
/**
* 這個方法的作用是接收傳過來的People實體,將其ID賦為隨機數
*/
@Override
public People getPeople(People people) {
people.setId(new Random().nextInt(10000));
logger.debug("People:{},ID:{}",people.getName(),people.getId());
return people;
}
}

六、搭建服務消費者

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

application.properties

#web服務端口
server.port=80
#消費者名稱
dubbo.application.name=dubbo-consumer
#需要使用到提供者服務的包路徑
dubbo.scan.base-packages=com.czh.dubbo.consumer.controller
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181

控制器PeopleController

package com.czh.dubbo.consumer.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
@RestController
public class PeopleController {
@Reference
private PeopleService peopleService;
@GetMapping("/people/{name}")
public People getPeople(@PathVariable("name") String name) {
People people = new People();
people.setName(name);
return peopleService.getPeople(people);
}
}

至此,整個項目便搭建完畢,三個項目的項目結構如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

七、上線運行

1、打包運行

安裝API項目到本地maven倉庫

在dubbo-common項目的pom.xml文件上點擊右鍵,Run as - Maven install

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打包服務提供者與服務消費者

在這兩個項目的pom.xml文件執行以下操作:點擊右鍵,Run as - Maven build… 在彈出的選項框中Golas 填寫:clean package,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

點擊run,打包成功後如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將兩個項目的target文件夾中拿出打好的jar包放到某個文件夾下備用,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

使用java -jar 命令依次運行dubbo-provider 與dubbo-consumer,順序不能搞錯,並且得確保provider啟動完成後再啟動consumer,否則後期會出現空指針異常。

至此,我們總共啟動了四個服務,分別是zookeeper註冊中心、dubbo-admin、dubbo-provider、dubbo-consumer,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打開dubbo監控網頁檢查服務消費者和提供者是否已經註冊成功:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到,提供者與消費者已成功註冊到註冊中心

2、基本調用

使用瀏覽器訪問此地址http://127.0.0.1/people/test,觀察服務提供者的控制檯輸出內容

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

後臺控制檯已輸出日誌了,證明調用成功,那麼瀏覽器是否能夠拿到數據呢?

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到瀏覽器也拿到數據了,證明已經成功完成調用了。

3、容錯與屏蔽

容錯

顧名思義就是當服務提供者出現異常時,消費者是否能夠正常處理,在這裡,我們關閉掉服務提供者,再進行調用,觀察是否會報錯

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以觀察到前端報異常了。我們進入dubbo-admin在消費者中把服務容錯開啟,如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

再進行調用可以看到

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到此時調用後返回確實為空,證明容錯生效。

屏蔽

當對某個服務啟動屏蔽時,此時消費者調用該服務時均會返回空對象。首先我們需要確保提供者與消費者均已啟動,然後在消費者中對提供者進行屏蔽,如下圖

"

一、Dubbo介紹

引用官方的一段介紹

Apache Dubbo (incubating) |ˈdʌbəʊ| is a high-performance, java based RPC framework open-sourced by Alibaba. As in many RPC systems, dubbo is based around the idea of defining a service, specifying the methods that can be called remotely with their parameters and return types. On the server side, the server implements this interface and runs a dubbo server to handle client calls. On the client side, the client has a stub that provides the same methods as the server.

Dubbo是阿里出的一個高性能的分佈式微服務框架,它的特點是性能高、界面友好、文檔齊全(特別是中文文檔),是很多中小型公司快速搭建微服務的首選技術。前段時間被阿里重新進行維護,並進入Apache孵化器。遷移到Apache後也推出了新的starter,簡單試用後感覺不錯,為此特地寫下這一系列筆記,用以記錄。(整個項目的源碼在最後一章,感興趣的童鞋可以下載自己搭建試試,也可以將其作為腳手架搭建你自己的微服務)

二、搭建註冊中心

在dubbo中,每一個服務都是分佈式的,消費者與提供者的關係並不是一對一的關係,而是一對多,並且服務提供者的實例位置是未知的,如果都由開發者使用靜態文件去維護這個關係顯示不合適的,一方面是徒增工作量,另一方面是靈活度不高,如果服務提供者更換了服務器地址,那麼需要重新配置等,所以目前比較推崇的方案是所有服務提供者均主動將自己的信息註冊到同個地方中,而消費者只要一律從這個地方取他需要的東西即可,這個地方就是所謂的註冊中心。目前dubbo可以選擇的註冊中心包括zookeeper、redis等,一般建議使用zookeeper,下面演示一下在windows中如何搭建zookeeper註冊中心。

1、下載zookeeper

直接在官網的鏡像站下 (https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/zookeeper-3.4.12.tar.gz)

2、解壓並配置zookeeper

為了演示,直接使用官方示例配置。把解壓出來的\\zookeeper-3.4.12\\conf\\zoo_sample.cfg 文件名改為zoo.cfg即可,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、運行zookeeper註冊中心

雙擊運行/zookeeper-3.4.12/bin/zkServer.cmd,出現以下窗口代表運行成功。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

三、搭建Dubbo Admin

在Dubbo中,一大殺器就是它的可視化監控界面,在這個界面中可以查看服務者、提供者的數量、狀態等,並對服務降級、容錯、屏蔽等提供了可視化操作。下面演示如何搭建Dubbo Admin。

1、下載源碼並解壓

點擊下面地址下載dubbo admin項目源碼 (https://codeload.github.com/apache/incubator-dubbo-ops/zip/master)

下載後解壓出來,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

2、打包

打開cmd,進入第一步解壓出來的dubbo-admin文件夾中,執行mvn clean package

(ps:要是提示未存在mvn命令,就把maven文件夾的bin目錄添加到系統環境變量PATH中)

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、配置dubbo admin

打開上面那步打出來的war包(\\incubator-dubbo-ops-master\\dubbo-admin\\target\\dubbo-admin-2.0.0.war),編輯WEB-INF文件夾中的dubbo.properties文件,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將紅框處的IP地址改為你的註冊中心的地址,由於我們的註冊中心是在本地運行的,故此處無需做修改。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

4、運行Dubbo Admin

將war包改名為ROOT.war後放到tomcat的webapp目錄中,然後運行tomcat。使用瀏覽器打開http://127.0.0.1:8080,提示輸入賬號密碼,賬號和密碼默認均為root,登陸後的界面如下:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

四、搭建API項目

由於Dubbo是採用RPC調用方式,這也是與Spring Cloud比較大的區別之一。在Spring Cloud中,服務通過HTTP接口提供給其它服務調用,對於調用者與被調用者來說,只要雙方保證滿足http接口的契約即可,但是在dubbo中,是嚴格要求調用接口的類路徑、參數等雙方一致。所以需要構建一個API項目,該項目裡面存放服務接口即公共實體,雙方依賴這個項目完成遠程調用。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
</project>

公共實體-People.java

package com.czh.dubbo.common.entity;
import java.io.Serializable;
public class People implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1415852192397895853L;
// 人員編號
private int id;
// 姓名
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "People [id=" + id + ", name=" + name + "]";
}
}

公共服務接口-PeopleService.java

package com.czh.dubbo.common.service;
import com.czh.dubbo.common.entity.People;
public interface PeopleService {
People getPeople(People people);
}

五、搭建服務提供者

服務提供者就是被消費者所調用的,它需要實現公共服務接口,並通過dubbo把自己的服務暴露出來。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

com.alibaba.boot是遷移過後出的一個最新的dubbo spring boot starter,也是目前官方推薦使用的。值得注意的是,該starter不包含註冊中心客戶端,需要自己配置。一般推薦使用zookeeper作為註冊中心,所以需要手動引入zkclient。

application.properties

#web服務端口,由於我們不需要使用web服務,所以將其設為隨機端口
server.port=-1
#dubbo服務端口,我們無需知道dubbo服務運行在哪個端口,故也將其設為隨機端口
dubbo.protocol.port = -1
#dubbo服務名稱
dubbo.application.name = dubbo-provider
#dubbo服務所在包路徑
dubbo.scan.basePackages = com.czh.dubbo.provider.service
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#設置服務的日誌輸出級別為debug級
logging.level.com.czh.dubbo.provider.service=debug

服務實現類PeopleServiceImpl

package com.czh.dubbo.provider.service;
import java.util.Random;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.dubbo.config.annotation.Service;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
//注意,這裡的service註解用的不是spring的註解,而是com.alibaba.dubbo.config.annotation.Service;
@Service
public class PeopleServiceImpl implements PeopleService{
private static final Logger logger = LoggerFactory.getLogger(PeopleServiceImpl.class);
/**
* 這個方法的作用是接收傳過來的People實體,將其ID賦為隨機數
*/
@Override
public People getPeople(People people) {
people.setId(new Random().nextInt(10000));
logger.debug("People:{},ID:{}",people.getName(),people.getId());
return people;
}
}

六、搭建服務消費者

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

application.properties

#web服務端口
server.port=80
#消費者名稱
dubbo.application.name=dubbo-consumer
#需要使用到提供者服務的包路徑
dubbo.scan.base-packages=com.czh.dubbo.consumer.controller
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181

控制器PeopleController

package com.czh.dubbo.consumer.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
@RestController
public class PeopleController {
@Reference
private PeopleService peopleService;
@GetMapping("/people/{name}")
public People getPeople(@PathVariable("name") String name) {
People people = new People();
people.setName(name);
return peopleService.getPeople(people);
}
}

至此,整個項目便搭建完畢,三個項目的項目結構如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

七、上線運行

1、打包運行

安裝API項目到本地maven倉庫

在dubbo-common項目的pom.xml文件上點擊右鍵,Run as - Maven install

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打包服務提供者與服務消費者

在這兩個項目的pom.xml文件執行以下操作:點擊右鍵,Run as - Maven build… 在彈出的選項框中Golas 填寫:clean package,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

點擊run,打包成功後如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將兩個項目的target文件夾中拿出打好的jar包放到某個文件夾下備用,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

使用java -jar 命令依次運行dubbo-provider 與dubbo-consumer,順序不能搞錯,並且得確保provider啟動完成後再啟動consumer,否則後期會出現空指針異常。

至此,我們總共啟動了四個服務,分別是zookeeper註冊中心、dubbo-admin、dubbo-provider、dubbo-consumer,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打開dubbo監控網頁檢查服務消費者和提供者是否已經註冊成功:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到,提供者與消費者已成功註冊到註冊中心

2、基本調用

使用瀏覽器訪問此地址http://127.0.0.1/people/test,觀察服務提供者的控制檯輸出內容

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

後臺控制檯已輸出日誌了,證明調用成功,那麼瀏覽器是否能夠拿到數據呢?

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到瀏覽器也拿到數據了,證明已經成功完成調用了。

3、容錯與屏蔽

容錯

顧名思義就是當服務提供者出現異常時,消費者是否能夠正常處理,在這裡,我們關閉掉服務提供者,再進行調用,觀察是否會報錯

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以觀察到前端報異常了。我們進入dubbo-admin在消費者中把服務容錯開啟,如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

再進行調用可以看到

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到此時調用後返回確實為空,證明容錯生效。

屏蔽

當對某個服務啟動屏蔽時,此時消費者調用該服務時均會返回空對象。首先我們需要確保提供者與消費者均已啟動,然後在消費者中對提供者進行屏蔽,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

再進行服務調用

"

一、Dubbo介紹

引用官方的一段介紹

Apache Dubbo (incubating) |ˈdʌbəʊ| is a high-performance, java based RPC framework open-sourced by Alibaba. As in many RPC systems, dubbo is based around the idea of defining a service, specifying the methods that can be called remotely with their parameters and return types. On the server side, the server implements this interface and runs a dubbo server to handle client calls. On the client side, the client has a stub that provides the same methods as the server.

Dubbo是阿里出的一個高性能的分佈式微服務框架,它的特點是性能高、界面友好、文檔齊全(特別是中文文檔),是很多中小型公司快速搭建微服務的首選技術。前段時間被阿里重新進行維護,並進入Apache孵化器。遷移到Apache後也推出了新的starter,簡單試用後感覺不錯,為此特地寫下這一系列筆記,用以記錄。(整個項目的源碼在最後一章,感興趣的童鞋可以下載自己搭建試試,也可以將其作為腳手架搭建你自己的微服務)

二、搭建註冊中心

在dubbo中,每一個服務都是分佈式的,消費者與提供者的關係並不是一對一的關係,而是一對多,並且服務提供者的實例位置是未知的,如果都由開發者使用靜態文件去維護這個關係顯示不合適的,一方面是徒增工作量,另一方面是靈活度不高,如果服務提供者更換了服務器地址,那麼需要重新配置等,所以目前比較推崇的方案是所有服務提供者均主動將自己的信息註冊到同個地方中,而消費者只要一律從這個地方取他需要的東西即可,這個地方就是所謂的註冊中心。目前dubbo可以選擇的註冊中心包括zookeeper、redis等,一般建議使用zookeeper,下面演示一下在windows中如何搭建zookeeper註冊中心。

1、下載zookeeper

直接在官網的鏡像站下 (https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/zookeeper-3.4.12.tar.gz)

2、解壓並配置zookeeper

為了演示,直接使用官方示例配置。把解壓出來的\\zookeeper-3.4.12\\conf\\zoo_sample.cfg 文件名改為zoo.cfg即可,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、運行zookeeper註冊中心

雙擊運行/zookeeper-3.4.12/bin/zkServer.cmd,出現以下窗口代表運行成功。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

三、搭建Dubbo Admin

在Dubbo中,一大殺器就是它的可視化監控界面,在這個界面中可以查看服務者、提供者的數量、狀態等,並對服務降級、容錯、屏蔽等提供了可視化操作。下面演示如何搭建Dubbo Admin。

1、下載源碼並解壓

點擊下面地址下載dubbo admin項目源碼 (https://codeload.github.com/apache/incubator-dubbo-ops/zip/master)

下載後解壓出來,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

2、打包

打開cmd,進入第一步解壓出來的dubbo-admin文件夾中,執行mvn clean package

(ps:要是提示未存在mvn命令,就把maven文件夾的bin目錄添加到系統環境變量PATH中)

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、配置dubbo admin

打開上面那步打出來的war包(\\incubator-dubbo-ops-master\\dubbo-admin\\target\\dubbo-admin-2.0.0.war),編輯WEB-INF文件夾中的dubbo.properties文件,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將紅框處的IP地址改為你的註冊中心的地址,由於我們的註冊中心是在本地運行的,故此處無需做修改。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

4、運行Dubbo Admin

將war包改名為ROOT.war後放到tomcat的webapp目錄中,然後運行tomcat。使用瀏覽器打開http://127.0.0.1:8080,提示輸入賬號密碼,賬號和密碼默認均為root,登陸後的界面如下:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

四、搭建API項目

由於Dubbo是採用RPC調用方式,這也是與Spring Cloud比較大的區別之一。在Spring Cloud中,服務通過HTTP接口提供給其它服務調用,對於調用者與被調用者來說,只要雙方保證滿足http接口的契約即可,但是在dubbo中,是嚴格要求調用接口的類路徑、參數等雙方一致。所以需要構建一個API項目,該項目裡面存放服務接口即公共實體,雙方依賴這個項目完成遠程調用。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
</project>

公共實體-People.java

package com.czh.dubbo.common.entity;
import java.io.Serializable;
public class People implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1415852192397895853L;
// 人員編號
private int id;
// 姓名
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "People [id=" + id + ", name=" + name + "]";
}
}

公共服務接口-PeopleService.java

package com.czh.dubbo.common.service;
import com.czh.dubbo.common.entity.People;
public interface PeopleService {
People getPeople(People people);
}

五、搭建服務提供者

服務提供者就是被消費者所調用的,它需要實現公共服務接口,並通過dubbo把自己的服務暴露出來。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

com.alibaba.boot是遷移過後出的一個最新的dubbo spring boot starter,也是目前官方推薦使用的。值得注意的是,該starter不包含註冊中心客戶端,需要自己配置。一般推薦使用zookeeper作為註冊中心,所以需要手動引入zkclient。

application.properties

#web服務端口,由於我們不需要使用web服務,所以將其設為隨機端口
server.port=-1
#dubbo服務端口,我們無需知道dubbo服務運行在哪個端口,故也將其設為隨機端口
dubbo.protocol.port = -1
#dubbo服務名稱
dubbo.application.name = dubbo-provider
#dubbo服務所在包路徑
dubbo.scan.basePackages = com.czh.dubbo.provider.service
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#設置服務的日誌輸出級別為debug級
logging.level.com.czh.dubbo.provider.service=debug

服務實現類PeopleServiceImpl

package com.czh.dubbo.provider.service;
import java.util.Random;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.dubbo.config.annotation.Service;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
//注意,這裡的service註解用的不是spring的註解,而是com.alibaba.dubbo.config.annotation.Service;
@Service
public class PeopleServiceImpl implements PeopleService{
private static final Logger logger = LoggerFactory.getLogger(PeopleServiceImpl.class);
/**
* 這個方法的作用是接收傳過來的People實體,將其ID賦為隨機數
*/
@Override
public People getPeople(People people) {
people.setId(new Random().nextInt(10000));
logger.debug("People:{},ID:{}",people.getName(),people.getId());
return people;
}
}

六、搭建服務消費者

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

application.properties

#web服務端口
server.port=80
#消費者名稱
dubbo.application.name=dubbo-consumer
#需要使用到提供者服務的包路徑
dubbo.scan.base-packages=com.czh.dubbo.consumer.controller
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181

控制器PeopleController

package com.czh.dubbo.consumer.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
@RestController
public class PeopleController {
@Reference
private PeopleService peopleService;
@GetMapping("/people/{name}")
public People getPeople(@PathVariable("name") String name) {
People people = new People();
people.setName(name);
return peopleService.getPeople(people);
}
}

至此,整個項目便搭建完畢,三個項目的項目結構如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

七、上線運行

1、打包運行

安裝API項目到本地maven倉庫

在dubbo-common項目的pom.xml文件上點擊右鍵,Run as - Maven install

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打包服務提供者與服務消費者

在這兩個項目的pom.xml文件執行以下操作:點擊右鍵,Run as - Maven build… 在彈出的選項框中Golas 填寫:clean package,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

點擊run,打包成功後如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將兩個項目的target文件夾中拿出打好的jar包放到某個文件夾下備用,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

使用java -jar 命令依次運行dubbo-provider 與dubbo-consumer,順序不能搞錯,並且得確保provider啟動完成後再啟動consumer,否則後期會出現空指針異常。

至此,我們總共啟動了四個服務,分別是zookeeper註冊中心、dubbo-admin、dubbo-provider、dubbo-consumer,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打開dubbo監控網頁檢查服務消費者和提供者是否已經註冊成功:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到,提供者與消費者已成功註冊到註冊中心

2、基本調用

使用瀏覽器訪問此地址http://127.0.0.1/people/test,觀察服務提供者的控制檯輸出內容

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

後臺控制檯已輸出日誌了,證明調用成功,那麼瀏覽器是否能夠拿到數據呢?

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到瀏覽器也拿到數據了,證明已經成功完成調用了。

3、容錯與屏蔽

容錯

顧名思義就是當服務提供者出現異常時,消費者是否能夠正常處理,在這裡,我們關閉掉服務提供者,再進行調用,觀察是否會報錯

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以觀察到前端報異常了。我們進入dubbo-admin在消費者中把服務容錯開啟,如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

再進行調用可以看到

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到此時調用後返回確實為空,證明容錯生效。

屏蔽

當對某個服務啟動屏蔽時,此時消費者調用該服務時均會返回空對象。首先我們需要確保提供者與消費者均已啟動,然後在消費者中對提供者進行屏蔽,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

再進行服務調用

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到此時調用後返回確實為空,證明屏蔽生效。

其實屏蔽與容錯還有更高級的玩法,最基本的屏蔽是返回空對象,我們甚至可以自定義返回內容。

進入動態配置,選擇新增

"

一、Dubbo介紹

引用官方的一段介紹

Apache Dubbo (incubating) |ˈdʌbəʊ| is a high-performance, java based RPC framework open-sourced by Alibaba. As in many RPC systems, dubbo is based around the idea of defining a service, specifying the methods that can be called remotely with their parameters and return types. On the server side, the server implements this interface and runs a dubbo server to handle client calls. On the client side, the client has a stub that provides the same methods as the server.

Dubbo是阿里出的一個高性能的分佈式微服務框架,它的特點是性能高、界面友好、文檔齊全(特別是中文文檔),是很多中小型公司快速搭建微服務的首選技術。前段時間被阿里重新進行維護,並進入Apache孵化器。遷移到Apache後也推出了新的starter,簡單試用後感覺不錯,為此特地寫下這一系列筆記,用以記錄。(整個項目的源碼在最後一章,感興趣的童鞋可以下載自己搭建試試,也可以將其作為腳手架搭建你自己的微服務)

二、搭建註冊中心

在dubbo中,每一個服務都是分佈式的,消費者與提供者的關係並不是一對一的關係,而是一對多,並且服務提供者的實例位置是未知的,如果都由開發者使用靜態文件去維護這個關係顯示不合適的,一方面是徒增工作量,另一方面是靈活度不高,如果服務提供者更換了服務器地址,那麼需要重新配置等,所以目前比較推崇的方案是所有服務提供者均主動將自己的信息註冊到同個地方中,而消費者只要一律從這個地方取他需要的東西即可,這個地方就是所謂的註冊中心。目前dubbo可以選擇的註冊中心包括zookeeper、redis等,一般建議使用zookeeper,下面演示一下在windows中如何搭建zookeeper註冊中心。

1、下載zookeeper

直接在官網的鏡像站下 (https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/zookeeper-3.4.12.tar.gz)

2、解壓並配置zookeeper

為了演示,直接使用官方示例配置。把解壓出來的\\zookeeper-3.4.12\\conf\\zoo_sample.cfg 文件名改為zoo.cfg即可,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、運行zookeeper註冊中心

雙擊運行/zookeeper-3.4.12/bin/zkServer.cmd,出現以下窗口代表運行成功。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

三、搭建Dubbo Admin

在Dubbo中,一大殺器就是它的可視化監控界面,在這個界面中可以查看服務者、提供者的數量、狀態等,並對服務降級、容錯、屏蔽等提供了可視化操作。下面演示如何搭建Dubbo Admin。

1、下載源碼並解壓

點擊下面地址下載dubbo admin項目源碼 (https://codeload.github.com/apache/incubator-dubbo-ops/zip/master)

下載後解壓出來,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

2、打包

打開cmd,進入第一步解壓出來的dubbo-admin文件夾中,執行mvn clean package

(ps:要是提示未存在mvn命令,就把maven文件夾的bin目錄添加到系統環境變量PATH中)

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、配置dubbo admin

打開上面那步打出來的war包(\\incubator-dubbo-ops-master\\dubbo-admin\\target\\dubbo-admin-2.0.0.war),編輯WEB-INF文件夾中的dubbo.properties文件,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將紅框處的IP地址改為你的註冊中心的地址,由於我們的註冊中心是在本地運行的,故此處無需做修改。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

4、運行Dubbo Admin

將war包改名為ROOT.war後放到tomcat的webapp目錄中,然後運行tomcat。使用瀏覽器打開http://127.0.0.1:8080,提示輸入賬號密碼,賬號和密碼默認均為root,登陸後的界面如下:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

四、搭建API項目

由於Dubbo是採用RPC調用方式,這也是與Spring Cloud比較大的區別之一。在Spring Cloud中,服務通過HTTP接口提供給其它服務調用,對於調用者與被調用者來說,只要雙方保證滿足http接口的契約即可,但是在dubbo中,是嚴格要求調用接口的類路徑、參數等雙方一致。所以需要構建一個API項目,該項目裡面存放服務接口即公共實體,雙方依賴這個項目完成遠程調用。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
</project>

公共實體-People.java

package com.czh.dubbo.common.entity;
import java.io.Serializable;
public class People implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1415852192397895853L;
// 人員編號
private int id;
// 姓名
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "People [id=" + id + ", name=" + name + "]";
}
}

公共服務接口-PeopleService.java

package com.czh.dubbo.common.service;
import com.czh.dubbo.common.entity.People;
public interface PeopleService {
People getPeople(People people);
}

五、搭建服務提供者

服務提供者就是被消費者所調用的,它需要實現公共服務接口,並通過dubbo把自己的服務暴露出來。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

com.alibaba.boot是遷移過後出的一個最新的dubbo spring boot starter,也是目前官方推薦使用的。值得注意的是,該starter不包含註冊中心客戶端,需要自己配置。一般推薦使用zookeeper作為註冊中心,所以需要手動引入zkclient。

application.properties

#web服務端口,由於我們不需要使用web服務,所以將其設為隨機端口
server.port=-1
#dubbo服務端口,我們無需知道dubbo服務運行在哪個端口,故也將其設為隨機端口
dubbo.protocol.port = -1
#dubbo服務名稱
dubbo.application.name = dubbo-provider
#dubbo服務所在包路徑
dubbo.scan.basePackages = com.czh.dubbo.provider.service
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#設置服務的日誌輸出級別為debug級
logging.level.com.czh.dubbo.provider.service=debug

服務實現類PeopleServiceImpl

package com.czh.dubbo.provider.service;
import java.util.Random;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.dubbo.config.annotation.Service;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
//注意,這裡的service註解用的不是spring的註解,而是com.alibaba.dubbo.config.annotation.Service;
@Service
public class PeopleServiceImpl implements PeopleService{
private static final Logger logger = LoggerFactory.getLogger(PeopleServiceImpl.class);
/**
* 這個方法的作用是接收傳過來的People實體,將其ID賦為隨機數
*/
@Override
public People getPeople(People people) {
people.setId(new Random().nextInt(10000));
logger.debug("People:{},ID:{}",people.getName(),people.getId());
return people;
}
}

六、搭建服務消費者

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

application.properties

#web服務端口
server.port=80
#消費者名稱
dubbo.application.name=dubbo-consumer
#需要使用到提供者服務的包路徑
dubbo.scan.base-packages=com.czh.dubbo.consumer.controller
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181

控制器PeopleController

package com.czh.dubbo.consumer.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
@RestController
public class PeopleController {
@Reference
private PeopleService peopleService;
@GetMapping("/people/{name}")
public People getPeople(@PathVariable("name") String name) {
People people = new People();
people.setName(name);
return peopleService.getPeople(people);
}
}

至此,整個項目便搭建完畢,三個項目的項目結構如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

七、上線運行

1、打包運行

安裝API項目到本地maven倉庫

在dubbo-common項目的pom.xml文件上點擊右鍵,Run as - Maven install

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打包服務提供者與服務消費者

在這兩個項目的pom.xml文件執行以下操作:點擊右鍵,Run as - Maven build… 在彈出的選項框中Golas 填寫:clean package,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

點擊run,打包成功後如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將兩個項目的target文件夾中拿出打好的jar包放到某個文件夾下備用,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

使用java -jar 命令依次運行dubbo-provider 與dubbo-consumer,順序不能搞錯,並且得確保provider啟動完成後再啟動consumer,否則後期會出現空指針異常。

至此,我們總共啟動了四個服務,分別是zookeeper註冊中心、dubbo-admin、dubbo-provider、dubbo-consumer,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打開dubbo監控網頁檢查服務消費者和提供者是否已經註冊成功:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到,提供者與消費者已成功註冊到註冊中心

2、基本調用

使用瀏覽器訪問此地址http://127.0.0.1/people/test,觀察服務提供者的控制檯輸出內容

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

後臺控制檯已輸出日誌了,證明調用成功,那麼瀏覽器是否能夠拿到數據呢?

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到瀏覽器也拿到數據了,證明已經成功完成調用了。

3、容錯與屏蔽

容錯

顧名思義就是當服務提供者出現異常時,消費者是否能夠正常處理,在這裡,我們關閉掉服務提供者,再進行調用,觀察是否會報錯

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以觀察到前端報異常了。我們進入dubbo-admin在消費者中把服務容錯開啟,如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

再進行調用可以看到

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到此時調用後返回確實為空,證明容錯生效。

屏蔽

當對某個服務啟動屏蔽時,此時消費者調用該服務時均會返回空對象。首先我們需要確保提供者與消費者均已啟動,然後在消費者中對提供者進行屏蔽,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

再進行服務調用

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到此時調用後返回確實為空,證明屏蔽生效。

其實屏蔽與容錯還有更高級的玩法,最基本的屏蔽是返回空對象,我們甚至可以自定義返回內容。

進入動態配置,選擇新增

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

編輯紅框處的內容如下圖:

"

一、Dubbo介紹

引用官方的一段介紹

Apache Dubbo (incubating) |ˈdʌbəʊ| is a high-performance, java based RPC framework open-sourced by Alibaba. As in many RPC systems, dubbo is based around the idea of defining a service, specifying the methods that can be called remotely with their parameters and return types. On the server side, the server implements this interface and runs a dubbo server to handle client calls. On the client side, the client has a stub that provides the same methods as the server.

Dubbo是阿里出的一個高性能的分佈式微服務框架,它的特點是性能高、界面友好、文檔齊全(特別是中文文檔),是很多中小型公司快速搭建微服務的首選技術。前段時間被阿里重新進行維護,並進入Apache孵化器。遷移到Apache後也推出了新的starter,簡單試用後感覺不錯,為此特地寫下這一系列筆記,用以記錄。(整個項目的源碼在最後一章,感興趣的童鞋可以下載自己搭建試試,也可以將其作為腳手架搭建你自己的微服務)

二、搭建註冊中心

在dubbo中,每一個服務都是分佈式的,消費者與提供者的關係並不是一對一的關係,而是一對多,並且服務提供者的實例位置是未知的,如果都由開發者使用靜態文件去維護這個關係顯示不合適的,一方面是徒增工作量,另一方面是靈活度不高,如果服務提供者更換了服務器地址,那麼需要重新配置等,所以目前比較推崇的方案是所有服務提供者均主動將自己的信息註冊到同個地方中,而消費者只要一律從這個地方取他需要的東西即可,這個地方就是所謂的註冊中心。目前dubbo可以選擇的註冊中心包括zookeeper、redis等,一般建議使用zookeeper,下面演示一下在windows中如何搭建zookeeper註冊中心。

1、下載zookeeper

直接在官網的鏡像站下 (https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/zookeeper-3.4.12.tar.gz)

2、解壓並配置zookeeper

為了演示,直接使用官方示例配置。把解壓出來的\\zookeeper-3.4.12\\conf\\zoo_sample.cfg 文件名改為zoo.cfg即可,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、運行zookeeper註冊中心

雙擊運行/zookeeper-3.4.12/bin/zkServer.cmd,出現以下窗口代表運行成功。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

三、搭建Dubbo Admin

在Dubbo中,一大殺器就是它的可視化監控界面,在這個界面中可以查看服務者、提供者的數量、狀態等,並對服務降級、容錯、屏蔽等提供了可視化操作。下面演示如何搭建Dubbo Admin。

1、下載源碼並解壓

點擊下面地址下載dubbo admin項目源碼 (https://codeload.github.com/apache/incubator-dubbo-ops/zip/master)

下載後解壓出來,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

2、打包

打開cmd,進入第一步解壓出來的dubbo-admin文件夾中,執行mvn clean package

(ps:要是提示未存在mvn命令,就把maven文件夾的bin目錄添加到系統環境變量PATH中)

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、配置dubbo admin

打開上面那步打出來的war包(\\incubator-dubbo-ops-master\\dubbo-admin\\target\\dubbo-admin-2.0.0.war),編輯WEB-INF文件夾中的dubbo.properties文件,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將紅框處的IP地址改為你的註冊中心的地址,由於我們的註冊中心是在本地運行的,故此處無需做修改。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

4、運行Dubbo Admin

將war包改名為ROOT.war後放到tomcat的webapp目錄中,然後運行tomcat。使用瀏覽器打開http://127.0.0.1:8080,提示輸入賬號密碼,賬號和密碼默認均為root,登陸後的界面如下:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

四、搭建API項目

由於Dubbo是採用RPC調用方式,這也是與Spring Cloud比較大的區別之一。在Spring Cloud中,服務通過HTTP接口提供給其它服務調用,對於調用者與被調用者來說,只要雙方保證滿足http接口的契約即可,但是在dubbo中,是嚴格要求調用接口的類路徑、參數等雙方一致。所以需要構建一個API項目,該項目裡面存放服務接口即公共實體,雙方依賴這個項目完成遠程調用。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
</project>

公共實體-People.java

package com.czh.dubbo.common.entity;
import java.io.Serializable;
public class People implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1415852192397895853L;
// 人員編號
private int id;
// 姓名
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "People [id=" + id + ", name=" + name + "]";
}
}

公共服務接口-PeopleService.java

package com.czh.dubbo.common.service;
import com.czh.dubbo.common.entity.People;
public interface PeopleService {
People getPeople(People people);
}

五、搭建服務提供者

服務提供者就是被消費者所調用的,它需要實現公共服務接口,並通過dubbo把自己的服務暴露出來。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

com.alibaba.boot是遷移過後出的一個最新的dubbo spring boot starter,也是目前官方推薦使用的。值得注意的是,該starter不包含註冊中心客戶端,需要自己配置。一般推薦使用zookeeper作為註冊中心,所以需要手動引入zkclient。

application.properties

#web服務端口,由於我們不需要使用web服務,所以將其設為隨機端口
server.port=-1
#dubbo服務端口,我們無需知道dubbo服務運行在哪個端口,故也將其設為隨機端口
dubbo.protocol.port = -1
#dubbo服務名稱
dubbo.application.name = dubbo-provider
#dubbo服務所在包路徑
dubbo.scan.basePackages = com.czh.dubbo.provider.service
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#設置服務的日誌輸出級別為debug級
logging.level.com.czh.dubbo.provider.service=debug

服務實現類PeopleServiceImpl

package com.czh.dubbo.provider.service;
import java.util.Random;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.dubbo.config.annotation.Service;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
//注意,這裡的service註解用的不是spring的註解,而是com.alibaba.dubbo.config.annotation.Service;
@Service
public class PeopleServiceImpl implements PeopleService{
private static final Logger logger = LoggerFactory.getLogger(PeopleServiceImpl.class);
/**
* 這個方法的作用是接收傳過來的People實體,將其ID賦為隨機數
*/
@Override
public People getPeople(People people) {
people.setId(new Random().nextInt(10000));
logger.debug("People:{},ID:{}",people.getName(),people.getId());
return people;
}
}

六、搭建服務消費者

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

application.properties

#web服務端口
server.port=80
#消費者名稱
dubbo.application.name=dubbo-consumer
#需要使用到提供者服務的包路徑
dubbo.scan.base-packages=com.czh.dubbo.consumer.controller
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181

控制器PeopleController

package com.czh.dubbo.consumer.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
@RestController
public class PeopleController {
@Reference
private PeopleService peopleService;
@GetMapping("/people/{name}")
public People getPeople(@PathVariable("name") String name) {
People people = new People();
people.setName(name);
return peopleService.getPeople(people);
}
}

至此,整個項目便搭建完畢,三個項目的項目結構如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

七、上線運行

1、打包運行

安裝API項目到本地maven倉庫

在dubbo-common項目的pom.xml文件上點擊右鍵,Run as - Maven install

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打包服務提供者與服務消費者

在這兩個項目的pom.xml文件執行以下操作:點擊右鍵,Run as - Maven build… 在彈出的選項框中Golas 填寫:clean package,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

點擊run,打包成功後如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將兩個項目的target文件夾中拿出打好的jar包放到某個文件夾下備用,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

使用java -jar 命令依次運行dubbo-provider 與dubbo-consumer,順序不能搞錯,並且得確保provider啟動完成後再啟動consumer,否則後期會出現空指針異常。

至此,我們總共啟動了四個服務,分別是zookeeper註冊中心、dubbo-admin、dubbo-provider、dubbo-consumer,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打開dubbo監控網頁檢查服務消費者和提供者是否已經註冊成功:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到,提供者與消費者已成功註冊到註冊中心

2、基本調用

使用瀏覽器訪問此地址http://127.0.0.1/people/test,觀察服務提供者的控制檯輸出內容

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

後臺控制檯已輸出日誌了,證明調用成功,那麼瀏覽器是否能夠拿到數據呢?

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到瀏覽器也拿到數據了,證明已經成功完成調用了。

3、容錯與屏蔽

容錯

顧名思義就是當服務提供者出現異常時,消費者是否能夠正常處理,在這裡,我們關閉掉服務提供者,再進行調用,觀察是否會報錯

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以觀察到前端報異常了。我們進入dubbo-admin在消費者中把服務容錯開啟,如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

再進行調用可以看到

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到此時調用後返回確實為空,證明容錯生效。

屏蔽

當對某個服務啟動屏蔽時,此時消費者調用該服務時均會返回空對象。首先我們需要確保提供者與消費者均已啟動,然後在消費者中對提供者進行屏蔽,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

再進行服務調用

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到此時調用後返回確實為空,證明屏蔽生效。

其實屏蔽與容錯還有更高級的玩法,最基本的屏蔽是返回空對象,我們甚至可以自定義返回內容。

進入動態配置,選擇新增

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

編輯紅框處的內容如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

再訪問網頁

"

一、Dubbo介紹

引用官方的一段介紹

Apache Dubbo (incubating) |ˈdʌbəʊ| is a high-performance, java based RPC framework open-sourced by Alibaba. As in many RPC systems, dubbo is based around the idea of defining a service, specifying the methods that can be called remotely with their parameters and return types. On the server side, the server implements this interface and runs a dubbo server to handle client calls. On the client side, the client has a stub that provides the same methods as the server.

Dubbo是阿里出的一個高性能的分佈式微服務框架,它的特點是性能高、界面友好、文檔齊全(特別是中文文檔),是很多中小型公司快速搭建微服務的首選技術。前段時間被阿里重新進行維護,並進入Apache孵化器。遷移到Apache後也推出了新的starter,簡單試用後感覺不錯,為此特地寫下這一系列筆記,用以記錄。(整個項目的源碼在最後一章,感興趣的童鞋可以下載自己搭建試試,也可以將其作為腳手架搭建你自己的微服務)

二、搭建註冊中心

在dubbo中,每一個服務都是分佈式的,消費者與提供者的關係並不是一對一的關係,而是一對多,並且服務提供者的實例位置是未知的,如果都由開發者使用靜態文件去維護這個關係顯示不合適的,一方面是徒增工作量,另一方面是靈活度不高,如果服務提供者更換了服務器地址,那麼需要重新配置等,所以目前比較推崇的方案是所有服務提供者均主動將自己的信息註冊到同個地方中,而消費者只要一律從這個地方取他需要的東西即可,這個地方就是所謂的註冊中心。目前dubbo可以選擇的註冊中心包括zookeeper、redis等,一般建議使用zookeeper,下面演示一下在windows中如何搭建zookeeper註冊中心。

1、下載zookeeper

直接在官網的鏡像站下 (https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/zookeeper-3.4.12.tar.gz)

2、解壓並配置zookeeper

為了演示,直接使用官方示例配置。把解壓出來的\\zookeeper-3.4.12\\conf\\zoo_sample.cfg 文件名改為zoo.cfg即可,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、運行zookeeper註冊中心

雙擊運行/zookeeper-3.4.12/bin/zkServer.cmd,出現以下窗口代表運行成功。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

三、搭建Dubbo Admin

在Dubbo中,一大殺器就是它的可視化監控界面,在這個界面中可以查看服務者、提供者的數量、狀態等,並對服務降級、容錯、屏蔽等提供了可視化操作。下面演示如何搭建Dubbo Admin。

1、下載源碼並解壓

點擊下面地址下載dubbo admin項目源碼 (https://codeload.github.com/apache/incubator-dubbo-ops/zip/master)

下載後解壓出來,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

2、打包

打開cmd,進入第一步解壓出來的dubbo-admin文件夾中,執行mvn clean package

(ps:要是提示未存在mvn命令,就把maven文件夾的bin目錄添加到系統環境變量PATH中)

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、配置dubbo admin

打開上面那步打出來的war包(\\incubator-dubbo-ops-master\\dubbo-admin\\target\\dubbo-admin-2.0.0.war),編輯WEB-INF文件夾中的dubbo.properties文件,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將紅框處的IP地址改為你的註冊中心的地址,由於我們的註冊中心是在本地運行的,故此處無需做修改。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

4、運行Dubbo Admin

將war包改名為ROOT.war後放到tomcat的webapp目錄中,然後運行tomcat。使用瀏覽器打開http://127.0.0.1:8080,提示輸入賬號密碼,賬號和密碼默認均為root,登陸後的界面如下:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

四、搭建API項目

由於Dubbo是採用RPC調用方式,這也是與Spring Cloud比較大的區別之一。在Spring Cloud中,服務通過HTTP接口提供給其它服務調用,對於調用者與被調用者來說,只要雙方保證滿足http接口的契約即可,但是在dubbo中,是嚴格要求調用接口的類路徑、參數等雙方一致。所以需要構建一個API項目,該項目裡面存放服務接口即公共實體,雙方依賴這個項目完成遠程調用。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
</project>

公共實體-People.java

package com.czh.dubbo.common.entity;
import java.io.Serializable;
public class People implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1415852192397895853L;
// 人員編號
private int id;
// 姓名
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "People [id=" + id + ", name=" + name + "]";
}
}

公共服務接口-PeopleService.java

package com.czh.dubbo.common.service;
import com.czh.dubbo.common.entity.People;
public interface PeopleService {
People getPeople(People people);
}

五、搭建服務提供者

服務提供者就是被消費者所調用的,它需要實現公共服務接口,並通過dubbo把自己的服務暴露出來。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

com.alibaba.boot是遷移過後出的一個最新的dubbo spring boot starter,也是目前官方推薦使用的。值得注意的是,該starter不包含註冊中心客戶端,需要自己配置。一般推薦使用zookeeper作為註冊中心,所以需要手動引入zkclient。

application.properties

#web服務端口,由於我們不需要使用web服務,所以將其設為隨機端口
server.port=-1
#dubbo服務端口,我們無需知道dubbo服務運行在哪個端口,故也將其設為隨機端口
dubbo.protocol.port = -1
#dubbo服務名稱
dubbo.application.name = dubbo-provider
#dubbo服務所在包路徑
dubbo.scan.basePackages = com.czh.dubbo.provider.service
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#設置服務的日誌輸出級別為debug級
logging.level.com.czh.dubbo.provider.service=debug

服務實現類PeopleServiceImpl

package com.czh.dubbo.provider.service;
import java.util.Random;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.dubbo.config.annotation.Service;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
//注意,這裡的service註解用的不是spring的註解,而是com.alibaba.dubbo.config.annotation.Service;
@Service
public class PeopleServiceImpl implements PeopleService{
private static final Logger logger = LoggerFactory.getLogger(PeopleServiceImpl.class);
/**
* 這個方法的作用是接收傳過來的People實體,將其ID賦為隨機數
*/
@Override
public People getPeople(People people) {
people.setId(new Random().nextInt(10000));
logger.debug("People:{},ID:{}",people.getName(),people.getId());
return people;
}
}

六、搭建服務消費者

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

application.properties

#web服務端口
server.port=80
#消費者名稱
dubbo.application.name=dubbo-consumer
#需要使用到提供者服務的包路徑
dubbo.scan.base-packages=com.czh.dubbo.consumer.controller
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181

控制器PeopleController

package com.czh.dubbo.consumer.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
@RestController
public class PeopleController {
@Reference
private PeopleService peopleService;
@GetMapping("/people/{name}")
public People getPeople(@PathVariable("name") String name) {
People people = new People();
people.setName(name);
return peopleService.getPeople(people);
}
}

至此,整個項目便搭建完畢,三個項目的項目結構如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

七、上線運行

1、打包運行

安裝API項目到本地maven倉庫

在dubbo-common項目的pom.xml文件上點擊右鍵,Run as - Maven install

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打包服務提供者與服務消費者

在這兩個項目的pom.xml文件執行以下操作:點擊右鍵,Run as - Maven build… 在彈出的選項框中Golas 填寫:clean package,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

點擊run,打包成功後如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將兩個項目的target文件夾中拿出打好的jar包放到某個文件夾下備用,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

使用java -jar 命令依次運行dubbo-provider 與dubbo-consumer,順序不能搞錯,並且得確保provider啟動完成後再啟動consumer,否則後期會出現空指針異常。

至此,我們總共啟動了四個服務,分別是zookeeper註冊中心、dubbo-admin、dubbo-provider、dubbo-consumer,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打開dubbo監控網頁檢查服務消費者和提供者是否已經註冊成功:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到,提供者與消費者已成功註冊到註冊中心

2、基本調用

使用瀏覽器訪問此地址http://127.0.0.1/people/test,觀察服務提供者的控制檯輸出內容

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

後臺控制檯已輸出日誌了,證明調用成功,那麼瀏覽器是否能夠拿到數據呢?

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到瀏覽器也拿到數據了,證明已經成功完成調用了。

3、容錯與屏蔽

容錯

顧名思義就是當服務提供者出現異常時,消費者是否能夠正常處理,在這裡,我們關閉掉服務提供者,再進行調用,觀察是否會報錯

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以觀察到前端報異常了。我們進入dubbo-admin在消費者中把服務容錯開啟,如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

再進行調用可以看到

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到此時調用後返回確實為空,證明容錯生效。

屏蔽

當對某個服務啟動屏蔽時,此時消費者調用該服務時均會返回空對象。首先我們需要確保提供者與消費者均已啟動,然後在消費者中對提供者進行屏蔽,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

再進行服務調用

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到此時調用後返回確實為空,證明屏蔽生效。

其實屏蔽與容錯還有更高級的玩法,最基本的屏蔽是返回空對象,我們甚至可以自定義返回內容。

進入動態配置,選擇新增

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

編輯紅框處的內容如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

再訪問網頁

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到確實屏蔽成功,並返回我們自定義的內容,注意,此時並未調用到提供者服務。

3、服務降級

為了測試服務降級,我們需要再啟動一個服務提供者

"

一、Dubbo介紹

引用官方的一段介紹

Apache Dubbo (incubating) |ˈdʌbəʊ| is a high-performance, java based RPC framework open-sourced by Alibaba. As in many RPC systems, dubbo is based around the idea of defining a service, specifying the methods that can be called remotely with their parameters and return types. On the server side, the server implements this interface and runs a dubbo server to handle client calls. On the client side, the client has a stub that provides the same methods as the server.

Dubbo是阿里出的一個高性能的分佈式微服務框架,它的特點是性能高、界面友好、文檔齊全(特別是中文文檔),是很多中小型公司快速搭建微服務的首選技術。前段時間被阿里重新進行維護,並進入Apache孵化器。遷移到Apache後也推出了新的starter,簡單試用後感覺不錯,為此特地寫下這一系列筆記,用以記錄。(整個項目的源碼在最後一章,感興趣的童鞋可以下載自己搭建試試,也可以將其作為腳手架搭建你自己的微服務)

二、搭建註冊中心

在dubbo中,每一個服務都是分佈式的,消費者與提供者的關係並不是一對一的關係,而是一對多,並且服務提供者的實例位置是未知的,如果都由開發者使用靜態文件去維護這個關係顯示不合適的,一方面是徒增工作量,另一方面是靈活度不高,如果服務提供者更換了服務器地址,那麼需要重新配置等,所以目前比較推崇的方案是所有服務提供者均主動將自己的信息註冊到同個地方中,而消費者只要一律從這個地方取他需要的東西即可,這個地方就是所謂的註冊中心。目前dubbo可以選擇的註冊中心包括zookeeper、redis等,一般建議使用zookeeper,下面演示一下在windows中如何搭建zookeeper註冊中心。

1、下載zookeeper

直接在官網的鏡像站下 (https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/zookeeper-3.4.12.tar.gz)

2、解壓並配置zookeeper

為了演示,直接使用官方示例配置。把解壓出來的\\zookeeper-3.4.12\\conf\\zoo_sample.cfg 文件名改為zoo.cfg即可,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、運行zookeeper註冊中心

雙擊運行/zookeeper-3.4.12/bin/zkServer.cmd,出現以下窗口代表運行成功。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

三、搭建Dubbo Admin

在Dubbo中,一大殺器就是它的可視化監控界面,在這個界面中可以查看服務者、提供者的數量、狀態等,並對服務降級、容錯、屏蔽等提供了可視化操作。下面演示如何搭建Dubbo Admin。

1、下載源碼並解壓

點擊下面地址下載dubbo admin項目源碼 (https://codeload.github.com/apache/incubator-dubbo-ops/zip/master)

下載後解壓出來,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

2、打包

打開cmd,進入第一步解壓出來的dubbo-admin文件夾中,執行mvn clean package

(ps:要是提示未存在mvn命令,就把maven文件夾的bin目錄添加到系統環境變量PATH中)

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、配置dubbo admin

打開上面那步打出來的war包(\\incubator-dubbo-ops-master\\dubbo-admin\\target\\dubbo-admin-2.0.0.war),編輯WEB-INF文件夾中的dubbo.properties文件,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將紅框處的IP地址改為你的註冊中心的地址,由於我們的註冊中心是在本地運行的,故此處無需做修改。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

4、運行Dubbo Admin

將war包改名為ROOT.war後放到tomcat的webapp目錄中,然後運行tomcat。使用瀏覽器打開http://127.0.0.1:8080,提示輸入賬號密碼,賬號和密碼默認均為root,登陸後的界面如下:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

四、搭建API項目

由於Dubbo是採用RPC調用方式,這也是與Spring Cloud比較大的區別之一。在Spring Cloud中,服務通過HTTP接口提供給其它服務調用,對於調用者與被調用者來說,只要雙方保證滿足http接口的契約即可,但是在dubbo中,是嚴格要求調用接口的類路徑、參數等雙方一致。所以需要構建一個API項目,該項目裡面存放服務接口即公共實體,雙方依賴這個項目完成遠程調用。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
</project>

公共實體-People.java

package com.czh.dubbo.common.entity;
import java.io.Serializable;
public class People implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1415852192397895853L;
// 人員編號
private int id;
// 姓名
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "People [id=" + id + ", name=" + name + "]";
}
}

公共服務接口-PeopleService.java

package com.czh.dubbo.common.service;
import com.czh.dubbo.common.entity.People;
public interface PeopleService {
People getPeople(People people);
}

五、搭建服務提供者

服務提供者就是被消費者所調用的,它需要實現公共服務接口,並通過dubbo把自己的服務暴露出來。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

com.alibaba.boot是遷移過後出的一個最新的dubbo spring boot starter,也是目前官方推薦使用的。值得注意的是,該starter不包含註冊中心客戶端,需要自己配置。一般推薦使用zookeeper作為註冊中心,所以需要手動引入zkclient。

application.properties

#web服務端口,由於我們不需要使用web服務,所以將其設為隨機端口
server.port=-1
#dubbo服務端口,我們無需知道dubbo服務運行在哪個端口,故也將其設為隨機端口
dubbo.protocol.port = -1
#dubbo服務名稱
dubbo.application.name = dubbo-provider
#dubbo服務所在包路徑
dubbo.scan.basePackages = com.czh.dubbo.provider.service
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#設置服務的日誌輸出級別為debug級
logging.level.com.czh.dubbo.provider.service=debug

服務實現類PeopleServiceImpl

package com.czh.dubbo.provider.service;
import java.util.Random;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.dubbo.config.annotation.Service;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
//注意,這裡的service註解用的不是spring的註解,而是com.alibaba.dubbo.config.annotation.Service;
@Service
public class PeopleServiceImpl implements PeopleService{
private static final Logger logger = LoggerFactory.getLogger(PeopleServiceImpl.class);
/**
* 這個方法的作用是接收傳過來的People實體,將其ID賦為隨機數
*/
@Override
public People getPeople(People people) {
people.setId(new Random().nextInt(10000));
logger.debug("People:{},ID:{}",people.getName(),people.getId());
return people;
}
}

六、搭建服務消費者

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

application.properties

#web服務端口
server.port=80
#消費者名稱
dubbo.application.name=dubbo-consumer
#需要使用到提供者服務的包路徑
dubbo.scan.base-packages=com.czh.dubbo.consumer.controller
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181

控制器PeopleController

package com.czh.dubbo.consumer.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
@RestController
public class PeopleController {
@Reference
private PeopleService peopleService;
@GetMapping("/people/{name}")
public People getPeople(@PathVariable("name") String name) {
People people = new People();
people.setName(name);
return peopleService.getPeople(people);
}
}

至此,整個項目便搭建完畢,三個項目的項目結構如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

七、上線運行

1、打包運行

安裝API項目到本地maven倉庫

在dubbo-common項目的pom.xml文件上點擊右鍵,Run as - Maven install

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打包服務提供者與服務消費者

在這兩個項目的pom.xml文件執行以下操作:點擊右鍵,Run as - Maven build… 在彈出的選項框中Golas 填寫:clean package,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

點擊run,打包成功後如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將兩個項目的target文件夾中拿出打好的jar包放到某個文件夾下備用,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

使用java -jar 命令依次運行dubbo-provider 與dubbo-consumer,順序不能搞錯,並且得確保provider啟動完成後再啟動consumer,否則後期會出現空指針異常。

至此,我們總共啟動了四個服務,分別是zookeeper註冊中心、dubbo-admin、dubbo-provider、dubbo-consumer,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打開dubbo監控網頁檢查服務消費者和提供者是否已經註冊成功:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到,提供者與消費者已成功註冊到註冊中心

2、基本調用

使用瀏覽器訪問此地址http://127.0.0.1/people/test,觀察服務提供者的控制檯輸出內容

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

後臺控制檯已輸出日誌了,證明調用成功,那麼瀏覽器是否能夠拿到數據呢?

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到瀏覽器也拿到數據了,證明已經成功完成調用了。

3、容錯與屏蔽

容錯

顧名思義就是當服務提供者出現異常時,消費者是否能夠正常處理,在這裡,我們關閉掉服務提供者,再進行調用,觀察是否會報錯

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以觀察到前端報異常了。我們進入dubbo-admin在消費者中把服務容錯開啟,如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

再進行調用可以看到

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到此時調用後返回確實為空,證明容錯生效。

屏蔽

當對某個服務啟動屏蔽時,此時消費者調用該服務時均會返回空對象。首先我們需要確保提供者與消費者均已啟動,然後在消費者中對提供者進行屏蔽,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

再進行服務調用

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到此時調用後返回確實為空,證明屏蔽生效。

其實屏蔽與容錯還有更高級的玩法,最基本的屏蔽是返回空對象,我們甚至可以自定義返回內容。

進入動態配置,選擇新增

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

編輯紅框處的內容如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

再訪問網頁

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到確實屏蔽成功,並返回我們自定義的內容,注意,此時並未調用到提供者服務。

3、服務降級

為了測試服務降級,我們需要再啟動一個服務提供者

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到目前兩個服務提供者

然後我們再連續多次訪問網頁

"

一、Dubbo介紹

引用官方的一段介紹

Apache Dubbo (incubating) |ˈdʌbəʊ| is a high-performance, java based RPC framework open-sourced by Alibaba. As in many RPC systems, dubbo is based around the idea of defining a service, specifying the methods that can be called remotely with their parameters and return types. On the server side, the server implements this interface and runs a dubbo server to handle client calls. On the client side, the client has a stub that provides the same methods as the server.

Dubbo是阿里出的一個高性能的分佈式微服務框架,它的特點是性能高、界面友好、文檔齊全(特別是中文文檔),是很多中小型公司快速搭建微服務的首選技術。前段時間被阿里重新進行維護,並進入Apache孵化器。遷移到Apache後也推出了新的starter,簡單試用後感覺不錯,為此特地寫下這一系列筆記,用以記錄。(整個項目的源碼在最後一章,感興趣的童鞋可以下載自己搭建試試,也可以將其作為腳手架搭建你自己的微服務)

二、搭建註冊中心

在dubbo中,每一個服務都是分佈式的,消費者與提供者的關係並不是一對一的關係,而是一對多,並且服務提供者的實例位置是未知的,如果都由開發者使用靜態文件去維護這個關係顯示不合適的,一方面是徒增工作量,另一方面是靈活度不高,如果服務提供者更換了服務器地址,那麼需要重新配置等,所以目前比較推崇的方案是所有服務提供者均主動將自己的信息註冊到同個地方中,而消費者只要一律從這個地方取他需要的東西即可,這個地方就是所謂的註冊中心。目前dubbo可以選擇的註冊中心包括zookeeper、redis等,一般建議使用zookeeper,下面演示一下在windows中如何搭建zookeeper註冊中心。

1、下載zookeeper

直接在官網的鏡像站下 (https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/zookeeper-3.4.12.tar.gz)

2、解壓並配置zookeeper

為了演示,直接使用官方示例配置。把解壓出來的\\zookeeper-3.4.12\\conf\\zoo_sample.cfg 文件名改為zoo.cfg即可,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、運行zookeeper註冊中心

雙擊運行/zookeeper-3.4.12/bin/zkServer.cmd,出現以下窗口代表運行成功。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

三、搭建Dubbo Admin

在Dubbo中,一大殺器就是它的可視化監控界面,在這個界面中可以查看服務者、提供者的數量、狀態等,並對服務降級、容錯、屏蔽等提供了可視化操作。下面演示如何搭建Dubbo Admin。

1、下載源碼並解壓

點擊下面地址下載dubbo admin項目源碼 (https://codeload.github.com/apache/incubator-dubbo-ops/zip/master)

下載後解壓出來,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

2、打包

打開cmd,進入第一步解壓出來的dubbo-admin文件夾中,執行mvn clean package

(ps:要是提示未存在mvn命令,就把maven文件夾的bin目錄添加到系統環境變量PATH中)

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、配置dubbo admin

打開上面那步打出來的war包(\\incubator-dubbo-ops-master\\dubbo-admin\\target\\dubbo-admin-2.0.0.war),編輯WEB-INF文件夾中的dubbo.properties文件,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將紅框處的IP地址改為你的註冊中心的地址,由於我們的註冊中心是在本地運行的,故此處無需做修改。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

4、運行Dubbo Admin

將war包改名為ROOT.war後放到tomcat的webapp目錄中,然後運行tomcat。使用瀏覽器打開http://127.0.0.1:8080,提示輸入賬號密碼,賬號和密碼默認均為root,登陸後的界面如下:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

四、搭建API項目

由於Dubbo是採用RPC調用方式,這也是與Spring Cloud比較大的區別之一。在Spring Cloud中,服務通過HTTP接口提供給其它服務調用,對於調用者與被調用者來說,只要雙方保證滿足http接口的契約即可,但是在dubbo中,是嚴格要求調用接口的類路徑、參數等雙方一致。所以需要構建一個API項目,該項目裡面存放服務接口即公共實體,雙方依賴這個項目完成遠程調用。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
</project>

公共實體-People.java

package com.czh.dubbo.common.entity;
import java.io.Serializable;
public class People implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1415852192397895853L;
// 人員編號
private int id;
// 姓名
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "People [id=" + id + ", name=" + name + "]";
}
}

公共服務接口-PeopleService.java

package com.czh.dubbo.common.service;
import com.czh.dubbo.common.entity.People;
public interface PeopleService {
People getPeople(People people);
}

五、搭建服務提供者

服務提供者就是被消費者所調用的,它需要實現公共服務接口,並通過dubbo把自己的服務暴露出來。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

com.alibaba.boot是遷移過後出的一個最新的dubbo spring boot starter,也是目前官方推薦使用的。值得注意的是,該starter不包含註冊中心客戶端,需要自己配置。一般推薦使用zookeeper作為註冊中心,所以需要手動引入zkclient。

application.properties

#web服務端口,由於我們不需要使用web服務,所以將其設為隨機端口
server.port=-1
#dubbo服務端口,我們無需知道dubbo服務運行在哪個端口,故也將其設為隨機端口
dubbo.protocol.port = -1
#dubbo服務名稱
dubbo.application.name = dubbo-provider
#dubbo服務所在包路徑
dubbo.scan.basePackages = com.czh.dubbo.provider.service
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#設置服務的日誌輸出級別為debug級
logging.level.com.czh.dubbo.provider.service=debug

服務實現類PeopleServiceImpl

package com.czh.dubbo.provider.service;
import java.util.Random;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.dubbo.config.annotation.Service;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
//注意,這裡的service註解用的不是spring的註解,而是com.alibaba.dubbo.config.annotation.Service;
@Service
public class PeopleServiceImpl implements PeopleService{
private static final Logger logger = LoggerFactory.getLogger(PeopleServiceImpl.class);
/**
* 這個方法的作用是接收傳過來的People實體,將其ID賦為隨機數
*/
@Override
public People getPeople(People people) {
people.setId(new Random().nextInt(10000));
logger.debug("People:{},ID:{}",people.getName(),people.getId());
return people;
}
}

六、搭建服務消費者

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

application.properties

#web服務端口
server.port=80
#消費者名稱
dubbo.application.name=dubbo-consumer
#需要使用到提供者服務的包路徑
dubbo.scan.base-packages=com.czh.dubbo.consumer.controller
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181

控制器PeopleController

package com.czh.dubbo.consumer.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
@RestController
public class PeopleController {
@Reference
private PeopleService peopleService;
@GetMapping("/people/{name}")
public People getPeople(@PathVariable("name") String name) {
People people = new People();
people.setName(name);
return peopleService.getPeople(people);
}
}

至此,整個項目便搭建完畢,三個項目的項目結構如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

七、上線運行

1、打包運行

安裝API項目到本地maven倉庫

在dubbo-common項目的pom.xml文件上點擊右鍵,Run as - Maven install

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打包服務提供者與服務消費者

在這兩個項目的pom.xml文件執行以下操作:點擊右鍵,Run as - Maven build… 在彈出的選項框中Golas 填寫:clean package,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

點擊run,打包成功後如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將兩個項目的target文件夾中拿出打好的jar包放到某個文件夾下備用,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

使用java -jar 命令依次運行dubbo-provider 與dubbo-consumer,順序不能搞錯,並且得確保provider啟動完成後再啟動consumer,否則後期會出現空指針異常。

至此,我們總共啟動了四個服務,分別是zookeeper註冊中心、dubbo-admin、dubbo-provider、dubbo-consumer,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打開dubbo監控網頁檢查服務消費者和提供者是否已經註冊成功:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到,提供者與消費者已成功註冊到註冊中心

2、基本調用

使用瀏覽器訪問此地址http://127.0.0.1/people/test,觀察服務提供者的控制檯輸出內容

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

後臺控制檯已輸出日誌了,證明調用成功,那麼瀏覽器是否能夠拿到數據呢?

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到瀏覽器也拿到數據了,證明已經成功完成調用了。

3、容錯與屏蔽

容錯

顧名思義就是當服務提供者出現異常時,消費者是否能夠正常處理,在這裡,我們關閉掉服務提供者,再進行調用,觀察是否會報錯

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以觀察到前端報異常了。我們進入dubbo-admin在消費者中把服務容錯開啟,如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

再進行調用可以看到

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到此時調用後返回確實為空,證明容錯生效。

屏蔽

當對某個服務啟動屏蔽時,此時消費者調用該服務時均會返回空對象。首先我們需要確保提供者與消費者均已啟動,然後在消費者中對提供者進行屏蔽,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

再進行服務調用

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到此時調用後返回確實為空,證明屏蔽生效。

其實屏蔽與容錯還有更高級的玩法,最基本的屏蔽是返回空對象,我們甚至可以自定義返回內容。

進入動態配置,選擇新增

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

編輯紅框處的內容如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

再訪問網頁

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到確實屏蔽成功,並返回我們自定義的內容,注意,此時並未調用到提供者服務。

3、服務降級

為了測試服務降級,我們需要再啟動一個服務提供者

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到目前兩個服務提供者

然後我們再連續多次訪問網頁

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

兩個服務接收到的請求數量是差不多的,此時我們對第二個服務進行降級,為了測試明顯,這裡我們連續降兩次級,將其降到0.25,再連續調用,觀察結果

"

一、Dubbo介紹

引用官方的一段介紹

Apache Dubbo (incubating) |ˈdʌbəʊ| is a high-performance, java based RPC framework open-sourced by Alibaba. As in many RPC systems, dubbo is based around the idea of defining a service, specifying the methods that can be called remotely with their parameters and return types. On the server side, the server implements this interface and runs a dubbo server to handle client calls. On the client side, the client has a stub that provides the same methods as the server.

Dubbo是阿里出的一個高性能的分佈式微服務框架,它的特點是性能高、界面友好、文檔齊全(特別是中文文檔),是很多中小型公司快速搭建微服務的首選技術。前段時間被阿里重新進行維護,並進入Apache孵化器。遷移到Apache後也推出了新的starter,簡單試用後感覺不錯,為此特地寫下這一系列筆記,用以記錄。(整個項目的源碼在最後一章,感興趣的童鞋可以下載自己搭建試試,也可以將其作為腳手架搭建你自己的微服務)

二、搭建註冊中心

在dubbo中,每一個服務都是分佈式的,消費者與提供者的關係並不是一對一的關係,而是一對多,並且服務提供者的實例位置是未知的,如果都由開發者使用靜態文件去維護這個關係顯示不合適的,一方面是徒增工作量,另一方面是靈活度不高,如果服務提供者更換了服務器地址,那麼需要重新配置等,所以目前比較推崇的方案是所有服務提供者均主動將自己的信息註冊到同個地方中,而消費者只要一律從這個地方取他需要的東西即可,這個地方就是所謂的註冊中心。目前dubbo可以選擇的註冊中心包括zookeeper、redis等,一般建議使用zookeeper,下面演示一下在windows中如何搭建zookeeper註冊中心。

1、下載zookeeper

直接在官網的鏡像站下 (https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/zookeeper-3.4.12.tar.gz)

2、解壓並配置zookeeper

為了演示,直接使用官方示例配置。把解壓出來的\\zookeeper-3.4.12\\conf\\zoo_sample.cfg 文件名改為zoo.cfg即可,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、運行zookeeper註冊中心

雙擊運行/zookeeper-3.4.12/bin/zkServer.cmd,出現以下窗口代表運行成功。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

三、搭建Dubbo Admin

在Dubbo中,一大殺器就是它的可視化監控界面,在這個界面中可以查看服務者、提供者的數量、狀態等,並對服務降級、容錯、屏蔽等提供了可視化操作。下面演示如何搭建Dubbo Admin。

1、下載源碼並解壓

點擊下面地址下載dubbo admin項目源碼 (https://codeload.github.com/apache/incubator-dubbo-ops/zip/master)

下載後解壓出來,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

2、打包

打開cmd,進入第一步解壓出來的dubbo-admin文件夾中,執行mvn clean package

(ps:要是提示未存在mvn命令,就把maven文件夾的bin目錄添加到系統環境變量PATH中)

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、配置dubbo admin

打開上面那步打出來的war包(\\incubator-dubbo-ops-master\\dubbo-admin\\target\\dubbo-admin-2.0.0.war),編輯WEB-INF文件夾中的dubbo.properties文件,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將紅框處的IP地址改為你的註冊中心的地址,由於我們的註冊中心是在本地運行的,故此處無需做修改。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

4、運行Dubbo Admin

將war包改名為ROOT.war後放到tomcat的webapp目錄中,然後運行tomcat。使用瀏覽器打開http://127.0.0.1:8080,提示輸入賬號密碼,賬號和密碼默認均為root,登陸後的界面如下:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

四、搭建API項目

由於Dubbo是採用RPC調用方式,這也是與Spring Cloud比較大的區別之一。在Spring Cloud中,服務通過HTTP接口提供給其它服務調用,對於調用者與被調用者來說,只要雙方保證滿足http接口的契約即可,但是在dubbo中,是嚴格要求調用接口的類路徑、參數等雙方一致。所以需要構建一個API項目,該項目裡面存放服務接口即公共實體,雙方依賴這個項目完成遠程調用。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
</project>

公共實體-People.java

package com.czh.dubbo.common.entity;
import java.io.Serializable;
public class People implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1415852192397895853L;
// 人員編號
private int id;
// 姓名
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "People [id=" + id + ", name=" + name + "]";
}
}

公共服務接口-PeopleService.java

package com.czh.dubbo.common.service;
import com.czh.dubbo.common.entity.People;
public interface PeopleService {
People getPeople(People people);
}

五、搭建服務提供者

服務提供者就是被消費者所調用的,它需要實現公共服務接口,並通過dubbo把自己的服務暴露出來。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

com.alibaba.boot是遷移過後出的一個最新的dubbo spring boot starter,也是目前官方推薦使用的。值得注意的是,該starter不包含註冊中心客戶端,需要自己配置。一般推薦使用zookeeper作為註冊中心,所以需要手動引入zkclient。

application.properties

#web服務端口,由於我們不需要使用web服務,所以將其設為隨機端口
server.port=-1
#dubbo服務端口,我們無需知道dubbo服務運行在哪個端口,故也將其設為隨機端口
dubbo.protocol.port = -1
#dubbo服務名稱
dubbo.application.name = dubbo-provider
#dubbo服務所在包路徑
dubbo.scan.basePackages = com.czh.dubbo.provider.service
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#設置服務的日誌輸出級別為debug級
logging.level.com.czh.dubbo.provider.service=debug

服務實現類PeopleServiceImpl

package com.czh.dubbo.provider.service;
import java.util.Random;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.dubbo.config.annotation.Service;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
//注意,這裡的service註解用的不是spring的註解,而是com.alibaba.dubbo.config.annotation.Service;
@Service
public class PeopleServiceImpl implements PeopleService{
private static final Logger logger = LoggerFactory.getLogger(PeopleServiceImpl.class);
/**
* 這個方法的作用是接收傳過來的People實體,將其ID賦為隨機數
*/
@Override
public People getPeople(People people) {
people.setId(new Random().nextInt(10000));
logger.debug("People:{},ID:{}",people.getName(),people.getId());
return people;
}
}

六、搭建服務消費者

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

application.properties

#web服務端口
server.port=80
#消費者名稱
dubbo.application.name=dubbo-consumer
#需要使用到提供者服務的包路徑
dubbo.scan.base-packages=com.czh.dubbo.consumer.controller
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181

控制器PeopleController

package com.czh.dubbo.consumer.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
@RestController
public class PeopleController {
@Reference
private PeopleService peopleService;
@GetMapping("/people/{name}")
public People getPeople(@PathVariable("name") String name) {
People people = new People();
people.setName(name);
return peopleService.getPeople(people);
}
}

至此,整個項目便搭建完畢,三個項目的項目結構如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

七、上線運行

1、打包運行

安裝API項目到本地maven倉庫

在dubbo-common項目的pom.xml文件上點擊右鍵,Run as - Maven install

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打包服務提供者與服務消費者

在這兩個項目的pom.xml文件執行以下操作:點擊右鍵,Run as - Maven build… 在彈出的選項框中Golas 填寫:clean package,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

點擊run,打包成功後如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將兩個項目的target文件夾中拿出打好的jar包放到某個文件夾下備用,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

使用java -jar 命令依次運行dubbo-provider 與dubbo-consumer,順序不能搞錯,並且得確保provider啟動完成後再啟動consumer,否則後期會出現空指針異常。

至此,我們總共啟動了四個服務,分別是zookeeper註冊中心、dubbo-admin、dubbo-provider、dubbo-consumer,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打開dubbo監控網頁檢查服務消費者和提供者是否已經註冊成功:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到,提供者與消費者已成功註冊到註冊中心

2、基本調用

使用瀏覽器訪問此地址http://127.0.0.1/people/test,觀察服務提供者的控制檯輸出內容

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

後臺控制檯已輸出日誌了,證明調用成功,那麼瀏覽器是否能夠拿到數據呢?

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到瀏覽器也拿到數據了,證明已經成功完成調用了。

3、容錯與屏蔽

容錯

顧名思義就是當服務提供者出現異常時,消費者是否能夠正常處理,在這裡,我們關閉掉服務提供者,再進行調用,觀察是否會報錯

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以觀察到前端報異常了。我們進入dubbo-admin在消費者中把服務容錯開啟,如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

再進行調用可以看到

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到此時調用後返回確實為空,證明容錯生效。

屏蔽

當對某個服務啟動屏蔽時,此時消費者調用該服務時均會返回空對象。首先我們需要確保提供者與消費者均已啟動,然後在消費者中對提供者進行屏蔽,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

再進行服務調用

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到此時調用後返回確實為空,證明屏蔽生效。

其實屏蔽與容錯還有更高級的玩法,最基本的屏蔽是返回空對象,我們甚至可以自定義返回內容。

進入動態配置,選擇新增

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

編輯紅框處的內容如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

再訪問網頁

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到確實屏蔽成功,並返回我們自定義的內容,注意,此時並未調用到提供者服務。

3、服務降級

為了測試服務降級,我們需要再啟動一個服務提供者

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到目前兩個服務提供者

然後我們再連續多次訪問網頁

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

兩個服務接收到的請求數量是差不多的,此時我們對第二個服務進行降級,為了測試明顯,這裡我們連續降兩次級,將其降到0.25,再連續調用,觀察結果

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

"

一、Dubbo介紹

引用官方的一段介紹

Apache Dubbo (incubating) |ˈdʌbəʊ| is a high-performance, java based RPC framework open-sourced by Alibaba. As in many RPC systems, dubbo is based around the idea of defining a service, specifying the methods that can be called remotely with their parameters and return types. On the server side, the server implements this interface and runs a dubbo server to handle client calls. On the client side, the client has a stub that provides the same methods as the server.

Dubbo是阿里出的一個高性能的分佈式微服務框架,它的特點是性能高、界面友好、文檔齊全(特別是中文文檔),是很多中小型公司快速搭建微服務的首選技術。前段時間被阿里重新進行維護,並進入Apache孵化器。遷移到Apache後也推出了新的starter,簡單試用後感覺不錯,為此特地寫下這一系列筆記,用以記錄。(整個項目的源碼在最後一章,感興趣的童鞋可以下載自己搭建試試,也可以將其作為腳手架搭建你自己的微服務)

二、搭建註冊中心

在dubbo中,每一個服務都是分佈式的,消費者與提供者的關係並不是一對一的關係,而是一對多,並且服務提供者的實例位置是未知的,如果都由開發者使用靜態文件去維護這個關係顯示不合適的,一方面是徒增工作量,另一方面是靈活度不高,如果服務提供者更換了服務器地址,那麼需要重新配置等,所以目前比較推崇的方案是所有服務提供者均主動將自己的信息註冊到同個地方中,而消費者只要一律從這個地方取他需要的東西即可,這個地方就是所謂的註冊中心。目前dubbo可以選擇的註冊中心包括zookeeper、redis等,一般建議使用zookeeper,下面演示一下在windows中如何搭建zookeeper註冊中心。

1、下載zookeeper

直接在官網的鏡像站下 (https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/zookeeper-3.4.12.tar.gz)

2、解壓並配置zookeeper

為了演示,直接使用官方示例配置。把解壓出來的\\zookeeper-3.4.12\\conf\\zoo_sample.cfg 文件名改為zoo.cfg即可,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、運行zookeeper註冊中心

雙擊運行/zookeeper-3.4.12/bin/zkServer.cmd,出現以下窗口代表運行成功。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

三、搭建Dubbo Admin

在Dubbo中,一大殺器就是它的可視化監控界面,在這個界面中可以查看服務者、提供者的數量、狀態等,並對服務降級、容錯、屏蔽等提供了可視化操作。下面演示如何搭建Dubbo Admin。

1、下載源碼並解壓

點擊下面地址下載dubbo admin項目源碼 (https://codeload.github.com/apache/incubator-dubbo-ops/zip/master)

下載後解壓出來,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

2、打包

打開cmd,進入第一步解壓出來的dubbo-admin文件夾中,執行mvn clean package

(ps:要是提示未存在mvn命令,就把maven文件夾的bin目錄添加到系統環境變量PATH中)

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、配置dubbo admin

打開上面那步打出來的war包(\\incubator-dubbo-ops-master\\dubbo-admin\\target\\dubbo-admin-2.0.0.war),編輯WEB-INF文件夾中的dubbo.properties文件,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將紅框處的IP地址改為你的註冊中心的地址,由於我們的註冊中心是在本地運行的,故此處無需做修改。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

4、運行Dubbo Admin

將war包改名為ROOT.war後放到tomcat的webapp目錄中,然後運行tomcat。使用瀏覽器打開http://127.0.0.1:8080,提示輸入賬號密碼,賬號和密碼默認均為root,登陸後的界面如下:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

四、搭建API項目

由於Dubbo是採用RPC調用方式,這也是與Spring Cloud比較大的區別之一。在Spring Cloud中,服務通過HTTP接口提供給其它服務調用,對於調用者與被調用者來說,只要雙方保證滿足http接口的契約即可,但是在dubbo中,是嚴格要求調用接口的類路徑、參數等雙方一致。所以需要構建一個API項目,該項目裡面存放服務接口即公共實體,雙方依賴這個項目完成遠程調用。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
</project>

公共實體-People.java

package com.czh.dubbo.common.entity;
import java.io.Serializable;
public class People implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1415852192397895853L;
// 人員編號
private int id;
// 姓名
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "People [id=" + id + ", name=" + name + "]";
}
}

公共服務接口-PeopleService.java

package com.czh.dubbo.common.service;
import com.czh.dubbo.common.entity.People;
public interface PeopleService {
People getPeople(People people);
}

五、搭建服務提供者

服務提供者就是被消費者所調用的,它需要實現公共服務接口,並通過dubbo把自己的服務暴露出來。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

com.alibaba.boot是遷移過後出的一個最新的dubbo spring boot starter,也是目前官方推薦使用的。值得注意的是,該starter不包含註冊中心客戶端,需要自己配置。一般推薦使用zookeeper作為註冊中心,所以需要手動引入zkclient。

application.properties

#web服務端口,由於我們不需要使用web服務,所以將其設為隨機端口
server.port=-1
#dubbo服務端口,我們無需知道dubbo服務運行在哪個端口,故也將其設為隨機端口
dubbo.protocol.port = -1
#dubbo服務名稱
dubbo.application.name = dubbo-provider
#dubbo服務所在包路徑
dubbo.scan.basePackages = com.czh.dubbo.provider.service
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#設置服務的日誌輸出級別為debug級
logging.level.com.czh.dubbo.provider.service=debug

服務實現類PeopleServiceImpl

package com.czh.dubbo.provider.service;
import java.util.Random;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.dubbo.config.annotation.Service;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
//注意,這裡的service註解用的不是spring的註解,而是com.alibaba.dubbo.config.annotation.Service;
@Service
public class PeopleServiceImpl implements PeopleService{
private static final Logger logger = LoggerFactory.getLogger(PeopleServiceImpl.class);
/**
* 這個方法的作用是接收傳過來的People實體,將其ID賦為隨機數
*/
@Override
public People getPeople(People people) {
people.setId(new Random().nextInt(10000));
logger.debug("People:{},ID:{}",people.getName(),people.getId());
return people;
}
}

六、搭建服務消費者

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

application.properties

#web服務端口
server.port=80
#消費者名稱
dubbo.application.name=dubbo-consumer
#需要使用到提供者服務的包路徑
dubbo.scan.base-packages=com.czh.dubbo.consumer.controller
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181

控制器PeopleController

package com.czh.dubbo.consumer.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
@RestController
public class PeopleController {
@Reference
private PeopleService peopleService;
@GetMapping("/people/{name}")
public People getPeople(@PathVariable("name") String name) {
People people = new People();
people.setName(name);
return peopleService.getPeople(people);
}
}

至此,整個項目便搭建完畢,三個項目的項目結構如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

七、上線運行

1、打包運行

安裝API項目到本地maven倉庫

在dubbo-common項目的pom.xml文件上點擊右鍵,Run as - Maven install

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打包服務提供者與服務消費者

在這兩個項目的pom.xml文件執行以下操作:點擊右鍵,Run as - Maven build… 在彈出的選項框中Golas 填寫:clean package,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

點擊run,打包成功後如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將兩個項目的target文件夾中拿出打好的jar包放到某個文件夾下備用,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

使用java -jar 命令依次運行dubbo-provider 與dubbo-consumer,順序不能搞錯,並且得確保provider啟動完成後再啟動consumer,否則後期會出現空指針異常。

至此,我們總共啟動了四個服務,分別是zookeeper註冊中心、dubbo-admin、dubbo-provider、dubbo-consumer,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打開dubbo監控網頁檢查服務消費者和提供者是否已經註冊成功:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到,提供者與消費者已成功註冊到註冊中心

2、基本調用

使用瀏覽器訪問此地址http://127.0.0.1/people/test,觀察服務提供者的控制檯輸出內容

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

後臺控制檯已輸出日誌了,證明調用成功,那麼瀏覽器是否能夠拿到數據呢?

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到瀏覽器也拿到數據了,證明已經成功完成調用了。

3、容錯與屏蔽

容錯

顧名思義就是當服務提供者出現異常時,消費者是否能夠正常處理,在這裡,我們關閉掉服務提供者,再進行調用,觀察是否會報錯

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以觀察到前端報異常了。我們進入dubbo-admin在消費者中把服務容錯開啟,如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

再進行調用可以看到

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到此時調用後返回確實為空,證明容錯生效。

屏蔽

當對某個服務啟動屏蔽時,此時消費者調用該服務時均會返回空對象。首先我們需要確保提供者與消費者均已啟動,然後在消費者中對提供者進行屏蔽,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

再進行服務調用

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到此時調用後返回確實為空,證明屏蔽生效。

其實屏蔽與容錯還有更高級的玩法,最基本的屏蔽是返回空對象,我們甚至可以自定義返回內容。

進入動態配置,選擇新增

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

編輯紅框處的內容如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

再訪問網頁

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到確實屏蔽成功,並返回我們自定義的內容,注意,此時並未調用到提供者服務。

3、服務降級

為了測試服務降級,我們需要再啟動一個服務提供者

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到目前兩個服務提供者

然後我們再連續多次訪問網頁

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

兩個服務接收到的請求數量是差不多的,此時我們對第二個服務進行降級,為了測試明顯,這裡我們連續降兩次級,將其降到0.25,再連續調用,觀察結果

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

已將第二個服務提供者降級到0.25,此時再連續訪問

"

一、Dubbo介紹

引用官方的一段介紹

Apache Dubbo (incubating) |ˈdʌbəʊ| is a high-performance, java based RPC framework open-sourced by Alibaba. As in many RPC systems, dubbo is based around the idea of defining a service, specifying the methods that can be called remotely with their parameters and return types. On the server side, the server implements this interface and runs a dubbo server to handle client calls. On the client side, the client has a stub that provides the same methods as the server.

Dubbo是阿里出的一個高性能的分佈式微服務框架,它的特點是性能高、界面友好、文檔齊全(特別是中文文檔),是很多中小型公司快速搭建微服務的首選技術。前段時間被阿里重新進行維護,並進入Apache孵化器。遷移到Apache後也推出了新的starter,簡單試用後感覺不錯,為此特地寫下這一系列筆記,用以記錄。(整個項目的源碼在最後一章,感興趣的童鞋可以下載自己搭建試試,也可以將其作為腳手架搭建你自己的微服務)

二、搭建註冊中心

在dubbo中,每一個服務都是分佈式的,消費者與提供者的關係並不是一對一的關係,而是一對多,並且服務提供者的實例位置是未知的,如果都由開發者使用靜態文件去維護這個關係顯示不合適的,一方面是徒增工作量,另一方面是靈活度不高,如果服務提供者更換了服務器地址,那麼需要重新配置等,所以目前比較推崇的方案是所有服務提供者均主動將自己的信息註冊到同個地方中,而消費者只要一律從這個地方取他需要的東西即可,這個地方就是所謂的註冊中心。目前dubbo可以選擇的註冊中心包括zookeeper、redis等,一般建議使用zookeeper,下面演示一下在windows中如何搭建zookeeper註冊中心。

1、下載zookeeper

直接在官網的鏡像站下 (https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/zookeeper-3.4.12.tar.gz)

2、解壓並配置zookeeper

為了演示,直接使用官方示例配置。把解壓出來的\\zookeeper-3.4.12\\conf\\zoo_sample.cfg 文件名改為zoo.cfg即可,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、運行zookeeper註冊中心

雙擊運行/zookeeper-3.4.12/bin/zkServer.cmd,出現以下窗口代表運行成功。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

三、搭建Dubbo Admin

在Dubbo中,一大殺器就是它的可視化監控界面,在這個界面中可以查看服務者、提供者的數量、狀態等,並對服務降級、容錯、屏蔽等提供了可視化操作。下面演示如何搭建Dubbo Admin。

1、下載源碼並解壓

點擊下面地址下載dubbo admin項目源碼 (https://codeload.github.com/apache/incubator-dubbo-ops/zip/master)

下載後解壓出來,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

2、打包

打開cmd,進入第一步解壓出來的dubbo-admin文件夾中,執行mvn clean package

(ps:要是提示未存在mvn命令,就把maven文件夾的bin目錄添加到系統環境變量PATH中)

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、配置dubbo admin

打開上面那步打出來的war包(\\incubator-dubbo-ops-master\\dubbo-admin\\target\\dubbo-admin-2.0.0.war),編輯WEB-INF文件夾中的dubbo.properties文件,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將紅框處的IP地址改為你的註冊中心的地址,由於我們的註冊中心是在本地運行的,故此處無需做修改。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

4、運行Dubbo Admin

將war包改名為ROOT.war後放到tomcat的webapp目錄中,然後運行tomcat。使用瀏覽器打開http://127.0.0.1:8080,提示輸入賬號密碼,賬號和密碼默認均為root,登陸後的界面如下:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

四、搭建API項目

由於Dubbo是採用RPC調用方式,這也是與Spring Cloud比較大的區別之一。在Spring Cloud中,服務通過HTTP接口提供給其它服務調用,對於調用者與被調用者來說,只要雙方保證滿足http接口的契約即可,但是在dubbo中,是嚴格要求調用接口的類路徑、參數等雙方一致。所以需要構建一個API項目,該項目裡面存放服務接口即公共實體,雙方依賴這個項目完成遠程調用。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
</project>

公共實體-People.java

package com.czh.dubbo.common.entity;
import java.io.Serializable;
public class People implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1415852192397895853L;
// 人員編號
private int id;
// 姓名
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "People [id=" + id + ", name=" + name + "]";
}
}

公共服務接口-PeopleService.java

package com.czh.dubbo.common.service;
import com.czh.dubbo.common.entity.People;
public interface PeopleService {
People getPeople(People people);
}

五、搭建服務提供者

服務提供者就是被消費者所調用的,它需要實現公共服務接口,並通過dubbo把自己的服務暴露出來。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

com.alibaba.boot是遷移過後出的一個最新的dubbo spring boot starter,也是目前官方推薦使用的。值得注意的是,該starter不包含註冊中心客戶端,需要自己配置。一般推薦使用zookeeper作為註冊中心,所以需要手動引入zkclient。

application.properties

#web服務端口,由於我們不需要使用web服務,所以將其設為隨機端口
server.port=-1
#dubbo服務端口,我們無需知道dubbo服務運行在哪個端口,故也將其設為隨機端口
dubbo.protocol.port = -1
#dubbo服務名稱
dubbo.application.name = dubbo-provider
#dubbo服務所在包路徑
dubbo.scan.basePackages = com.czh.dubbo.provider.service
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#設置服務的日誌輸出級別為debug級
logging.level.com.czh.dubbo.provider.service=debug

服務實現類PeopleServiceImpl

package com.czh.dubbo.provider.service;
import java.util.Random;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.dubbo.config.annotation.Service;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
//注意,這裡的service註解用的不是spring的註解,而是com.alibaba.dubbo.config.annotation.Service;
@Service
public class PeopleServiceImpl implements PeopleService{
private static final Logger logger = LoggerFactory.getLogger(PeopleServiceImpl.class);
/**
* 這個方法的作用是接收傳過來的People實體,將其ID賦為隨機數
*/
@Override
public People getPeople(People people) {
people.setId(new Random().nextInt(10000));
logger.debug("People:{},ID:{}",people.getName(),people.getId());
return people;
}
}

六、搭建服務消費者

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

application.properties

#web服務端口
server.port=80
#消費者名稱
dubbo.application.name=dubbo-consumer
#需要使用到提供者服務的包路徑
dubbo.scan.base-packages=com.czh.dubbo.consumer.controller
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181

控制器PeopleController

package com.czh.dubbo.consumer.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
@RestController
public class PeopleController {
@Reference
private PeopleService peopleService;
@GetMapping("/people/{name}")
public People getPeople(@PathVariable("name") String name) {
People people = new People();
people.setName(name);
return peopleService.getPeople(people);
}
}

至此,整個項目便搭建完畢,三個項目的項目結構如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

七、上線運行

1、打包運行

安裝API項目到本地maven倉庫

在dubbo-common項目的pom.xml文件上點擊右鍵,Run as - Maven install

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打包服務提供者與服務消費者

在這兩個項目的pom.xml文件執行以下操作:點擊右鍵,Run as - Maven build… 在彈出的選項框中Golas 填寫:clean package,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

點擊run,打包成功後如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將兩個項目的target文件夾中拿出打好的jar包放到某個文件夾下備用,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

使用java -jar 命令依次運行dubbo-provider 與dubbo-consumer,順序不能搞錯,並且得確保provider啟動完成後再啟動consumer,否則後期會出現空指針異常。

至此,我們總共啟動了四個服務,分別是zookeeper註冊中心、dubbo-admin、dubbo-provider、dubbo-consumer,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打開dubbo監控網頁檢查服務消費者和提供者是否已經註冊成功:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到,提供者與消費者已成功註冊到註冊中心

2、基本調用

使用瀏覽器訪問此地址http://127.0.0.1/people/test,觀察服務提供者的控制檯輸出內容

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

後臺控制檯已輸出日誌了,證明調用成功,那麼瀏覽器是否能夠拿到數據呢?

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到瀏覽器也拿到數據了,證明已經成功完成調用了。

3、容錯與屏蔽

容錯

顧名思義就是當服務提供者出現異常時,消費者是否能夠正常處理,在這裡,我們關閉掉服務提供者,再進行調用,觀察是否會報錯

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以觀察到前端報異常了。我們進入dubbo-admin在消費者中把服務容錯開啟,如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

再進行調用可以看到

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到此時調用後返回確實為空,證明容錯生效。

屏蔽

當對某個服務啟動屏蔽時,此時消費者調用該服務時均會返回空對象。首先我們需要確保提供者與消費者均已啟動,然後在消費者中對提供者進行屏蔽,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

再進行服務調用

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到此時調用後返回確實為空,證明屏蔽生效。

其實屏蔽與容錯還有更高級的玩法,最基本的屏蔽是返回空對象,我們甚至可以自定義返回內容。

進入動態配置,選擇新增

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

編輯紅框處的內容如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

再訪問網頁

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到確實屏蔽成功,並返回我們自定義的內容,注意,此時並未調用到提供者服務。

3、服務降級

為了測試服務降級,我們需要再啟動一個服務提供者

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到目前兩個服務提供者

然後我們再連續多次訪問網頁

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

兩個服務接收到的請求數量是差不多的,此時我們對第二個服務進行降級,為了測試明顯,這裡我們連續降兩次級,將其降到0.25,再連續調用,觀察結果

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

已將第二個服務提供者降級到0.25,此時再連續訪問

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

此時很明顯可以看到第二個服務接收的請求比第一個少很多,證明降級成功。

4、負載均衡

dubbo提供了三個基本的負載均衡策略,分別是 隨機訪問、輪詢、最少併發,從字面上也可以得知是什麼意思,在這裡我演示一下輪詢的負載均衡策略。在dubbo-admin中,選擇負載均衡功能,點擊新增,如下圖

"

一、Dubbo介紹

引用官方的一段介紹

Apache Dubbo (incubating) |ˈdʌbəʊ| is a high-performance, java based RPC framework open-sourced by Alibaba. As in many RPC systems, dubbo is based around the idea of defining a service, specifying the methods that can be called remotely with their parameters and return types. On the server side, the server implements this interface and runs a dubbo server to handle client calls. On the client side, the client has a stub that provides the same methods as the server.

Dubbo是阿里出的一個高性能的分佈式微服務框架,它的特點是性能高、界面友好、文檔齊全(特別是中文文檔),是很多中小型公司快速搭建微服務的首選技術。前段時間被阿里重新進行維護,並進入Apache孵化器。遷移到Apache後也推出了新的starter,簡單試用後感覺不錯,為此特地寫下這一系列筆記,用以記錄。(整個項目的源碼在最後一章,感興趣的童鞋可以下載自己搭建試試,也可以將其作為腳手架搭建你自己的微服務)

二、搭建註冊中心

在dubbo中,每一個服務都是分佈式的,消費者與提供者的關係並不是一對一的關係,而是一對多,並且服務提供者的實例位置是未知的,如果都由開發者使用靜態文件去維護這個關係顯示不合適的,一方面是徒增工作量,另一方面是靈活度不高,如果服務提供者更換了服務器地址,那麼需要重新配置等,所以目前比較推崇的方案是所有服務提供者均主動將自己的信息註冊到同個地方中,而消費者只要一律從這個地方取他需要的東西即可,這個地方就是所謂的註冊中心。目前dubbo可以選擇的註冊中心包括zookeeper、redis等,一般建議使用zookeeper,下面演示一下在windows中如何搭建zookeeper註冊中心。

1、下載zookeeper

直接在官網的鏡像站下 (https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/zookeeper-3.4.12.tar.gz)

2、解壓並配置zookeeper

為了演示,直接使用官方示例配置。把解壓出來的\\zookeeper-3.4.12\\conf\\zoo_sample.cfg 文件名改為zoo.cfg即可,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、運行zookeeper註冊中心

雙擊運行/zookeeper-3.4.12/bin/zkServer.cmd,出現以下窗口代表運行成功。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

三、搭建Dubbo Admin

在Dubbo中,一大殺器就是它的可視化監控界面,在這個界面中可以查看服務者、提供者的數量、狀態等,並對服務降級、容錯、屏蔽等提供了可視化操作。下面演示如何搭建Dubbo Admin。

1、下載源碼並解壓

點擊下面地址下載dubbo admin項目源碼 (https://codeload.github.com/apache/incubator-dubbo-ops/zip/master)

下載後解壓出來,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

2、打包

打開cmd,進入第一步解壓出來的dubbo-admin文件夾中,執行mvn clean package

(ps:要是提示未存在mvn命令,就把maven文件夾的bin目錄添加到系統環境變量PATH中)

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、配置dubbo admin

打開上面那步打出來的war包(\\incubator-dubbo-ops-master\\dubbo-admin\\target\\dubbo-admin-2.0.0.war),編輯WEB-INF文件夾中的dubbo.properties文件,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將紅框處的IP地址改為你的註冊中心的地址,由於我們的註冊中心是在本地運行的,故此處無需做修改。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

4、運行Dubbo Admin

將war包改名為ROOT.war後放到tomcat的webapp目錄中,然後運行tomcat。使用瀏覽器打開http://127.0.0.1:8080,提示輸入賬號密碼,賬號和密碼默認均為root,登陸後的界面如下:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

四、搭建API項目

由於Dubbo是採用RPC調用方式,這也是與Spring Cloud比較大的區別之一。在Spring Cloud中,服務通過HTTP接口提供給其它服務調用,對於調用者與被調用者來說,只要雙方保證滿足http接口的契約即可,但是在dubbo中,是嚴格要求調用接口的類路徑、參數等雙方一致。所以需要構建一個API項目,該項目裡面存放服務接口即公共實體,雙方依賴這個項目完成遠程調用。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
</project>

公共實體-People.java

package com.czh.dubbo.common.entity;
import java.io.Serializable;
public class People implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1415852192397895853L;
// 人員編號
private int id;
// 姓名
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "People [id=" + id + ", name=" + name + "]";
}
}

公共服務接口-PeopleService.java

package com.czh.dubbo.common.service;
import com.czh.dubbo.common.entity.People;
public interface PeopleService {
People getPeople(People people);
}

五、搭建服務提供者

服務提供者就是被消費者所調用的,它需要實現公共服務接口,並通過dubbo把自己的服務暴露出來。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

com.alibaba.boot是遷移過後出的一個最新的dubbo spring boot starter,也是目前官方推薦使用的。值得注意的是,該starter不包含註冊中心客戶端,需要自己配置。一般推薦使用zookeeper作為註冊中心,所以需要手動引入zkclient。

application.properties

#web服務端口,由於我們不需要使用web服務,所以將其設為隨機端口
server.port=-1
#dubbo服務端口,我們無需知道dubbo服務運行在哪個端口,故也將其設為隨機端口
dubbo.protocol.port = -1
#dubbo服務名稱
dubbo.application.name = dubbo-provider
#dubbo服務所在包路徑
dubbo.scan.basePackages = com.czh.dubbo.provider.service
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#設置服務的日誌輸出級別為debug級
logging.level.com.czh.dubbo.provider.service=debug

服務實現類PeopleServiceImpl

package com.czh.dubbo.provider.service;
import java.util.Random;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.dubbo.config.annotation.Service;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
//注意,這裡的service註解用的不是spring的註解,而是com.alibaba.dubbo.config.annotation.Service;
@Service
public class PeopleServiceImpl implements PeopleService{
private static final Logger logger = LoggerFactory.getLogger(PeopleServiceImpl.class);
/**
* 這個方法的作用是接收傳過來的People實體,將其ID賦為隨機數
*/
@Override
public People getPeople(People people) {
people.setId(new Random().nextInt(10000));
logger.debug("People:{},ID:{}",people.getName(),people.getId());
return people;
}
}

六、搭建服務消費者

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

application.properties

#web服務端口
server.port=80
#消費者名稱
dubbo.application.name=dubbo-consumer
#需要使用到提供者服務的包路徑
dubbo.scan.base-packages=com.czh.dubbo.consumer.controller
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181

控制器PeopleController

package com.czh.dubbo.consumer.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
@RestController
public class PeopleController {
@Reference
private PeopleService peopleService;
@GetMapping("/people/{name}")
public People getPeople(@PathVariable("name") String name) {
People people = new People();
people.setName(name);
return peopleService.getPeople(people);
}
}

至此,整個項目便搭建完畢,三個項目的項目結構如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

七、上線運行

1、打包運行

安裝API項目到本地maven倉庫

在dubbo-common項目的pom.xml文件上點擊右鍵,Run as - Maven install

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打包服務提供者與服務消費者

在這兩個項目的pom.xml文件執行以下操作:點擊右鍵,Run as - Maven build… 在彈出的選項框中Golas 填寫:clean package,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

點擊run,打包成功後如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將兩個項目的target文件夾中拿出打好的jar包放到某個文件夾下備用,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

使用java -jar 命令依次運行dubbo-provider 與dubbo-consumer,順序不能搞錯,並且得確保provider啟動完成後再啟動consumer,否則後期會出現空指針異常。

至此,我們總共啟動了四個服務,分別是zookeeper註冊中心、dubbo-admin、dubbo-provider、dubbo-consumer,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打開dubbo監控網頁檢查服務消費者和提供者是否已經註冊成功:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到,提供者與消費者已成功註冊到註冊中心

2、基本調用

使用瀏覽器訪問此地址http://127.0.0.1/people/test,觀察服務提供者的控制檯輸出內容

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

後臺控制檯已輸出日誌了,證明調用成功,那麼瀏覽器是否能夠拿到數據呢?

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到瀏覽器也拿到數據了,證明已經成功完成調用了。

3、容錯與屏蔽

容錯

顧名思義就是當服務提供者出現異常時,消費者是否能夠正常處理,在這裡,我們關閉掉服務提供者,再進行調用,觀察是否會報錯

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以觀察到前端報異常了。我們進入dubbo-admin在消費者中把服務容錯開啟,如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

再進行調用可以看到

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到此時調用後返回確實為空,證明容錯生效。

屏蔽

當對某個服務啟動屏蔽時,此時消費者調用該服務時均會返回空對象。首先我們需要確保提供者與消費者均已啟動,然後在消費者中對提供者進行屏蔽,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

再進行服務調用

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到此時調用後返回確實為空,證明屏蔽生效。

其實屏蔽與容錯還有更高級的玩法,最基本的屏蔽是返回空對象,我們甚至可以自定義返回內容。

進入動態配置,選擇新增

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

編輯紅框處的內容如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

再訪問網頁

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到確實屏蔽成功,並返回我們自定義的內容,注意,此時並未調用到提供者服務。

3、服務降級

為了測試服務降級,我們需要再啟動一個服務提供者

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到目前兩個服務提供者

然後我們再連續多次訪問網頁

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

兩個服務接收到的請求數量是差不多的,此時我們對第二個服務進行降級,為了測試明顯,這裡我們連續降兩次級,將其降到0.25,再連續調用,觀察結果

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

已將第二個服務提供者降級到0.25,此時再連續訪問

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

此時很明顯可以看到第二個服務接收的請求比第一個少很多,證明降級成功。

4、負載均衡

dubbo提供了三個基本的負載均衡策略,分別是 隨機訪問、輪詢、最少併發,從字面上也可以得知是什麼意思,在這裡我演示一下輪詢的負載均衡策略。在dubbo-admin中,選擇負載均衡功能,點擊新增,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

按下圖進行配置

"

一、Dubbo介紹

引用官方的一段介紹

Apache Dubbo (incubating) |ˈdʌbəʊ| is a high-performance, java based RPC framework open-sourced by Alibaba. As in many RPC systems, dubbo is based around the idea of defining a service, specifying the methods that can be called remotely with their parameters and return types. On the server side, the server implements this interface and runs a dubbo server to handle client calls. On the client side, the client has a stub that provides the same methods as the server.

Dubbo是阿里出的一個高性能的分佈式微服務框架,它的特點是性能高、界面友好、文檔齊全(特別是中文文檔),是很多中小型公司快速搭建微服務的首選技術。前段時間被阿里重新進行維護,並進入Apache孵化器。遷移到Apache後也推出了新的starter,簡單試用後感覺不錯,為此特地寫下這一系列筆記,用以記錄。(整個項目的源碼在最後一章,感興趣的童鞋可以下載自己搭建試試,也可以將其作為腳手架搭建你自己的微服務)

二、搭建註冊中心

在dubbo中,每一個服務都是分佈式的,消費者與提供者的關係並不是一對一的關係,而是一對多,並且服務提供者的實例位置是未知的,如果都由開發者使用靜態文件去維護這個關係顯示不合適的,一方面是徒增工作量,另一方面是靈活度不高,如果服務提供者更換了服務器地址,那麼需要重新配置等,所以目前比較推崇的方案是所有服務提供者均主動將自己的信息註冊到同個地方中,而消費者只要一律從這個地方取他需要的東西即可,這個地方就是所謂的註冊中心。目前dubbo可以選擇的註冊中心包括zookeeper、redis等,一般建議使用zookeeper,下面演示一下在windows中如何搭建zookeeper註冊中心。

1、下載zookeeper

直接在官網的鏡像站下 (https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/zookeeper-3.4.12.tar.gz)

2、解壓並配置zookeeper

為了演示,直接使用官方示例配置。把解壓出來的\\zookeeper-3.4.12\\conf\\zoo_sample.cfg 文件名改為zoo.cfg即可,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、運行zookeeper註冊中心

雙擊運行/zookeeper-3.4.12/bin/zkServer.cmd,出現以下窗口代表運行成功。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

三、搭建Dubbo Admin

在Dubbo中,一大殺器就是它的可視化監控界面,在這個界面中可以查看服務者、提供者的數量、狀態等,並對服務降級、容錯、屏蔽等提供了可視化操作。下面演示如何搭建Dubbo Admin。

1、下載源碼並解壓

點擊下面地址下載dubbo admin項目源碼 (https://codeload.github.com/apache/incubator-dubbo-ops/zip/master)

下載後解壓出來,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

2、打包

打開cmd,進入第一步解壓出來的dubbo-admin文件夾中,執行mvn clean package

(ps:要是提示未存在mvn命令,就把maven文件夾的bin目錄添加到系統環境變量PATH中)

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、配置dubbo admin

打開上面那步打出來的war包(\\incubator-dubbo-ops-master\\dubbo-admin\\target\\dubbo-admin-2.0.0.war),編輯WEB-INF文件夾中的dubbo.properties文件,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將紅框處的IP地址改為你的註冊中心的地址,由於我們的註冊中心是在本地運行的,故此處無需做修改。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

4、運行Dubbo Admin

將war包改名為ROOT.war後放到tomcat的webapp目錄中,然後運行tomcat。使用瀏覽器打開http://127.0.0.1:8080,提示輸入賬號密碼,賬號和密碼默認均為root,登陸後的界面如下:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

四、搭建API項目

由於Dubbo是採用RPC調用方式,這也是與Spring Cloud比較大的區別之一。在Spring Cloud中,服務通過HTTP接口提供給其它服務調用,對於調用者與被調用者來說,只要雙方保證滿足http接口的契約即可,但是在dubbo中,是嚴格要求調用接口的類路徑、參數等雙方一致。所以需要構建一個API項目,該項目裡面存放服務接口即公共實體,雙方依賴這個項目完成遠程調用。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
</project>

公共實體-People.java

package com.czh.dubbo.common.entity;
import java.io.Serializable;
public class People implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1415852192397895853L;
// 人員編號
private int id;
// 姓名
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "People [id=" + id + ", name=" + name + "]";
}
}

公共服務接口-PeopleService.java

package com.czh.dubbo.common.service;
import com.czh.dubbo.common.entity.People;
public interface PeopleService {
People getPeople(People people);
}

五、搭建服務提供者

服務提供者就是被消費者所調用的,它需要實現公共服務接口,並通過dubbo把自己的服務暴露出來。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

com.alibaba.boot是遷移過後出的一個最新的dubbo spring boot starter,也是目前官方推薦使用的。值得注意的是,該starter不包含註冊中心客戶端,需要自己配置。一般推薦使用zookeeper作為註冊中心,所以需要手動引入zkclient。

application.properties

#web服務端口,由於我們不需要使用web服務,所以將其設為隨機端口
server.port=-1
#dubbo服務端口,我們無需知道dubbo服務運行在哪個端口,故也將其設為隨機端口
dubbo.protocol.port = -1
#dubbo服務名稱
dubbo.application.name = dubbo-provider
#dubbo服務所在包路徑
dubbo.scan.basePackages = com.czh.dubbo.provider.service
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#設置服務的日誌輸出級別為debug級
logging.level.com.czh.dubbo.provider.service=debug

服務實現類PeopleServiceImpl

package com.czh.dubbo.provider.service;
import java.util.Random;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.dubbo.config.annotation.Service;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
//注意,這裡的service註解用的不是spring的註解,而是com.alibaba.dubbo.config.annotation.Service;
@Service
public class PeopleServiceImpl implements PeopleService{
private static final Logger logger = LoggerFactory.getLogger(PeopleServiceImpl.class);
/**
* 這個方法的作用是接收傳過來的People實體,將其ID賦為隨機數
*/
@Override
public People getPeople(People people) {
people.setId(new Random().nextInt(10000));
logger.debug("People:{},ID:{}",people.getName(),people.getId());
return people;
}
}

六、搭建服務消費者

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

application.properties

#web服務端口
server.port=80
#消費者名稱
dubbo.application.name=dubbo-consumer
#需要使用到提供者服務的包路徑
dubbo.scan.base-packages=com.czh.dubbo.consumer.controller
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181

控制器PeopleController

package com.czh.dubbo.consumer.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
@RestController
public class PeopleController {
@Reference
private PeopleService peopleService;
@GetMapping("/people/{name}")
public People getPeople(@PathVariable("name") String name) {
People people = new People();
people.setName(name);
return peopleService.getPeople(people);
}
}

至此,整個項目便搭建完畢,三個項目的項目結構如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

七、上線運行

1、打包運行

安裝API項目到本地maven倉庫

在dubbo-common項目的pom.xml文件上點擊右鍵,Run as - Maven install

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打包服務提供者與服務消費者

在這兩個項目的pom.xml文件執行以下操作:點擊右鍵,Run as - Maven build… 在彈出的選項框中Golas 填寫:clean package,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

點擊run,打包成功後如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將兩個項目的target文件夾中拿出打好的jar包放到某個文件夾下備用,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

使用java -jar 命令依次運行dubbo-provider 與dubbo-consumer,順序不能搞錯,並且得確保provider啟動完成後再啟動consumer,否則後期會出現空指針異常。

至此,我們總共啟動了四個服務,分別是zookeeper註冊中心、dubbo-admin、dubbo-provider、dubbo-consumer,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打開dubbo監控網頁檢查服務消費者和提供者是否已經註冊成功:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到,提供者與消費者已成功註冊到註冊中心

2、基本調用

使用瀏覽器訪問此地址http://127.0.0.1/people/test,觀察服務提供者的控制檯輸出內容

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

後臺控制檯已輸出日誌了,證明調用成功,那麼瀏覽器是否能夠拿到數據呢?

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到瀏覽器也拿到數據了,證明已經成功完成調用了。

3、容錯與屏蔽

容錯

顧名思義就是當服務提供者出現異常時,消費者是否能夠正常處理,在這裡,我們關閉掉服務提供者,再進行調用,觀察是否會報錯

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以觀察到前端報異常了。我們進入dubbo-admin在消費者中把服務容錯開啟,如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

再進行調用可以看到

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到此時調用後返回確實為空,證明容錯生效。

屏蔽

當對某個服務啟動屏蔽時,此時消費者調用該服務時均會返回空對象。首先我們需要確保提供者與消費者均已啟動,然後在消費者中對提供者進行屏蔽,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

再進行服務調用

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到此時調用後返回確實為空,證明屏蔽生效。

其實屏蔽與容錯還有更高級的玩法,最基本的屏蔽是返回空對象,我們甚至可以自定義返回內容。

進入動態配置,選擇新增

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

編輯紅框處的內容如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

再訪問網頁

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到確實屏蔽成功,並返回我們自定義的內容,注意,此時並未調用到提供者服務。

3、服務降級

為了測試服務降級,我們需要再啟動一個服務提供者

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到目前兩個服務提供者

然後我們再連續多次訪問網頁

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

兩個服務接收到的請求數量是差不多的,此時我們對第二個服務進行降級,為了測試明顯,這裡我們連續降兩次級,將其降到0.25,再連續調用,觀察結果

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

已將第二個服務提供者降級到0.25,此時再連續訪問

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

此時很明顯可以看到第二個服務接收的請求比第一個少很多,證明降級成功。

4、負載均衡

dubbo提供了三個基本的負載均衡策略,分別是 隨機訪問、輪詢、最少併發,從字面上也可以得知是什麼意思,在這裡我演示一下輪詢的負載均衡策略。在dubbo-admin中,選擇負載均衡功能,點擊新增,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

按下圖進行配置

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

老樣子,這次我們連續訪問網頁10次

"

一、Dubbo介紹

引用官方的一段介紹

Apache Dubbo (incubating) |ˈdʌbəʊ| is a high-performance, java based RPC framework open-sourced by Alibaba. As in many RPC systems, dubbo is based around the idea of defining a service, specifying the methods that can be called remotely with their parameters and return types. On the server side, the server implements this interface and runs a dubbo server to handle client calls. On the client side, the client has a stub that provides the same methods as the server.

Dubbo是阿里出的一個高性能的分佈式微服務框架,它的特點是性能高、界面友好、文檔齊全(特別是中文文檔),是很多中小型公司快速搭建微服務的首選技術。前段時間被阿里重新進行維護,並進入Apache孵化器。遷移到Apache後也推出了新的starter,簡單試用後感覺不錯,為此特地寫下這一系列筆記,用以記錄。(整個項目的源碼在最後一章,感興趣的童鞋可以下載自己搭建試試,也可以將其作為腳手架搭建你自己的微服務)

二、搭建註冊中心

在dubbo中,每一個服務都是分佈式的,消費者與提供者的關係並不是一對一的關係,而是一對多,並且服務提供者的實例位置是未知的,如果都由開發者使用靜態文件去維護這個關係顯示不合適的,一方面是徒增工作量,另一方面是靈活度不高,如果服務提供者更換了服務器地址,那麼需要重新配置等,所以目前比較推崇的方案是所有服務提供者均主動將自己的信息註冊到同個地方中,而消費者只要一律從這個地方取他需要的東西即可,這個地方就是所謂的註冊中心。目前dubbo可以選擇的註冊中心包括zookeeper、redis等,一般建議使用zookeeper,下面演示一下在windows中如何搭建zookeeper註冊中心。

1、下載zookeeper

直接在官網的鏡像站下 (https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/zookeeper-3.4.12.tar.gz)

2、解壓並配置zookeeper

為了演示,直接使用官方示例配置。把解壓出來的\\zookeeper-3.4.12\\conf\\zoo_sample.cfg 文件名改為zoo.cfg即可,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、運行zookeeper註冊中心

雙擊運行/zookeeper-3.4.12/bin/zkServer.cmd,出現以下窗口代表運行成功。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

三、搭建Dubbo Admin

在Dubbo中,一大殺器就是它的可視化監控界面,在這個界面中可以查看服務者、提供者的數量、狀態等,並對服務降級、容錯、屏蔽等提供了可視化操作。下面演示如何搭建Dubbo Admin。

1、下載源碼並解壓

點擊下面地址下載dubbo admin項目源碼 (https://codeload.github.com/apache/incubator-dubbo-ops/zip/master)

下載後解壓出來,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

2、打包

打開cmd,進入第一步解壓出來的dubbo-admin文件夾中,執行mvn clean package

(ps:要是提示未存在mvn命令,就把maven文件夾的bin目錄添加到系統環境變量PATH中)

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

3、配置dubbo admin

打開上面那步打出來的war包(\\incubator-dubbo-ops-master\\dubbo-admin\\target\\dubbo-admin-2.0.0.war),編輯WEB-INF文件夾中的dubbo.properties文件,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將紅框處的IP地址改為你的註冊中心的地址,由於我們的註冊中心是在本地運行的,故此處無需做修改。

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

4、運行Dubbo Admin

將war包改名為ROOT.war後放到tomcat的webapp目錄中,然後運行tomcat。使用瀏覽器打開http://127.0.0.1:8080,提示輸入賬號密碼,賬號和密碼默認均為root,登陸後的界面如下:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

四、搭建API項目

由於Dubbo是採用RPC調用方式,這也是與Spring Cloud比較大的區別之一。在Spring Cloud中,服務通過HTTP接口提供給其它服務調用,對於調用者與被調用者來說,只要雙方保證滿足http接口的契約即可,但是在dubbo中,是嚴格要求調用接口的類路徑、參數等雙方一致。所以需要構建一個API項目,該項目裡面存放服務接口即公共實體,雙方依賴這個項目完成遠程調用。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
</project>

公共實體-People.java

package com.czh.dubbo.common.entity;
import java.io.Serializable;
public class People implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1415852192397895853L;
// 人員編號
private int id;
// 姓名
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "People [id=" + id + ", name=" + name + "]";
}
}

公共服務接口-PeopleService.java

package com.czh.dubbo.common.service;
import com.czh.dubbo.common.entity.People;
public interface PeopleService {
People getPeople(People people);
}

五、搭建服務提供者

服務提供者就是被消費者所調用的,它需要實現公共服務接口,並通過dubbo把自己的服務暴露出來。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

com.alibaba.boot是遷移過後出的一個最新的dubbo spring boot starter,也是目前官方推薦使用的。值得注意的是,該starter不包含註冊中心客戶端,需要自己配置。一般推薦使用zookeeper作為註冊中心,所以需要手動引入zkclient。

application.properties

#web服務端口,由於我們不需要使用web服務,所以將其設為隨機端口
server.port=-1
#dubbo服務端口,我們無需知道dubbo服務運行在哪個端口,故也將其設為隨機端口
dubbo.protocol.port = -1
#dubbo服務名稱
dubbo.application.name = dubbo-provider
#dubbo服務所在包路徑
dubbo.scan.basePackages = com.czh.dubbo.provider.service
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#設置服務的日誌輸出級別為debug級
logging.level.com.czh.dubbo.provider.service=debug

服務實現類PeopleServiceImpl

package com.czh.dubbo.provider.service;
import java.util.Random;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.dubbo.config.annotation.Service;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
//注意,這裡的service註解用的不是spring的註解,而是com.alibaba.dubbo.config.annotation.Service;
@Service
public class PeopleServiceImpl implements PeopleService{
private static final Logger logger = LoggerFactory.getLogger(PeopleServiceImpl.class);
/**
* 這個方法的作用是接收傳過來的People實體,將其ID賦為隨機數
*/
@Override
public People getPeople(People people) {
people.setId(new Random().nextInt(10000));
logger.debug("People:{},ID:{}",people.getName(),people.getId());
return people;
}
}

六、搭建服務消費者

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.czh</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>com.czh.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

application.properties

#web服務端口
server.port=80
#消費者名稱
dubbo.application.name=dubbo-consumer
#需要使用到提供者服務的包路徑
dubbo.scan.base-packages=com.czh.dubbo.consumer.controller
#註冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181

控制器PeopleController

package com.czh.dubbo.consumer.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.czh.dubbo.common.entity.People;
import com.czh.dubbo.common.service.PeopleService;
@RestController
public class PeopleController {
@Reference
private PeopleService peopleService;
@GetMapping("/people/{name}")
public People getPeople(@PathVariable("name") String name) {
People people = new People();
people.setName(name);
return peopleService.getPeople(people);
}
}

至此,整個項目便搭建完畢,三個項目的項目結構如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

七、上線運行

1、打包運行

安裝API項目到本地maven倉庫

在dubbo-common項目的pom.xml文件上點擊右鍵,Run as - Maven install

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打包服務提供者與服務消費者

在這兩個項目的pom.xml文件執行以下操作:點擊右鍵,Run as - Maven build… 在彈出的選項框中Golas 填寫:clean package,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

點擊run,打包成功後如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

將兩個項目的target文件夾中拿出打好的jar包放到某個文件夾下備用,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

使用java -jar 命令依次運行dubbo-provider 與dubbo-consumer,順序不能搞錯,並且得確保provider啟動完成後再啟動consumer,否則後期會出現空指針異常。

至此,我們總共啟動了四個服務,分別是zookeeper註冊中心、dubbo-admin、dubbo-provider、dubbo-consumer,如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

打開dubbo監控網頁檢查服務消費者和提供者是否已經註冊成功:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到,提供者與消費者已成功註冊到註冊中心

2、基本調用

使用瀏覽器訪問此地址http://127.0.0.1/people/test,觀察服務提供者的控制檯輸出內容

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

後臺控制檯已輸出日誌了,證明調用成功,那麼瀏覽器是否能夠拿到數據呢?

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到瀏覽器也拿到數據了,證明已經成功完成調用了。

3、容錯與屏蔽

容錯

顧名思義就是當服務提供者出現異常時,消費者是否能夠正常處理,在這裡,我們關閉掉服務提供者,再進行調用,觀察是否會報錯

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以觀察到前端報異常了。我們進入dubbo-admin在消費者中把服務容錯開啟,如下

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

再進行調用可以看到

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到此時調用後返回確實為空,證明容錯生效。

屏蔽

當對某個服務啟動屏蔽時,此時消費者調用該服務時均會返回空對象。首先我們需要確保提供者與消費者均已啟動,然後在消費者中對提供者進行屏蔽,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

再進行服務調用

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到此時調用後返回確實為空,證明屏蔽生效。

其實屏蔽與容錯還有更高級的玩法,最基本的屏蔽是返回空對象,我們甚至可以自定義返回內容。

進入動態配置,選擇新增

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

編輯紅框處的內容如下圖:

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

再訪問網頁

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到確實屏蔽成功,並返回我們自定義的內容,注意,此時並未調用到提供者服務。

3、服務降級

為了測試服務降級,我們需要再啟動一個服務提供者

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到目前兩個服務提供者

然後我們再連續多次訪問網頁

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

兩個服務接收到的請求數量是差不多的,此時我們對第二個服務進行降級,為了測試明顯,這裡我們連續降兩次級,將其降到0.25,再連續調用,觀察結果

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

已將第二個服務提供者降級到0.25,此時再連續訪問

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

此時很明顯可以看到第二個服務接收的請求比第一個少很多,證明降級成功。

4、負載均衡

dubbo提供了三個基本的負載均衡策略,分別是 隨機訪問、輪詢、最少併發,從字面上也可以得知是什麼意思,在這裡我演示一下輪詢的負載均衡策略。在dubbo-admin中,選擇負載均衡功能,點擊新增,如下圖

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

按下圖進行配置

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

老樣子,這次我們連續訪問網頁10次

十分鐘搭建不了,你砍我,使用SpringBoot+Dubbo搭建微服務筆記

可以看到兩個服務剛好各均分了五個請求,負載均衡成功!

八、寫在最後

相比於spring cloud,個人認為dubbo提供的功能相對簡單,但每個功能又很實用,且使用起來十分方便(因為有可視化的web界面操作),更適合中小型公司進行微服務搭建。

附錄-源碼分享

(轉發+關注 留下你的郵箱。發送源碼給你)一定要先關注啊。老鐵!!!

"

相關推薦

推薦中...