Dubbo分佈式服務框架

Dubbo分佈式服務框架

 

Dubbo是是一個高性能,基於Java的RPC框架,由阿里巴巴開源。一個分佈式的服務框架。能夠實現SOA(面向服務的架構)架構。 Dubbo使用的公司:京東、噹噹、阿里巴巴、中國電信等等。java

分佈式服務架構的由來

如下式架構演變過程(如下案例純粹爲了說明問題,跟業務自己無關):redis

早期,電信只有座機的時候,系統只有一個打電話的功能和一個計費的功能。由於業務單一,因此只有一個系統。spring

  • 單一業務的單體式架構

Dubbo分佈式服務框架

 

後來,電信業務豐富起來了。新增了「短信」、「寬帶」、「手機流量」等業務功能。按照常規作法,也只會在原有的「打電話」單一業務系統的基礎上,多添加幾個業務功能模塊而已。全部的業務功能(「「電話」、「短信」、「寬帶」、「手機流量」」)都仍是在一個項目內部。以下圖:性能優化

  • 多業務單體式架構

Dubbo分佈式服務框架

 

  • 多業務模式下的單體架構,當業務不斷擴張、系統內部的業務功能模塊愈來愈多,會致使以下問題:
  1. 會致使業務功能模塊的耦合度過高、不利於擴展和維護,以及推廣。.
  2. 再者程序中存在一個魔性的數字:65535(16bit最大值)限制,(由於調用方法的指令容量只有16bit,65535正好是16bit能容納的最大數字)。重複的方法數太多,會加速達到這個上限。(好比Android 應用65535很容易就上限了)。

好比淘寶、天貓、阿里巴巴三個項目都須要用到支付,設想,將淘寶、天貓、阿里巴巴三個項目整合成一個項目的三個業務功能模塊,將會比較雜亂。因此,出現了淘寶、天貓、阿里巴巴三個獨立的項目,相似下圖:服務器

  • 垂直架構

Dubbo分佈式服務框架

 

經過一步一步演變,架構已經成爲如圖所示的垂直式架構。可是你們都發現了其中的計費功能出現了4次。這樣確定不利於項目的維護和統一配置。(而且上圖的計費只是衆多可能重複模塊中的一員)。因此不得不將多個項目都要使用的相同模塊獨立出來,共享給業務功能使用。這樣,就演變成以下圖架構:架構

Dubbo分佈式服務框架

 

如圖所示,計費被單獨提煉出來成爲一個獨立的app,共其餘app共同使用。圖中「其餘」模塊用來代替千千萬萬相似計費的模塊。併發

這樣一來,每個方塊就是一個獨立的應用。這樣解決了業務複雜度,將業務模塊化、獨立化,方便共享和擴展。這樣的架構帶給咱們須要解決的問題以下:app

  1. 各個獨立app之間的通訊問題怎麼解決?
  2. 怎麼作到統一調度、協調處理。
  3. 若是計費模塊是併發最大的模塊,可是其餘模塊併發不是很大。則須要對計費進行負載均衡,怎麼實現?

架構演變過程

Dubbo分佈式服務框架

 

什麼是RPC?

RPC(Remote Procedure Call Protocol)遠程過程調用協議。服務器A調用服務器B上的方法的一種技術。Dubbo就是一個RPC框架,實現了遠程過程調用。負載均衡

Dubbo的原理圖框架

Dubbo分佈式服務框架

 

dubbo主要的三個要素:一、接口的遠程調用二、負載均衡。三、服務自動註冊和發現

已經將(源碼,筆記,PPT,學習視頻)整理好、因資料太多,請加羣8-9-7-8-8-9-5-1-0 領取免費的學習資源(有Spring,MyBatis,Netty源碼分析,高併發、高性能、分佈式、微服務架構的原理,JVM性能優化、分佈式架構等)

Dubbo的使用

  1. 說明
  2. Dubbo框架須要有註冊中心,本案例中使用Redis做爲Dubbo的註冊中心。除了Redis外,Zookeeper等也能夠做爲Dubbo的註冊中心。
  3. 環境要求
  4. JDK 1.6以上。
  5. 添加依賴
