Dubbo

Dubbo產生的背景

什麼是Dubbo

一款分佈式服務框架
高性能和透明化的RPC遠程服務調用方案
SOA服務治理方案
每天爲2千多個服務提供大於30億次訪問量支持,並被廣泛應用於阿里巴巴集團的各成員站點以及別的公司的業務中。

Dubbo註冊中心

對於服務提供方,它需要發佈服務,而且由於應用系統的複雜性,服務的數量、類型也不斷膨脹;
對於服務消費方,它最關心如何獲取到它所需要的服務,而面對複雜的應用系統,需要管理大量的服務調用。
而且,對於服務提供方和服務消費方來說,他們還有可能兼具這兩種角色,即既需要提供服務,有需要消費服務。

通過將服務統一管理起來,可以有效地優化內部應用對服務發佈/使用的流程和管理。服務註冊中心可以通過特定協議來完成服務對外的統一。

Dubbo提供的註冊中心有如下幾種類型可供選擇:

Multicast註冊中心
Zookeeper註冊中心
Redis註冊中心
Simple註冊中心

Dubbo的優缺點

優點:

透明化的遠程方法調用

  • 像調用本地方法一樣調用遠程方法;只需簡單配置,沒有任何API侵入。
    軟負載均衡及容錯機制
    可在內網替代nginx lvs等硬件負載均衡器。
    服務註冊中心自動註冊 & 配置管理
    -不需要寫死服務提供者地址,註冊中心基於接口名自動查詢提供者ip。
    使用類似zookeeper等分佈式協調服務作爲服務註冊中心,可以將絕大部分項目配置移入zookeeper集羣。
    服務接口監控與治理
    -Dubbo-admin與Dubbo-monitor提供了完善的服務接口管理與監控功能,針對不同應用的不同接口,可以進行 多版本,多協議,多註冊中心管理。
    缺點:

只支持JAVA語言

Dubbo快速入門

環境步驟:

  1. 安裝Zookeepr啓動
  2. 創建Maven項目搭建生產者和消費者
  3. 安裝DubboAdmin平臺,實現監控

Zookeeper介紹與安裝

Dubbo註冊中心採用的是Zookeeper。爲什麼採用Zookeeper呢?
Zookeeper是一個分佈式的服務框架,是樹型的目錄服務的數據存儲,能做到集羣管理數據 ,這裏能很好的作爲Dubbo服務的註冊中心。

Dubbo能與Zookeeper做到集羣部署,當提供者出現斷電等異常停機時,Zookeeper註冊中心能自動刪除提供者信息,當提供者重啓時,能自動恢復註冊數據,以及訂閱請求

創建Maven工程

項目結構:

主要分三大模塊:

Test-dubbo-api : 存放公共接口; 
Test-dubbo-consumer : 調用遠程服務; 
Test-dubbo-provider : 提供遠程服務。 

Test-dubbo-api 新建接口

public interface DemoApiService {
	public String getUser(Long userId);
}

生產者提供服務接口

test-dubbo-provider 實現接口業務邏輯

public class DemoApiServiceImpl implements DemoApiService {
	public String getUser(Long userId) {
		System.out.println("生產者調用消費者服務接口userId:" + userId);
		return "test";
	}
}

Maven依賴信息

<dependencies>
	<dependency>
		<groupId>com.test</groupId>
		<artifactId>test-dubbo-api</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</dependency>
	<dependency>
		<groupId>com.101tec</groupId>
		<artifactId>zkclient</artifactId>
		<version>0.10</version>
	</dependency>
	<dependency>
		<groupId>commons-logging</groupId>
		<artifactId>commons-logging</artifactId>
		<version>1.2</version>
	</dependency>
	<dependency>
		<groupId>org.jboss.netty</groupId>
		<artifactId>netty</artifactId>
		<version>3.2.5.Final</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-context</artifactId>
		<version>4.3.9.RELEASE</version>
	</dependency>
	<dependency>
		<groupId>com.alibaba</groupId>
		<artifactId>dubbo</artifactId>
		<version>2.5.3</version>
		<exclusions>
			<exclusion>
				<groupId>org.springframework</groupId>
				<artifactId>spring</artifactId>
			</exclusion>
			<exclusion>
				<groupId>org.jboss.netty</groupId>
				<artifactId>netty</artifactId>
			</exclusion>
		</exclusions>
	</dependency>
</dependencies>

新增 dubbo-provider.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-admin 或 dubbo-monitor 會顯示這個名字,方便辨識 -->
	<dubbo:application name="demotest-provider" />
	<!--使用 zookeeper 註冊中心暴露服務,注意要先開啓 zookeeper -->
	<dubbo:registry address="zookeeper://localhost:2181" />
	<!-- 用dubbo協議在20880端口暴露服務 -->
	<dubbo:protocol name="dubbo" port="20880" />
	<!--使用 dubbo 協議實現定義好的 api.PermissionService 接口 -->
	<dubbo:service interface="com.test.demo.api.service.DemoApiService"
		ref="demoService" protocol="dubbo" />
	<!--具體實現該接口的 bean -->
	<bean id="demoService" class="com.test.demo.api.service.impl.DemoApiServiceImpl" />
</beans>

啓動發佈服務

	ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("provider.xml");
	System.out.println(context.getDisplayName() + ": here");
	context.start();
	System.out.println("服務已經啓動...");
	System.in.read();

消費者調用服務接口

Maven依賴信息

