友情提醒:本文可能是你看過的
最啰嗦、最無聊最詳細的一篇專案搭建文章
?????如你對本文所涉及的技識訓礎有較大自信,建議從專案搭載開始閱讀
同時本文主要是進行簡單的整合,注重的邏輯思維的梳理,而沒有復雜的編碼案例,僅適合入門引導,如你不是初學者,不建議你進行閱讀
誰適合閱讀本文?
1、具有Java、Spring、Maven、springboot較好的基礎(如果有一個技術一看完全不知道是什么,建議關掉本文/點擊下面鏈接,去先學習完相關技術再來閱讀本文)
??Java教程
??Spring教程
??Maven教程
??SpringBoot教程
2、對dubbo、zookeeper有一個基本的認識
??Dubbo 2.x 官方檔案
??Zookeeper教程
一、技術介紹與環境準備
1、SpringBoot是什么?
Spring Boot 是 Pivotal 團隊在 Spring 的基礎上提供的一套全新的開源框架,其目的是為了簡化 Spring 應用的搭建和開發程序,Spring Boot 去除了大量的 XML 組態檔,簡化了復雜的依賴管理,
Spring Boot 具有 Spring 一切優秀特性,Spring 能做的事,Spring Boot 都可以做,而且使用更加簡單,功能更加豐富,性能更加穩定而健壯,隨著近些年來微服務技術的流行,Spring Boot 也成了時下炙手可熱的技術,
Spring Boot 集成了大量常用的第三方庫配置,Spring Boot 應用中這些第三方庫幾乎可以是零配置的開箱即用(out-of-the-box),大部分的 Spring Boot 應用都只需要非常少量的配置代碼(基于 Java 的配置),開發者能夠更加專注于業務邏輯,
2、什么是dubbo?
Dubbo(讀音[?d?b??])是阿里巴巴公司開源的一個高性能優秀的服務框架,使得應用可通過高性能的 RPC 實作服務的輸出和輸入功能,可以和Spring框架無縫集成,
Dubbo是一款高性能、輕量級的開源Java RPC框架,它提供了三大核心能力:
?(1)、面向介面的遠程方法呼叫
?(2)、智能容錯和負載均衡
?(3)、服務自動注冊和發現
2018 年和當當的Dubbox 進行了合并,進入Apache 范訓器,在 2019 貢獻給 Apache 成為頂級專案,
推薦閱讀:Dubbo介紹的一片好文(來自簡書)
注:本文無需安裝dubbo-admin客戶端,網上的文章很亂很雜,別看暈了
3、為什么要用dubbo
Dubbo的誕生和SOA分布式架構的流行有著莫大的關系,SOA 面向服務的架構(Service Oriented Architecture),也就是把工程按照業務邏輯拆分成服務層和表現層,服務層中包含業務邏輯,只需要對外提供服務即可,表現層只需要處理和頁面的互動,業務邏輯都是呼叫服務層的服務來實作,
SOA架構中有兩個主要角色:服務提供者(Provider)和服務使用者(Consumer)
隨著微服務的進一步發展,服務越來越多,服務之間的呼叫和依賴關系也越來越復雜,誕生了面向服務的架構體系(SOA),
也因此衍生出了一系列相應的技術,如對服務提供、服務呼叫、連接處理、通信協議、序列化方式、服務發現、服務路由、日志輸出等行為進行封裝的服務框架,
就這樣為分布式系統的服務治理框架就出現了,Dubbo也就這樣產生了.
下圖是Dubbo所解決的需求,以及每一個部分的“分工”

