[TOC] Dubbo入門 Editor:SimpleWu Dubbo是 阿裡巴巴公司開源的一個高性能優秀的服務框架使得應用可通過高性能的 RPC 實現服務的輸出和輸入功能,可以和 Spring框架無縫集成。 背景 隨著互聯網的發展,網站應用的規模不斷擴大,常規的垂直應用架構已無法應對,分散式服務架 ...
目錄
Dubbo入門
Editor:SimpleWu
Dubbo是 阿裡巴巴公司開源的一個高性能優秀的服務框架使得應用可通過高性能的 RPC 實現服務的輸出和輸入功能,可以和 Spring框架無縫集成。
背景
隨著互聯網的發展,網站應用的規模不斷擴大,常規的垂直應用架構已無法應對,分散式服務架構以及流動計算架構勢在必行,亟需一個治理系統確保架構有條不紊的演進。
單一應用架構
當網站流量很小時,只需一個應用,將所有功能都部署在一起,以減少部署節點和成本。此時,用於簡化增刪改查工作量的數據訪問框架(ORM)是關鍵。
垂直應用架構
當訪問量逐漸增大,單一應用增加機器帶來的加速度越來越小,將應用拆成互不相干的幾個應用,以提升效率。此時,用於加速前端頁面開發的Web框架(MVC)是關鍵。
分散式服務架構
當垂直應用越來越多,應用之間交互不可避免,將核心業務抽取出來,作為獨立的服務,逐漸形成穩定的服務中心,使前端應用能更快速的響應多變的市場需求。此時,用於提高業務復用及整合的分散式服務框架(RPC)是關鍵。
流動計算架構
當服務越來越多,容量的評估,小服務資源的浪費等問題逐漸顯現,此時需增加一個調度中心基於訪問壓力實時管理集群容量,提高集群利用率。此時,用於提高機器利用率的資源調度和治理中心(SOA)是關鍵。
zookeeper安裝
官方網站
http://zookeeper.apache.org/
下載地址
http://mirrors.hust.edu.cn/apache/zookeeper/
下載好我們解壓出來直接啟動bin目錄下zkServer.bat是不行的,我們暫時將zoo_sample.cfg改成zoo.cfg然後就可以正常啟動了,啟動後我們可以看到預設的埠2181到時候我們的Dubbo就調用這個埠
發佈Dubbo服務
Dubbo下載地址
https://github.com/apache/incubator-dubbo
下載後我們參照裡面的Demo先來搞一個provider。(dubbo-provider)
1.打開eclipse新建一個maven工程(先配置個阿裡雲鏡像,否則本地沒有超級慢)
<!-- 配置阿裡雲 -->
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
2.POM.XML中添加依賴
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.46</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.0.35.Final</version>
</dependency>
</dependencies>
3.添加服務介面,實現服務
package com.miya.dubbo.service;
/**
* 服務提供者介面
* @author SimpleWu
*
*/
public interface MyProviderService {
public String sayHello(String name);
}
實現介面
package com.miya.dubbo.service.impl;
import com.miya.dubbo.service.MyProviderService;
/**
* 服務提供者介面實現類
* @author SimpleWu
*
*/
public class MyProviderServiceImpl implements MyProviderService {
@Override
public String sayHello(String name) {
return "服務1 : MyProviderServiceImpl 。。 sayHello ";
}
}
4.在resources資源文件夾中添加dubbo-provider.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- 提供方應用名稱,用於計算依賴關係 -->
<dubbo:application name="demo-provider" />
<!-- 使用zookeeper註冊中心暴露服務地址 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<!-- 使用dubbo協議,在20880埠暴露服務 -->
<dubbo:protocol name="dubbo" port="20880"/>
<!-- service實現類作為本地的一個bean -->
<bean id="myProviderService" class="com.miya.dubbo.service.impl.MyProviderServiceImpl"/>
<!-- 聲明需要暴露的服務介面 -->
<dubbo:service interface="com.miya.dubbo.service.MyProviderService" ref="myProviderService"/>
</beans>
5.創建測試類發佈服務
發佈服務之前需要先啟動zookeeper,啟動後圖示:
創建測試類發佈服務
public static void main(String[] args){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
new String[] { "dubbo-provider.xml" });
context.start();
System.out.println("服務提供者向zookeeper中心註冊服務成功 暴露的埠為:20880");
try {
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
}
發佈後圖示:
如果看到我們的服務介面後就說明服務發佈成功!
Dubbo Admin管理
1.首先在Dubbo目錄裡面找到dubbo-admin將他打成WAR包不能帶項目路徑
我們需要將WAR包發佈到Tomcat裡面最好獨立運行,我們將Tomcat wepapps下的ROOT全部刪掉將WAR包解壓到裡面,然後啟動Tomcat(必須先開啟我們的zookeeper),我們直接訪問localhost:8080會彈出:
預設的賬號root密碼root登陸
我們可以看到這個頁面
我們可以在這裡管理我們的服務
目前我們點擊服務是沒有查詢到服務的,我們將我們之前的那個服務運行發佈上去可以看到
我們可以點擊服務名進去管理我們的服務
在這裡可以對應的去操作我們的服務,註意我們的服務就是在20880埠暴露的,這裡我們的服務也是20880說明我們的服務成功發佈。
消費Dubbo服務
創建一個maven項目(dubbo-consumer)開啟消費者:
1.POM.XML導入依賴
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.46</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.0.35.Final</version>
</dependency>
</dependencies>
2.創建消費者介面
package com.miya.dubbo.service;
/**
* 服務提供者介面
* @author SimpleWu
*
*/
public interface MyProviderService {
public String sayHello(String name);
}
3.在resources下創建消費者配置文件(dubbo-consumer.xml)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- 消費方應用名稱,用於計算依賴關係,不是匹配條件,不要與提供方名稱一樣 -->
<dubbo:application name="demo-consumer"/>
<!-- 使用zookeeper註冊中心暴露服務地址 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<!-- 生成遠程服務代理,可以與本地bean一樣使用 check屬性,啟動時候是否檢查 一般設置成false 啟動時候不檢查 -->
<dubbo:reference id="myProviderService" check="false" interface="com.miya.dubbo.service.MyProviderService"/>
</beans>
4.創建消費者測試類
package com.miya.dubbo.test;
import java.io.IOException;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.miya.dubbo.service.MyProviderService;
public class ConsumerTest {
public static void main(String[] args) {
//讀取消費者配置文件
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"dubbo-consumer.xml"});
context.start();
//獲取消費實例
MyProviderService demoProviderService=(MyProviderService) context.getBean("myProviderService");
String result=demoProviderService.sayHello("Miya");
System.out.println("遠程調用的結果:"+result);
try {
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
context.close();
}
}
5.開始消費
打開zookeeper-->Tomcat發佈Dubbo Admin管理中心-->啟動消費者測試程式
我們可以看到消費者已經有了,圖示:
抽取與依賴版本管理
抽取
在前面兩個項目中我們會發現兩個項目中有兩個相同的介面(MyProviderServiceImpl.java),這樣是不好的,我們現在參照官方demo來創建一個maven工程(dubbo-api)
我們將介面我們將這個介面放到api這個項目中去,然後將dubbo-consumer,dubbo-provider這兩個工程中的介面刪掉,這個時候我們這兩個項目會報錯因為找不到這個介面,我們可以將這兩個項目添加依賴:
<dependency>
<groupId>com.miya</groupId>
<artifactId>dubbo-api</artifactId>
</dependency>
我們只要依賴dubbo-api就可以獲取到了嗎?
依賴版本統一管理
我們在dubbo-consumer,dubbo-provider這兩個工程中會發現POM.xml中的版本號,如果我們需要修改版本要一個一個去修改有兩個工程不是要改兩次?那誇張以點,一萬不是得改半條命?
這個時候我們還是創建一個maven工程(dubbo-parent),這個工程Packaging我們選擇POM,這個項目負責版本統一。首先我們抽取相同的依賴,然後給他們定義統一的版本管理方式。
<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.miya</groupId>
<artifactId>dubbo-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<!-- 依賴版本管理 -->
<properties>
<dubbo-api.version>0.0.1-SNAPSHOT</dubbo-api.version>
<dubbo.version>2.6.0</dubbo.version>
<zkclient.version>0.10</zkclient.version>
<curator-framework.version>4.0.1</curator-framework.version>
<fastjson.version>1.2.46</fastjson.version>
<log4j.version>1.2.17</log4j.version>
<slf4j-api.version>1.7.25</slf4j-api.version>
<commons-lang3.version>3.4</commons-lang3.version>
<netty-all.version>4.0.35.Final</netty-all.version>
</properties>
<!--依賴管理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.miya</groupId>
<artifactId>dubbo-api</artifactId>
<version>${dubbo-api.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>${zkclient.version}</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>${curator-framework.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j-api.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>${netty-all.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>