Dubbo入門

来源:http://www.cnblogs.com/zr520/archive/2016/04/06/5361786.html
-Advertisement-
Play Games

早就聽說了dubbo的好處,但是在項目中一直沒有使用的機會,所以一直不知道怎麼使用。今天晚上有空,簡單的學習一下 就當入個門,以後項目中遇到的話,那麼使用起來就比較簡單了,至於介紹的話,我就不總結了,其實就是很好的解決了分散式 管理的問題,並且操作起來非常的方便。 下麵這張圖是從官網上截圖的 節點角 ...


早就聽說了dubbo的好處,但是在項目中一直沒有使用的機會,所以一直不知道怎麼使用。今天晚上有空,簡單的學習一下

就當入個門,以後項目中遇到的話,那麼使用起來就比較簡單了,至於介紹的話,我就不總結了,其實就是很好的解決了分散式

管理的問題,並且操作起來非常的方便。

下麵這張圖是從官網上截圖的

節點角色說明:

  • Provider: 暴露服務的服務提供方。
  • Consumer: 調用遠程服務的服務消費方。
  • Registry: 服務註冊與發現的註冊中心。
  • Monitor: 統計服務的調用次調和調用時間的監控中心。
  • Container: 服務運行容器。

調用關係說明:

  • 0. 服務容器負責啟動,載入,運行服務提供者。
  • 1. 服務提供者在啟動時,向註冊中心註冊自己提供的服務。
  • 2. 服務消費者在啟動時,向註冊中心訂閱自己所需的服務。
  • 3. 註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連接推送變更數據給消費者。
  • 4. 服務消費者,從提供者地址列表中,基於軟負載均衡演算法,選一臺提供者進行調用,如果調用失敗,再選另一臺調用。
  • 5. 服務消費者和提供者,在記憶體中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。

(1) 連通性:

  • 註冊中心負責服務地址的註冊與查找,相當於目錄服務,服務提供者和消費者只在啟動時與註冊中心交互,註冊中心不轉發請求,壓力較小
  • 監控中心負責統計各服務調用次數,調用時間等,統計先在記憶體彙總後每分鐘一次發送到監控中心伺服器,並以報表展示
  • 服務提供者向註冊中心註冊其提供的服務,並彙報調用時間到監控中心,此時間不包含網路開銷
  • 服務消費者向註冊中心獲取服務提供者地址列表,並根據負載演算法直接調用提供者,同時彙報調用時間到監控中心,此時間包含網路開銷
  • 註冊中心,服務提供者,服務消費者三者之間均為長連接,監控中心除外
  • 註冊中心通過長連接感知服務提供者的存在,服務提供者宕機,註冊中心將立即推送事件通知消費者
  • 註冊中心和監控中心全部宕機,不影響已運行的提供者和消費者,消費者在本地緩存了提供者列表
  • 註冊中心和監控中心都是可選的,服務消費者可以直連服務提供者

(2) 健狀性:

  • 監控中心宕掉不影響使用,只是丟失部分採樣數據
  • 資料庫宕掉後,註冊中心仍能通過緩存提供服務列表查詢,但不能註冊新服務
  • 註冊中心對等集群,任意一臺宕掉後,將自動切換到另一臺
  • 註冊中心全部宕掉後,服務提供者和服務消費者仍能通過本地緩存通訊
  • 服務提供者無狀態,任意一臺宕掉後,不影響使用
  • 服務提供者全部宕掉後,服務消費者應用將無法使用,並無限次重連等待服務提供者恢復

(3) 伸縮性:

  • 註冊中心為對等集群,可動態增加機器部署實例,所有客戶端將自動發現新的註冊中心
  • 服務提供者無狀態,可動態增加機器部署實例,註冊中心將推送新的服務提供者信息給消費者

(4) 升級性:

  • 當服務集群規模進一步擴大,帶動IT治理結構進一步升級,需要實現動態部署,進行流動計算,現有分散式服務架構不會帶來阻力:

上面這些基本的概念看完,然後我們開始直接上代碼吧。

我們先編寫服務端代碼:

這是代碼結構

下麵是代碼:

 