在大規模服務化之前,應用可能只是通過 RMI 或 Hessian 等工具,簡單的暴露和參考遠程服務,通過配置服務的URL地址進行呼叫,通過 F5 等硬體進行負載均衡,
當服務越來越多時,服務 URL 配置管理變得非常困難,F5 硬體負載均衡器的單點壓力也越來越大, 此時需要一個服務注冊中心,動態地注冊和發現服務,使服務的位置透明,并通過在消費方獲取服務提供方地址串列,實作軟負載均衡和 Failover,降低對 F5 硬體負載均衡器的依賴,也能減少部分成本,
當進一步發展,服務間依賴關系變得錯蹤復雜,甚至分不清哪個應用要在哪個應用之前啟動,架構師都不能完整的描述應用的架構關系, 這時,需要自影片出應用間的依賴關系圖,以幫助架構師理清關系,
接著,服務的呼叫量越來越大,服務的容量問題就暴露出來,這個服務需要多少機器支撐?什么時候該加機器? 為了解決這些問題,第一步,要將服務現在每天的呼叫量,回應時間,都統計出來,作為容量規劃的參考指標,其次,要可以動態調整權重,在線上,將某臺機器的權重一直加大,并在加大的程序中記錄回應時間的變化,直到回應時間到達閾值,記錄此時的訪問量,再以此訪問量乘以機器數反推總容量,
以上是 Dubbo 最基本的幾個需求,
下圖是Dubbo的框架架構

節點角色說明
| 節點 | 角色說明 |
|---|---|
| Provider | 暴露服務的服務提供方 |
| Consumer | 呼叫遠程服務的服務消費方 |
| Registry | 服務注冊與發現的注冊中心 |
| Monitor | 統計服務的呼叫次數和呼叫時間的監控中心 |
| Container | 服務運行容器 |
呼叫關系說明
0.?服務容器負責啟動,加載,運行服務提供者,
1.?服務提供者在啟動時,向注冊中心注冊自己提供的服務,
2.?服務消費者在啟動時,向注冊中心訂閱自己所需的服務,
3.?注冊中心回傳服務提供者地址串列給消費者,如果有變更,注冊中心將基于長連接推送變更資料給消費者,
4.?服務消費者,從提供者地址串列中,基于軟負載均衡演算法,選一臺提供者進行呼叫,如果呼叫失敗,再選另一臺呼叫,
5.?服務消費者和提供者,在記憶體中累計呼叫次數和呼叫時間,定時每分鐘發送一次統計資料到監控中心,
4、zookeeper的簡單介紹
ZooKeeper 是 Apache 軟體基金會的一個軟體專案,它為大型分布式計算提供開源的分布式配置服務、同步服務和命名注冊,
ZooKeeper 的架構通過冗余服務實作高可用性,
Zookeeper 的設計目標是將那些復雜且容易出錯的分布式一致性服務封裝起來,構成一個高效可靠的原語集,并以一系列簡單易用的介面提供給用戶使用,
一個典型的分布式資料一致性的解決方案,分布式應用程式可以基于它實作諸如資料發布/訂閱、負載均衡、命名服務、分布式協調/通知、集群管理、Master 選舉、分布式鎖和分布式佇列等功能,
5、zookeeper的安裝
因篇幅的原因,對于zookeeper的安裝不再贅述,如果未安裝zookeeper的話,可參考以下鏈接進行安裝,
Zookeeper的安裝與配置
二、 專案搭建(SpringBoot+Dubbo2.78+zookeeper3.4.14)
下面正式進入本文的正文:專案的搭建
1、專案結構

本專案主要由三個模塊構成:
dubbo-interface:介面和模型的提供者,負責提供介面和模型
dubbo-provider:服務的提供者,負責在注冊中心(zookeeper)進行注冊,并對介面進行實作,提供自己的服務
dubbo-consumer:服務的消費者,負責在注冊中心(zookeeper)進行訂閱,在注冊中心訂閱自己所需要的服務
2、dubbo-interface的實作
??專案結構

