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快速入門
環境步驟:
- 安裝Zookeepr啓動
- 創建Maven項目搭建生產者和消費者
- 安裝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,它已經把整個常用分佈式解決都整合好了。