DemoService.java
package com.hotusm.dubbo.provider; import java.util.List;
public interface DemoService { String sayHello(); List<?> getAllUser(); }
DemoServiceImpl.java

package com.hotusm.dubbo.provider;


import java.util.ArrayList;
import java.util.List;
import java.util.Random;


import com.hotusm.dubbo.model.entity.User;


public class DemoServiceImpl implements DemoService {


public String sayHello() {

return "hello dubbo";
}


public List<?> getAllUser() {
List<User> list=new ArrayList<User>();
Random r=new Random();
for(int i=0;i<10;i++){
list.add(new User(""+r.nextInt(100)));
}

return list;
}

}

 

服務提供者的配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
    xsi:schemaLocation="http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

     
    <!-- 具體的實現bean -->  
    <bean id="demoService" class="com.hotusm.dubbo.provider.DemoServiceImpl" />  
      
    <!-- 提供方應用信息,用於計算依賴關係 -->  
    <dubbo:application name="xixi_provider"  />  
   
    <!-- 使用multicast廣播註冊中心暴露服務地址   
    <dubbo:registry address="multicast://224.5.6.7:1234" />-->  
    
    <!-- 使用zookeeper註冊中心暴露服務地址 -->  
    <dubbo:registry address="zookeeper://127.0.0.1:2182" />   
    
    <!-- 用dubbo協議在20880埠暴露服務 -->  
    <dubbo:protocol name="dubbo" port="20880" />  
   
    <!-- 聲明需要暴露的服務介面 -->  
    <dubbo:service interface="com.hotusm.dubbo.provider.DemoService" ref="demoService" /> 

</beans>

然後我們就可以寫一個測試類,將服務提供者給發佈。

package junit;