???dubbo-interface專案是一個非常簡單的Maven工程,只是提供一個HelloService的介面而已
??實作步驟
??? 1. 創建一個Maven工程
??? 2. 創建HelloService介面
??? 3. 對dubbo-interface進行打包并放置倉庫,以便當做依賴使用
??具體實作程序
??? 1. 創建一個Maven工程
??? 2. 創建HelloService介面
??? ?創建一個HelloService介面檔案,然后寫一個sayHello介面方法,
package com.example.service;
public interface HelloService {
public String sayHello(String name);
}
??? 3. 對dubbo-interface進行打包并放置倉庫,以便當做依賴使用
????對Maven工程進行打包是在日常學習/作業編碼中經常面對的操作,不會打包,閱讀下面鏈接
????Idea打包Maven工程
maven常用打包命令
1、mvn compile 編譯,將Java 源程式編譯成 class 位元組碼檔案,
2、mvn test 測驗,并生成測驗報告
3、mvn clean 將以前編譯得到的舊的 class 位元組碼檔案洗掉
4、mvn pakage 打包,動態 web工程打 war包,Java工程打 jar 包,
5、mvn install 將專案生成 jar 包放在倉庫中,以便別的模塊呼叫
6、mvn clean install -Dmaven.test.skip=true 拋棄測驗用例打包
對dubbo-interface工程執行intall打包存放倉庫,以便dubbo-provider模塊和dubbo-consumer模塊進行依賴引入使用,

至此,dubbo-interface就已經完成了,
dubbo-interface模塊,主要放業務介面的定義,它是服務消費者模塊和服務提供者模塊的公共依賴模塊,
3、dubbo-provider的實作
??專案結構

???dubbo-provider工程是一個SpringBoot工程,主要是實作dubbo-interface所提供的介面,然后在注冊中心(Zookeeper)注冊服務
??實作步驟
??? 1. 創建一個SpringBoot工程
??? 2. 編輯pom.xml檔案,添加專案依賴
??? 3. 編輯application.properties檔案,添加配置資訊
??? 4. 創建HelloServiceImpl類,實作HelloService介面
??? 5. 修改啟動器,實作dubbo自動配置和包的掃描
??具體實作程序
??? 1. 創建一個SpringBoot工程

??? 2. 編輯pom.xml檔案,添加專案依賴
?????創建完dubbo-provider工程后,我們顯示需要做的是編輯pom.xml檔案匯入專案需要的依賴
?????我們需要在pom.xml檔案中加入三個依賴:介面依賴、dubbo的依賴、zookeeper的依賴
<!--引入dubbo-interface介面依賴-->
<dependency>
<groupId>org.example</groupId>
<artifactId>dubbo-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--引入dubbo的依賴-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.8</version>
</dependency>
<!-- 引入zookeeper的依賴 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
在引入依賴時需要注意的幾個點是:dubbo版本在2.7.8之前的依賴(dubbo-spring-boot-starter)來自于com.alibaba.spring.boot,而dubbo版本在2.7.8之后(包含dubbo2.7.8)的依賴來自于org.apache.dubbo,引入時需要注意自己的dubbo版本;然后引入zookeeper的依賴時,可以匯入zkclient,也可以匯入curator-recipes和curator-framework,可以根據自己的需求添加,值得注意的是版本號要注意自己zookeeper版本調整,不然容易報錯,無法鏈接zookeeper注冊中心,
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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<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>
<dependency>
<groupId>org.example</groupId>
<artifactId>dubbo-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--引入dubbo的依賴-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.8</version>
</dependency>
<!-- 引入zookeeper的依賴 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
??? 3. 編輯application.properties檔案,添加配置資訊
???? 完成pom檔案的配置之后,接著配置dubbo和zookeeper的一些基礎配置
???? 我們需要在application.properties檔案配置服務埠、dubbo服務的id和name屬性以及zookeeper的注冊地址
# 配置埠
server.port=8088
#服務id
dubbo.application.id=dubbo-provider
#服務name
dubbo.application.name=dubbo-provider
#注冊中心的ip地址,本專案使用的是本地注冊中心,如使用的虛擬機或者服務器注冊中心,請自行修改
dubbo.registry.address=zookeeper://127.0.0.1:2181
???? 本教程關于組態檔的編輯使用的是application.properties檔案,如使用application.yaml檔案進行配置,請自行進行編輯
??? 4. 創建HelloServiceImpl類,實作HelloService介面
????完成專案的基礎配置后:實作服務,創建HelloServiceImpl類,實作HelloService介面
package com.example.dubboprovider.service.impl;
import com.example.service.HelloService;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.stereotype.Component;
@Component //標注一個類為Spring容器的Bean
@DubboService//service服務層(注入dao)
public class HelloServiceImpl implements HelloService {
@Override
public String sayHello(String name) {
return "Hello "+name;
}
}
HelloServiceImpl檔案沒有什么需要解釋的,就是DubboService注解需要注意一下,Dubbo版本在2.7.8及其以后版本,要將Service注解改為DubboService注解,不然會無法正常創建bean物件,
??? 5. 修改啟動器,實作dubbo自動配置和包的掃描
package com.example.dubboprovider;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.PropertySource;
@SpringBootApplication//SpringBoot啟動器注解
@EnableDubbo(scanBasePackages = "com.example.dubboprovider")//dubbo自動注冊
@PropertySource("classpath:/application.properties")//掃描組態檔地址
public class DubboProviderApplication {
public static void main(String[] args) {
SpringApplication.run(DubboProviderApplication.class, args);
}
}
??啟動專案
????其實SpringBoot工程啟動是非常容易的,只需要運行啟動器,
????注:記得啟動zookeeper!記得啟動zookeeper!記得啟動zookeeper!
????運行成功會出現下面的日志

