10分鐘搞定Spring Boot + Dubbo + Dubbo admin UI一整套分布式解決方案

10分鐘搞定Spring Boot + Dubbo + Dubbo admin UI一整套分布式解決方案

本機(jī)環(huán)境

JDK: 1.8.0_161

Spring Boot: 2.1.3.RELEASE

Zookeeper: 3.4.11

org.apache.dubbo: 2.7.0

Node: v8.4.0

Npm: 5.3.0

開(kāi)始搭建

Dubbo-Api

提供給外部使用

新建一個(gè)Dubbo-api 供consumer 和 provider使用

僅僅包含一個(gè)HelloService

public interface HelloService {
    String sayHello(String name);
}

Dubbo-Provider

pom依賴

 <properties>
        <java.version>1.8</java.version>
        <spring-boot.version>2.1.3.RELEASE</spring-boot.version>
        <dubbo.version>2.7.0</dubbo.version>
 </properties>
    
 <dependencyManagement>
        <dependencies>
            <!-- Spring Boot -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- Apache Dubbo  -->
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-dependencies-bom</artifactId>
                <version>${dubbo.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo</artifactId>
                <version>${dubbo.version}</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.springframework</groupId>
                        <artifactId>spring</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>javax.servlet</groupId>
                        <artifactId>servlet-api</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>log4j</groupId>
                        <artifactId>log4j</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        
        <!-- Dubbo Spring Boot Starter -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
        </dependency>

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

        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
        </dependency>

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

        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
        </dependency>

    </dependencies>

這些依賴都缺一不可,接下來(lái)就實(shí)現(xiàn)dubbo-api提供的Service方法即可

import com.skrein.dubbo.api.service.HelloService;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

// 指定dubbo-provider的版本
@Service(version = "${demo.service.version}")
@Component
public class HelloServiceImpl implements HelloService {

    @Value("${server.port}")
    String port;

    @Value("${spring.application.name}")
    String appName;

    @Override
    public String sayHello(String name) {
        return appName + ":" + port + "\n hello " + name;
    }
}

@Service: 這個(gè)注解是org.apache.dubbo提供的

然后BootApplication設(shè)置@EnableDubbo 即可完成一個(gè)最簡(jiǎn)單的Provider

@SpringBootApplication
@EnableDubbo
public class BootApplication {

    public static void main(String[] args) {
        SpringApplication.run(BootApplication.class, args);
    }

}

配置文件配置通過(guò)Zookeeper作為我們的注冊(cè)中心:

application.yml

dubbo:
  registry:
    address: zookeeper://127.0.0.1:2181 # 注冊(cè)中心地址
  protocol:
    port: -1 # 隨機(jī)端口號(hào),我們等會(huì)會(huì)通過(guò)不同端口起2臺(tái)Provider,所以使用隨機(jī)端口
    name: dubbo
  metadata-report:
    address: zookeeper://127.0.0.1:2181 # dubbo-admin需要這個(gè)配置上報(bào)meta信息
demo:
  service:
    version: 0.0.1

spring:
  application:
    name: dubbo-provider
  main:
    allow-bean-definition-overriding: true # 不設(shè)置會(huì)與Spring Boot沖突

然后我們通過(guò)命令行啟動(dòng)

$ java -jar target/dubbo-provider-0.0.1.jar --server.port=9000
$ java -jar target/dubbo-provider-0.0.1.jar --server.port=9000

Dubbo-Consumer

pom配置同Dubbo-provider, Dubbo-Consumer這里作為一個(gè)Web服務(wù)

@RestController
public class HelloController {

    @Reference(version = "${demo.service.version}")
    private HelloService helloService;

    @GetMapping("/hello/{name}")
    public String hello(@PathVariable(name = "name") String name) {
        return helloService.sayHello(name);
    }
}

啟動(dòng)類加上@EnableDubbo即可

application.yml:

dubbo:
  registry:
    address: zookeeper://127.0.0.1:2181 # Zookeeper注冊(cè)中心地址
  protocol:
    port: -1 # 隨機(jī)端口
    name: dubbo # dubbo協(xié)議名字


spring:
  main:
    allow-bean-definition-overriding: true # 不設(shè)置會(huì)與Spring Boot沖突
  application:
    name: dubbo-consumer
demo:
  service:
    version: 0.0.1 # 消費(fèi)者版本與生產(chǎn)者版本一致

spring.main.allow-bean-definition-overriding=true: Spring Boot 2.7.0 Environment Beans conflict in Spring Boot

命令行啟動(dòng):

$ java -jar target/dubbo-consumer-0.0.1.jar

啟動(dòng)之后如下:

dubbo啟動(dòng)圖

配置Dubbo-admin Dubbo-admin-ui

dubbo-admin-server

官網(wǎng)地址 Dubb-admin-UI

把項(xiàng)目下載下來(lái)馁害,使用IDEA打開(kāi)

Dubbo-admin-ui項(xiàng)目結(jié)構(gòu)

首先啟動(dòng)dubbo-admin-server,注意這里的端口號(hào)预吆,可能會(huì)與dubbo-consumer沖突,我們這里修改

dubbo-admin-server: 把端口號(hào)修改為8888

--server.port=8888

然后啟動(dòng)就行了。

dubbo-admin-ui

前端使用Vue,所以需要Node環(huán)境

推薦一個(gè)我常用的node管理: NVM

NVM-windows: https://github.com/coreybutler/nvm-windows

安裝完畢

$ nvm install 8.4.0
$ nvm use 8.4.0

nvm 安裝node如下:

image

然后切換到dubbo-admin-ui這個(gè)目錄下:

dubbo-admin-ui directory

執(zhí)行 npm install

$ npm install

我本機(jī)已經(jīng)執(zhí)行過(guò),沒(méi)有執(zhí)行過(guò)的等待安裝:

cnpm install

你們還記得赦役,admin-server的端口號(hào)為 8888 ,因此我們需要把dubbo-admin-ui連接server的端口號(hào)也要修改(默認(rèn)是8080)

修改 config/index.js

modify port

然后啟動(dòng)dubbo-admin-ui:

$ cnpm run dev
run success

訪問(wèn) http://localhost:8081

dubbo-admin-ui index

可以看到我們的服務(wù)已經(jīng)被admin監(jiān)控了想暗。

點(diǎn)擊詳情,也能看到我們的2個(gè)provider也是在監(jiān)控當(dāng)中的:

image

代碼已經(jīng)上傳至我的github,歡迎star,后續(xù)會(huì)持續(xù)更新妇汗,為你帶來(lái)分布式,高并發(fā)等等詳細(xì)例子说莫。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末杨箭,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子储狭,更是在濱河造成了極大的恐慌互婿,老刑警劉巖捣郊,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異慈参,居然都是意外死亡呛牲,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)驮配,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)娘扩,“玉大人,你說(shuō)我怎么就攤上這事壮锻∷雠裕” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵猜绣,是天一觀的道長(zhǎng)灰殴。 經(jīng)常有香客問(wèn)我,道長(zhǎng)掰邢,這世上最難降的妖魔是什么牺陶? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮尸变,結(jié)果婚禮上义图,老公的妹妹穿的比我還像新娘。我一直安慰自己召烂,他們只是感情好碱工,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著奏夫,像睡著了一般怕篷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上酗昼,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天廊谓,我揣著相機(jī)與錄音,去河邊找鬼麻削。 笑死蒸痹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的呛哟。 我是一名探鬼主播叠荠,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼扫责!你這毒婦竟也來(lái)了榛鼎?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎者娱,沒(méi)想到半個(gè)月后抡笼,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡黄鳍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年推姻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片际起。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拾碌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出街望,到底是詐尸還是另有隱情,我是刑警寧澤弟跑,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布灾前,位于F島的核電站,受9級(jí)特大地震影響孟辑,放射性物質(zhì)發(fā)生泄漏哎甲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一饲嗽、第九天 我趴在偏房一處隱蔽的房頂上張望炭玫。 院中可真熱鬧,春花似錦貌虾、人聲如沸吞加。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)衔憨。三九已至,卻和暖如春袄膏,著一層夾襖步出監(jiān)牢的瞬間践图,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工沉馆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留码党,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓斥黑,卻偏偏與公主長(zhǎng)得像揖盘,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子心赶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容