Editor:SimpleWu
Dubbo是 阿里巴巴公司開源的一個高性能優秀的服務框架使得應用可經過高性能的 RPC 實現服務的輸出和輸入功能,能夠和 Spring框架無縫集成。java
隨着互聯網的發展,網站應用的規模不斷擴大,常規的垂直應用架構已沒法應對,分佈式服務架構以及流動計算架構勢在必行,亟需一個治理系統確保架構有條不紊的演進。git
單一應用架構
當網站流量很小時,只需一個應用,將全部功能都部署在一塊兒,以減小部署節點和成本。此時,用於簡化增刪改查工做量的數據訪問框架(ORM)是關鍵。github
垂直應用架構
當訪問量逐漸增大,單一應用增長機器帶來的加速度愈來愈小,將應用拆成互不相干的幾個應用,以提高效率。此時,用於加速前端頁面開發的Web框架(MVC)是關鍵。spring
分佈式服務架構
當垂直應用愈來愈多,應用之間交互不可避免,將核心業務抽取出來,做爲獨立的服務,逐漸造成穩定的服務中心,使前端應用能更快速的響應多變的市場需求。此時,用於提升業務複用及整合的分佈式服務框架(RPC)是關鍵。apache
流動計算架構
當服務愈來愈多,容量的評估,小服務資源的浪費等問題逐漸顯現,此時需增長一個調度中心基於訪問壓力實時管理集羣容量,提升集羣利用率。此時,用於提升機器利用率的資源調度和治理中心(SOA)是關鍵。json
官方網站api
http://zookeeper.apache.org/架構
下載地址app
http://mirrors.hust.edu.cn/apache/zookeeper/
下載好咱們解壓出來直接啓動bin目錄下zkServer.bat是不行的,咱們暫時將zoo_sample.cfg改爲zoo.cfg而後就能夠正常啓動了,啓動後咱們能夠看到默認的端口2181到時候咱們的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(); } }
發佈後圖示:
若是看到咱們的服務接口後就說明服務發佈成功!
1.首先在Dubbo目錄裏面找到dubbo-admin將他打成WAR包不能帶項目路徑
咱們須要將WAR包發佈到Tomcat裏面最好獨立運行,咱們將Tomcat wepapps下的ROOT所有刪掉將WAR包解壓到裏面,而後啓動Tomcat(必須先開啓咱們的zookeeper),咱們直接訪問localhost:8080會彈出:
默認的帳號root密碼root登錄
咱們能夠看到這個頁面
咱們能夠在這裏管理咱們的服務
目前咱們點擊服務是沒有查詢到服務的,咱們將咱們以前的那個服務運行發佈上去能夠看到
咱們能夠點擊服務名進去管理咱們的服務
在這裏能夠對應的去操做咱們的服務,注意咱們的服務就是在20880端口暴露的,這裏咱們的服務也是20880說明咱們的服務成功發佈。
建立一個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>