目錄:vue
開始實戰以前,咱們先來簡單的瞭解一下這樣幾個概念:Dubbo、RPC、分佈式、因爲本文的目的是帶你們使用SpringBoot+Dubbo 搭建一個簡單的分佈式服務,因此這些概念我只會簡單給你們普及一下,不會作深刻探究。java
分佈式或者說 SOA 分佈式重要的就是面向服務,說簡單的分佈式就是咱們把整個系統拆分紅不一樣的服務而後將這些服務放在不一樣的服務器上減輕單體服務的壓力提升併發量和性能。好比電商系統能夠簡單地拆分紅訂單系統、商品系統、登陸系統等等。git
咱們可使用 Dubbo做爲分佈式系統的橋樑,那麼什麼是 Dubbo 呢?github
Apache Dubbo (incubating) |ˈdʌbəʊ| 是一款高性能、輕量級的開源Java RPC 框架,它提供了三大核心能力:面向接口的遠程方法調用,智能容錯和負載均衡,以及服務自動註冊和發現。簡單來講 Dubbo 是一個分佈式服務框架,致力於提供高性能和透明化的RPC遠程服務調用方案,以及SOA服務治理方案。web
Dubbo 目前已經有接近 23k 的 Star ,Dubbo的Github 地址:github.com/apache/incu… 更是憑藉其超高人氣僅次於 vue.js 和 ECharts 得到第三名的好成績。算法
Dubbo 是由阿里開源,後來加入了 Apache 。正式因爲 Dubbo 的出現,才使得愈來愈多的公司開始使用以及接受分佈式架構。spring
下面咱們簡單地來看一下 Dubbo 的架構,加深對 Dubbo 的理解。shell
下面咱們再來看看 Dubbo 的架構,咱們後面會使用 zookeeper 做爲註冊中心,這也是 Dubbo 官方推薦的一種方式。apache
上述節點簡單說明:vim
調用關係說明:
咱們在講 Dubbo 的時候提到了 Dubbo 其實是一款 RPC 框架,那麼RPC 到底是什麼呢?相信看了下面我對 RPC 的介紹你就明白了!
RPC(Remote Procedure Call)—遠程過程調用,它是一種經過網絡從遠程計算機程序上請求服務,而不須要了解底層網絡技術的協議。好比兩個不一樣的服務A,B部署在兩臺不一樣的機器上,那麼服務 A 若是想要調用服務 B 中的某個方法該怎麼辦呢?使用 HTTP請求 固然能夠,可是可能會比較慢並且一些優化作的並很差。 RPC 的出現就是爲了解決這個問題。
若是你要開發分佈式程序,你也能夠直接基於 HTTP 接口進行通訊,可是爲何要用 Dubbo呢?
我以爲主要能夠從 Dubbo 提供的下面四點特性來講爲何要用 Dubbo:
我使用的是 CentOS 7.4 阿里雲服務器,注意:若是你也一樣阿里雲服務器必須配置一個安全組,否則你的應用程序會沒法訪問你的 zookeeper 服務器,這一點我在後面也提到了。
經過 mirror.bit.edu.cn/apache/zook… 這個連接下載,而後上傳到Linux上。(能夠說那個 Xhell 附帶的文件傳輸功能)
或者直接在Linux中使用 wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.12/zookeeper-3.4.12.tar.gz
命令下載(版本號 3.4.12 是我寫這篇文章的時候最新的穩定版本,各位能夠根據實際狀況修改)
tar -zxvf zookeeper-3.4.12-alpha.tar.gz
複製代碼
解壓完畢以後修改一下解壓以後所得的文件夾名
mv zookeeper-3.4.12 zookeeper
複製代碼
刪除 zookeeper 安裝包
rm -rf zookeeper-3.4.12.tar.gz
複製代碼
mkdir data
複製代碼
進入 data 文件夾 而後執行pwd
命令,複製所得的當前目錄位置(就是我用紅色圈出來的文字)
cp zoo_sample.cfg zoo.cfg
複製代碼
使用 vim zoo.cfg
命令修改配置文件
vim 文件------>進入文件----->命令模式------>按i進入編輯模式----->編輯文件 ------->按Esc進入底行模式----->輸入:wq/q! (輸入wq表明寫入內容並退出,即保存;輸入q!表明強制退出不保存。)
修改配置文件中的 data 屬性:
dataDir=/usr/local/zookeeper/data
複製代碼
進入 /zookeeper/bin 目錄而後執行下面的命令
./zkServer.sh start
複製代碼
執行 ./zkServer.sh status
查看當前 zookeeper 狀態。
或者運行 netstat -lntup
命令查看網絡狀態,能夠看到 zookeeper 的端口號 2181 已經被佔用
注意沒有關閉防火牆可能出現的問題!!!
若是你使用的阿里雲服務器注意配置相關安全組:
在開始實戰以前提個建議:儘可能新建一個文件夾,而後後面將接口項目、服務提供者以及服務消費者都放在這個文件夾。
主要分爲下面幾步:
項目結構:
dubbo-interface 後面被打成 jar 包,它的做用只是提供接口。
File->New->Module... ,而後選擇 Maven類型的項目,其餘的按照提示一步一步走就好。
package top.snailclimb.service;
public interface HelloService {
public String sayHello(String name);
}
複製代碼
點擊右邊的 Maven Projects 而後選擇 install ,這樣 jar 寶就打好了。
主要分爲下面幾步:
項目結構:
建立一個 SpringBoot 項目,注意勾選上 web 模塊。不會建立的話,能夠查看下面這篇文章:,能夠說很詳細了。
須要引入 dubbo 、zookeeper以及接口的相關依賴 jar 包。注意將本項目和 dubbo-interface 項目的 dependency 依賴的 groupId 和 artifactId 改爲本身的。dubbo 整合spring boot 的 jar 包在這裏找dubbo-spring-boot-starter。zookeeper 的 jar包在 Maven 倉庫 搜索 zkclient 便可找到。
<dependency>
<groupId>top.snailclimb</groupId>
<artifactId>dubbo-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--引入dubbo的依賴-->
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<!-- 引入zookeeper的依賴 -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
複製代碼
配置很簡單,這主要得益於 springboot 整合 dubbo 專屬的@EnableDubboConfiguration
註解提供的 Dubbo 自動配置。
# 配置端口
server.port=8333
spring.dubbo.application.name=dubbo-provider
spring.dubbo.application.registry=zookeeper://ip地址:2181
複製代碼
注意: @Service
註解使用的時 Dubbo 提供的而不是 Spring 提供的。另外,加了Dubbo 提供的 @Service
註解以後還須要加入
package top.snailclimb.service.impl;
import com.alibaba.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
import top.snailclimb.service.HelloService;
@Component
@Service
public class HelloServiceImpl implements HelloService {
@Override
public String sayHello(String name) {
return "Hello " + name;
}
}
複製代碼
注意:不要忘記加上 @EnableDubboConfiguration
註解開啓Dubbo 的自動配置。
package top.snailclimb;
import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
// 開啓dubbo的自動配置
@EnableDubboConfiguration
public class DubboProviderApplication {
public static void main(String[] args) {
SpringApplication.run(DubboProviderApplication.class, args);
}
}
複製代碼
主要分爲下面幾步:
項目結構:
第1,2,3 步和服務提供者的同樣,這裏直接從第 4 步開始。
package top.snailclimb.dubboconsumer;
import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import top.snailclimb.service.HelloService;
@RestController
public class HelloController {
@Reference
private HelloService helloService;
@RequestMapping("/hello")
public String hello() {
String hello = helloService.sayHello("world");
System.out.println(helloService.sayHello("SnailClimb"));
return hello;
}
}
複製代碼
package top.snailclimb.dubboconsumer;
import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableDubboConfiguration
public class DubboConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(DubboConsumerApplication.class, args);
}
}
複製代碼
瀏覽器訪問 http://localhost:8330/hello 頁面返回 Hello world,控制檯輸出 Hello SnailClimb,和預期一直,使用SpringBoot+Dubbo 搭建第一個簡單的分佈式服務實驗成功!
ThoughtWorks准入職Java工程師。專一Java知識分享!開源 Java 學習指南——JavaGuide(12k+ Star)的做者。公衆號多篇文章被各大技術社區轉載。公衆號後臺回覆關鍵字「1」能夠領取一份我精選的Java資源哦!