import java.io.IOException;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Provider {

    public static void main(String[] args) {
        ClassPathXmlApplicationContext atx=new ClassPathXmlApplicationContext("spring-context.xml");
        atx.start();
        
        try {
            System.out.println("server start... press any key to quit");
            System.in.read();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }
}

dubbo有一個客戶端,我們可以再客戶端中看到提供者和消費者的情況,但是這個客戶端需要自己安裝

我們可以看到這裡已經可以查看到服務提供者的信息了,點擊進去還可以看到更多詳細的信息,這裡就不演示了。

接下來我們再做一個消費者的例子,

註意這裡的包名,實體名稱,介面名稱還是需要一樣的,這點和webservice是一樣的。

最主要還是配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

<!-- 消費方應用名,用於計算依賴關係,不是匹配條件,不要與提供方一樣 -->  
    <dubbo:application name="hehe_consumer" />  
  
    <!-- 使用zookeeper註冊中心暴露服務地址 -->  
    <!-- <dubbo:registry address="multicast://224.5.6.7:1234" /> -->  
    <dubbo:registry address="zookeeper://127.0.0.1:2182" />  
  
    <!-- 生成遠程服務代理,可以像使用本地bean一樣使用demoService -->  
    <dubbo:reference id="demoService"  
        interface="com.hotusm.dubbo.provider.DemoService" />  
    
</beans>

測試代碼:

import java.io.IOException;
import java.util.List;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.hotusm.dubbo.provider.DemoService;


public class Consumer {

    public static void main(String[] args) {
         ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(  
                    new String[] { "spring-context-consumer.xml" });  
            context.start();  
      
            DemoService demo = (DemoService) context.getBean("demoService"); //  
            System.out.println(demo.sayHello());
            List<?> list = demo.getAllUser();
            System.out.println(list);
            try {
                System.out.println("connection... press any key to quit ");
                System.in.read();
            } catch (IOException e) {
                e.printStackTrace();
            }
            
    }
}

我們可以在控制台看到:

hello dubbo
[User [name=37], User [name=95], User [name=68], User [name=59], User [name=14], User [name=51], User [name=44], User [name=62], User [name=71], User [name=94]]
connection... press any key to quit 

這樣我們的例子也就寫完了,dubbo也算是入門了吧。

下麵再講講dubbo的管理頁面怎麼配置。

dubbo管理控制台開源部分主要包含: 提供者  路由規則  動態配置  訪問控制  權重調節  負載均衡  負責人,等管理功能。

bubuko.com,布布扣

 

1、下載dubbo

 

我是測試安裝在windows上的,先刪除tomcat/webapps下自帶的ROOT文件夾內容(替換tomcat的啟動主頁),將下載的war包解壓到webapps/ROOT(可以先讓tomcat自動解壓 再把內容拷貝到root中去),如果是linux的話命令如下:


2、配置: 

( windows 環境  解壓的war包中自帶有dubbo.properties 文件,直接修改就可以;  linux上的話將dubbo.properties放在當前用戶目錄下,)修改zookeeper的地址

  1. vim webapps/ROOT/WEB-INF/dubbo.properties  
3、配置信息如下:
dubbo.registry.address=zookeeper://localhost:2181
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest

這邊使用的是zookeeper的註冊中心。

啟動tomcat:

 

說明:確定zookeeper啟動後再去啟動tomcat

 

訪問:

http://localhost:8080/dubbo-admin-2.5.4-SNAPSHOT    (這是我的tomcat的訪問路徑)

 

出現以下界面說明安裝配置成功,登錄密碼為root/root

附war包下載地址:http://pan.baidu.com/s/1jHQiesY  密碼:5eoq

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 創建springboot的Maven模塊。 對於Maven管理的項目,還是習慣於多模塊。將項目結構做下調整。 1。修改springboot項目的pom文件。 將springboot項目作為頂級項目。在此基礎上,新建Maven模塊項目web-rest模塊。 IntelliJ IDEA會自動給我們spr ...
  • 切片 Python提供了切片操作符,可以對list、tuple、字元串進行截取操作。 list中的切片應用 語法如下: tuple中切片的應用 tuple也是一種list,唯一區別是tuple不可變。因此,tuple也可以用切片操作,只是操作的結果仍是tuple: 字元串中切片的應用 字元串'xxx ...
  • 早就聽說Python語言操作簡單,果然名不虛傳,短短幾句,就實現了基本的功能。 要檢測目標網站上是否存在指定的URL,其實過程很簡單: 1、獲得指定網站網頁的HTML代碼 2、在HTML代碼中查找指定的URL 3、如果存在,OK;否則,Error 整個程式引用了兩個lib庫,urllib2和sgml ...
  • 習慣更改(養成良好的編程習慣) 1.包含頭文件的方式,從C語言.h的方式改為<頭文件名>的方式 2.儘量使用迭代器代替下標操作3.建議:儘量避免使用指針和數組 ,儘可能使用vector和迭代器4.採用 string 類型取代 C 風格字元串(使用標準庫類型 string,除了增強安全性外,效率也提高 ...
  • 看到資料庫連接不由得想起了大一末參加團隊考核時的悲催經歷~~,還記得當初傻傻地按照書本的代碼打到 Eclipse 上,然後一運行就各種報錯。。。報錯後還傻傻地和書本的代碼一遍又一遍地進行核對,發現無誤後,還特別糾結——代碼和書本一樣,怎麼就報錯了呢? 最後通過 Google 才得知要添加驅動包,就這 ...
  • 在文件input.csv文件中,我們有數據如下 現在我們將input.csv文件下的讀取並寫入到output.csv文件,我們會用到fopen函數 函數原型:FILE * fopen(const char * path,const char * mode) fopen還有很多模式,比如 w,寫入文件 ...
  • 好久沒寫過雙緩存了,趁現在有空重新溫習下。 我們經常聽說雙緩存,但是很少使用多緩存,起碼大多數情況下是這樣吧。為什麼不需要多緩衝呢,今天分析下。並不是緩衝區越多越好,這個需要考慮具體的應用場景。我們抽象假設一下應用場景,為了簡化場景,假設只有一個讀線程和一個寫線程,設讀時間為rt,寫時間為wt,有三 ...
  • 易偉微信公眾平臺介面傻瓜教程部分內容:微信介面9超鏈接.rmvb微信介面8音樂信息.rmvb微信介面7圖文信息.rmvb微信介面6關註回覆.rmvb微信介面5關鍵詞回覆.rmvb微信介面50連闖三關.rmvb微信介面4介面驗證.rmvb微信介面49簡答題.rmvb微信介面48正則表達式.rmvb微信 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...