<dependencies>
	<dependency>
		<groupId>com.test</groupId>
		<artifactId>test-dubbo-api</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</dependency>
	<dependency>
		<groupId>com.101tec</groupId>
		<artifactId>zkclient</artifactId>
		<version>0.10</version>
	</dependency>
	<dependency>
		<groupId>commons-logging</groupId>
		<artifactId>commons-logging</artifactId>
		<version>1.2</version>
	</dependency>
	<dependency>
		<groupId>org.jboss.netty</groupId>
		<artifactId>netty</artifactId>
		<version>3.2.5.Final</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-context</artifactId>
		<version>4.3.9.RELEASE</version>
	</dependency>
	<dependency>
		<groupId>com.alibaba</groupId>
		<artifactId>dubbo</artifactId>
		<version>2.5.3</version>
		<exclusions>
			<exclusion>
				<groupId>org.springframework</groupId>
				<artifactId>spring</artifactId>
			</exclusion>
			<exclusion>
				<groupId>org.jboss.netty</groupId>
				<artifactId>netty</artifactId>
			</exclusion>
		</exclusions>
	</dependency>
</dependencies>

調用服務接口

	ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("consumer.xml");
		context.start();
		System.out.println("consumer start");
		DemoApiService demoApiService = context.getBean(DemoApiService.class);
		String result = demoApiService.getUser(1l);
		System.out.println("result:" + result);

消費者配置文件

DubboAdmin部署
將dubbo-admin.zip放入到TomcatWebapps目錄下,修改dubbo.properties中的Zookeeper連接地址即可。

Dubbo支持協議
Dubbo支持dubbo、rmi、hessian、http、webservice、thrift、redis等多種協議,但是Dubbo官網是推薦我們使用Dubbo協議的。

SpringBoot整合Dubbo
test-dubbo-parent
test-dubbo-api
test-dubbo-api-member
test-dubbo-api-member-impl
test-dubbo-api-order-impl
test-dubbo-parent

Maven依賴信息

<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.1.RELEASE</version>
	</parent>
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
		<curator-framework.version>4.0.1</curator-framework.version>
		<zookeeper.version>3.4.13</zookeeper.version>
		<dubbo.starter.version>0.2.0</dubbo.starter.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>com.alibaba.boot</groupId>
			<artifactId>dubbo-spring-boot-starter</artifactId>
			<version>${dubbo.starter.version}</version>
		</dependency>

		<dependency>
			<groupId>org.apache.curator</groupId>
			<artifactId>curator-framework</artifactId>
			<version>${curator-framework.version}</version>
		</dependency>

		<dependency>
			<groupId>org.apache.zookeeper</groupId>
			<artifactId>zookeeper</artifactId>
			<version>${zookeeper.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

生產者

test-dubbo-api-member-impl

Maven依賴信息

<dependencies>
	<dependency>
		<groupId>com.test</groupId>
		<artifactId>test-dubbo-api-member</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</dependency>
</dependencies>

application.yml

server:
  port: 8080
dubbo:
  application:
    name: member
  protocol:
    name: dubbo
    port: 20880
  registry:
    address: zookeeper://127.0.0.1:2181
  scan:
    base-packages: com.test.api.member.impl

發佈服務

@Service
public class MemberServiceImpl implements MemberService {

	@Override
	public String getUser() {
		return "訂單服務調用會員服務接口";
	}

}

注意:@Service 註解引入爲阿里巴巴註解

啓動服務

@EnableDubbo
@SpringBootApplication
public class AppMember {

	public static void main(String[] args) {
		SpringApplication.run(AppMember.class, args);
	}

}

@EnableDubbo 開啓Dubbo服務功能

消費者

test-dubbo-api-order-impl

Maven依賴信息

<dependencies>
	<dependency>
		<groupId>com.test</groupId>
		<artifactId>test-dubbo-api-member</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</dependency>
</dependencies>

application.yml

server:
  port: 8081
###dubbo 註冊服務名稱
dubbo:
  application:
    name: order
 ###dubbo服務地址
  protocol:
    name: dubbo
    port: 20880
  registry:
    address: zookeeper://localhost:2181
  consumer:
    timeout: 5000

調用服務

@Reference
private MemberService memberService;

@RequestMapping("/orderToMember")
public String orderToMember() {
	return memberService.getUser();
}

使用該 @Reference調用dubbo接口

啓動項目

@EnableDubbo
@SpringBootApplication
public class AppOrder {
	public static void main(String[] args) {
		SpringApplication.run(AppOrder.class, args);
	}
}

SpringCloud與Dubbo區別

爲什麼放棄Dubbo 使用SpringCloud?

相同點:SpringCloud 和Dubbo可以實現RPC遠程調用框架,可以實現服務治理。

不同點:
SpringCloud是一套目前比較網站微服務框架了,整合了分佈式常用解決方案遇到了問題註冊中心Eureka、負載均衡器Ribbon ,客戶端調用工具Rest和Feign,分佈式配置中心Config,服務保護Hystrix,網關Zuul Gateway ,服務鏈路Zipkin,消息總線Bus等。

從架構上分析
Dubbo內部實現功能沒有SpringCloud強大,只是實現服務治理,缺少分佈式配置中心、網關、鏈路、總線等,如果需要用到這些組件,需要整合其他框架。

從更新迭代速度分析
Dubbo目前更新速度沒有SpringCloud快,到SpringCloud2.0後SpringCloud會越來完善和穩定。

從開發背景角度分析
Dubbo的開發背景是阿里巴巴, 在中國也推出了非常多的優秀的開源框架
但是在SpringCloud的背景是Spring家族,Spring是專注於企業級開源框架開發,在中國,或者在整個世界上Spring框架都應用的非常廣泛。所有相對來說SpringCloud的背景比Dubbo更加強大。

最後總結下:如果學習Dubbo的話,學習其他的分佈式解決方案需要自己組裝,反而如果學習SpringCloud,它已經把整個常用分佈式解決都整合好了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章