??注冊中心驗證
????服務提供者成功啟動后可以到zookeeper注冊中心進行驗證,驗證方式如圖所示

同時推薦一個zookeeper可視化軟體—prettyZoo
github的地址:prettyZoo
如果懶得上github下載,也可以用下面的鏈接進行下載
*欠兩天 *
4、dubbo-consumer的實作
整個dubbo-consumer的實作和dubbo-provider的實作有著很多的相似之處,后面的實作就不再有過多的語言贅述
??專案結構

??實作步驟
??? 1. 創建一個SpringBoot工程
??? 2. 編輯pom.xml檔案,添加專案依賴
??? 3. 編輯application.properties檔案,添加配置資訊
??? 4. 創建HelloController類,訂閱hello服務
??? 5. 修改啟動器,實作dubbo自動配置和包的掃描
??具體實作程序
??? 1. 創建一個SpringBoot工程

??? 2. 編輯pom.xml檔案,添加專案依賴
<dependency>
<groupId>org.example</groupId>
<artifactId>dubbo-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--引入dubbo的依賴-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.8</version>
</dependency>
<!-- 引入zookeeper的依賴 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
完整的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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<properties>
<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-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.example</groupId>
<artifactId>dubbo-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--引入dubbo的依賴-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.8</version>
</dependency>
<!-- 引入zookeeper的依賴 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
??? 3. 編輯application.properties檔案,添加配置資訊
# 配置埠
server.port=8085
dubbo.application.id=dubbo-consumer
dubbo.application.name=dubbo-consumer
dubbo.registry.address=zookeeper://127.0.0.1:2181
注意:服務的提供者和消費者服務埠不可以相同
??? 4. 創建HelloController類,訂閱hello服務
package com.example.dubboconsumer.controller;
import com.example.service.HelloService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@DubboReference
private HelloService helloService;
@RequestMapping("/hello")
public String hello() {
String hello = helloService.sayHello("world");
System.out.println(helloService.sayHello("liang"));
return hello;
}
}
??? 5. 修改啟動器,實作dubbo自動配置和包的掃描
package com.example.dubboconsumer;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.PropertySource;
@SpringBootApplication
@EnableDubbo(scanBasePackages = "com.example.dubboconsumer")
@PropertySource("classpath:/application.properties")
public class DubboConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(DubboConsumerApplication.class, args);
}
}
??啟動消費者并測驗
在最后,啟動消費者的啟動器,然后在瀏覽器輸入http://localhost:8085/hello,即是呼叫注冊中心服務的結果

控制臺也會有輸出

注冊中心的注冊資訊如下

到此,本次專案的搭載到此圓滿結束,謝謝Thanks?(・ω・)ノ
文章有很多不足,可以評論指正,我進行修改,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/420023.html
標籤:其他