<!-- https://mvnrepository.com/artifact/com.alibaba/dubbo -->
<dependencies>
 <dependency>
 <groupId>com.alibaba</groupId>
 <artifactId>dubbo</artifactId>
 <version>2.5.5</version>
 </dependency>
 <dependency>
 <groupId>redis.clients</groupId>
 <artifactId>jedis</artifactId>
 <version>2.9.0</version>
 </dependency>
 <dependency>
 <groupId>org.springframework.data</groupId>
 <artifactId>spring-data-redis</artifactId>
 <version>1.8.4.RELEASE</version>
 </dependency>
 <dependency>
 <groupId>org.springframework</groupId>
 <artifactId>spring-context</artifactId>
 <version>4.3.11.RELEASE</version>
 </dependency>
 <dependency>
 <groupId>junit</groupId>
 <artifactId>junit</artifactId>
 <version>4.12</version>
 </dependency>
 <dependency>
 <groupId>org.springframework</groupId>
 <artifactId>spring-test</artifactId>
 <version>4.3.11.RELEASE</version>
 </dependency>
</dependencies>

6.定義Dubbo服務接口

其實就是建立一個獨立的module(而且在pom.xml導入以上依賴),在module中建立一些接口和方法(也叫服務)。好比在dubbo_service_interface中建立一個接口IDubboService,代碼以下:

package com.javen.dubbo.service;
import java.util.List;
/**
* Dubbo的服務
* @author sun
*/
public interface IDubboService { 
 List<String> getData(String data);
}

7.定義服務提供者(接口具體實現者)

建立另一個module,命名dubbo_provider1(而且在pom.xml導入以上依賴)。將dubbo_service_interface做爲依賴添加進來。

一、在其中建立類DubboService,而且繼承IDubboService接口。代碼以下:

package com.javen.dubbo.provider;
import com.javen.dubbo.service.IDubboService;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
 
/**
 * 服務提供者
 * @author sun 
 */
@Component("dubboService")
public class DubboService implements IDubboService {
 public List<String> getData(String data) {
 ArrayList<String> list = new ArrayList<String>();
 list.add("這是Dubbo中Provider返回的數據:" + data);
 return list;
 }
}

二、配置spring-dubbo.xml,代碼以下:

<?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:context="http://www.springframework.org/schema/context"
 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://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
 <context:annotation-config />
 <context:component-scan base-package="com.javen.dubbo.provider" /> <!--配置dubbo服務的惟一名稱 -->
 <dubbo:application name="dubbo_provider1" /> <!--將服務註冊到redis中,而且配置協議和端口爲20880 -->
 <dubbo:registry address="redis://192.168.72.188:6379" />
 <dubbo:protocol name="dubbo" port="20880" /> <!--配置服務接口,ref關聯到服務實現類 -->
 <dubbo:service interface="com.javen.dubbo.service.IDubboService"
 ref="dubboService" />
</beans>

三、啓動Provider,代碼以下:

package com.javen.dubbo.provider;
 
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.io.IOException;
 
public class StartProvider {
 public static void main(String[] args) throws IOException {
 ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
 new String[] { "spring-dubbo.xml" });
 System.out.println("服務1啓動~~~");
 context.start(); // 線程阻塞:保證服務一直存在,若是線程結束,服務終止 System.in.read(); // press
 // any key to exit }}
 }
}

六、定義服務消費者(接口的具體調用者)

再建立一個module,命名dubbo_consumer(而且在pom.xml導入以上依賴)。將dubbo_service_interface做爲依賴添加進來。

一、配置spring-dubbo.xml,代碼以下:

<?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="demo-consumer" />
 <dubbo:registry address="redis://192.168.72.188:6379" />
 <dubbo:reference id="demoService"
 interface="com.javen.dubbo.service.IDubboService" />
</beans>

二、測試

package com.test;
import com.javen.dubbo.service.IDubboService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import javax.annotation.Resource;
import java.util.List;
 
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring-dubbo.xml")
public class DubboTest {
 @Resource(name = "demoService")
 private IDubboService dubboService;
 
 @Test
 public void testDubbo() {
 List<String> haha = dubboService.getData("haha");
 System.out.println(haha.get(0));
 }
}

Dubbo、MyCat、主從配置讀寫分離、redis分佈式、JTA分佈式事務的關係。

Dubbo分佈式服務框架

 

dubbo默認每次只訪問一個服務器,須要主從配合完成數據同步。

<!--replicate能夠實現全部服務器同步寫,可是隻讀取單臺服務器。默認是failover,讀寫都是單臺服務器 -->
<dubbo:registry cluster="replicate" address="redis://192.168.72.188:6379" />
相關文章
相關標籤/搜索