1. 學習大綱
1、 了解什么是dubbo?
2、 我們使用dubbo能做什么?
3、 Dubbo入門
4、 Dubbo管理
2. 什么是dubbo?
2.1. 簡介
DUBBO是一個分布式服務框架,致力於提供高性能和透明化的RPC遠程服務調用方案,是阿里巴巴SOA服務化治理方案的核心框架,每天為2,000+個服務提供3,000,000,000+次訪問量支持,並被廣泛應用於阿里巴巴集團的各成員站點。
Dubbo是Alibaba開源的分布式服務框架,它最大的特點是按照分層的方式來架構,使用這種方式可以使各個層之間解耦合(或者最大限度地松耦合)。從服務模型的角度來看,Dubbo采用的是一種非常簡單的模型,要么是提供方提供服務,要么是消費方消費服務,所以基於這一點可以抽象出服務提供方(Provider)和服務消費方(Consumer)兩個角色。關於注冊中心、協議支持、服務監控等內容。
2.2. RPC
2.3. 官網
2.4. 版本說明
我們使用2.5.3版本。
2.5. 下載
Dubbo官網並沒有提供下載服務,但是dubbo將源碼托管於github,並且將jar包發布到maven的中央倉庫,所以可以從github和maven中央倉庫來下載。
2.5.1. 源碼下載
https://github.com/alibaba/dubbo
2.5.2. 發布包下載
http://repo1.maven.org/maven2/com/alibaba/dubbo/
3. 通過Maven構建dubbo(非必須)
既然可以下載得到源碼以及發布包,那么為什么要去構建dubbo呢?,我們先來看下dubbo的主要模塊:
其中,核心框架、管理控制台、簡易監控中心、簡易注冊中心是我們需要的模塊,目前,只有核心模塊可以下載到,其它的均無法直接下載,所以我們需要構建dubbo。
當然了,在提供的資料中以及有構建好的模塊提供,也可以選擇不重新構建。
3.1. 導入源碼到Eclipse
先導入編譯依賴到Eclipse:
再導入dubbo源碼到Eclipse:
導入完成:
3.2. 安裝hessian-lite到本地倉庫
3.3. 安裝opensesame到本地倉庫
3.4. 構建dubbo
構建完成:
[INFO] Reactor Summary:
[INFO]
[INFO] dubbo-parent ....................................... SUCCESS [ 0.349 s]
[INFO] dubbo-common ....................................... SUCCESS [ 4.351 s]
[INFO] dubbo-container .................................... SUCCESS [ 0.007 s]
[INFO] dubbo-container-api ................................ SUCCESS [ 0.718 s]
[INFO] dubbo-container-spring ............................. SUCCESS [ 0.368 s]
[INFO] dubbo-container-jetty .............................. SUCCESS [ 0.343 s]
[INFO] dubbo-container-log4j .............................. SUCCESS [ 0.432 s]
[INFO] dubbo-container-logback ............................ SUCCESS [ 0.431 s]
[INFO] dubbo-remoting ..................................... SUCCESS [ 0.003 s]
[INFO] dubbo-remoting-api ................................. SUCCESS [ 1.717 s]
[INFO] dubbo-remoting-netty ............................... SUCCESS [ 0.678 s]
[INFO] dubbo-remoting-mina ................................ SUCCESS [ 0.528 s]
[INFO] dubbo-remoting-grizzly ............................. SUCCESS [ 0.776 s]
[INFO] dubbo-remoting-p2p ................................. SUCCESS [ 0.793 s]
[INFO] dubbo-remoting-http ................................ SUCCESS [ 0.781 s]
[INFO] dubbo-remoting-zookeeper ........................... SUCCESS [ 0.484 s]
[INFO] dubbo-rpc .......................................... SUCCESS [ 0.004 s]
[INFO] dubbo-rpc-api ...................................... SUCCESS [ 1.174 s]
[INFO] dubbo-rpc-default .................................. SUCCESS [ 1.051 s]
[INFO] dubbo-rpc-injvm .................................... SUCCESS [ 0.367 s]
[INFO] dubbo-rpc-rmi ...................................... SUCCESS [ 0.359 s]
[INFO] dubbo-rpc-hessian .................................. SUCCESS [ 0.427 s]
[INFO] dubbo-rpc-http ..................................... SUCCESS [ 0.415 s]
[INFO] dubbo-rpc-webservice ............................... SUCCESS [ 2.279 s]
[INFO] dubbo-cluster ...................................... SUCCESS [ 1.123 s]
[INFO] dubbo-registry ..................................... SUCCESS [ 0.007 s]
[INFO] dubbo-registry-api ................................. SUCCESS [ 0.839 s]
[INFO] dubbo-monitor ...................................... SUCCESS [ 0.004 s]
[INFO] dubbo-monitor-api .................................. SUCCESS [ 0.366 s]
[INFO] dubbo-filter ....................................... SUCCESS [ 0.004 s]
[INFO] dubbo-filter-validation ............................ SUCCESS [ 0.429 s]
[INFO] dubbo-filter-cache ................................. SUCCESS [ 0.398 s]
[INFO] dubbo-registry-default ............................. SUCCESS [ 0.419 s]
[INFO] dubbo-monitor-default .............................. SUCCESS [ 0.370 s]
[INFO] dubbo-registry-multicast ........................... SUCCESS [ 0.443 s]
[INFO] dubbo-config ....................................... SUCCESS [ 0.005 s]
[INFO] dubbo-config-api ................................... SUCCESS [ 1.157 s]
[INFO] dubbo-config-spring ................................ SUCCESS [ 1.080 s]
[INFO] dubbo-rpc-thrift ................................... SUCCESS [ 0.898 s]
[INFO] dubbo-rpc-memcached ................................ SUCCESS [ 0.469 s]
[INFO] dubbo-rpc-redis .................................... SUCCESS [ 0.607 s]
[INFO] dubbo-registry-zookeeper ........................... SUCCESS [ 0.574 s]
[INFO] dubbo-registry-redis ............................... SUCCESS [ 0.724 s]
[INFO] dubbo .............................................. SUCCESS [ 5.777 s]
[INFO] dubbo-simple ....................................... SUCCESS [ 0.003 s]
[INFO] dubbo-registry-simple .............................. SUCCESS [ 5.491 s]
[INFO] dubbo-monitor-simple ............................... SUCCESS [ 11.807 s]
[INFO] dubbo-admin ........................................ SUCCESS [ 4.867 s]
[INFO] dubbo-demo ......................................... SUCCESS [ 0.003 s]
[INFO] dubbo-demo-api ..................................... SUCCESS [ 0.237 s]
[INFO] dubbo-demo-provider ................................ SUCCESS [ 9.309 s]
[INFO] dubbo-demo-consumer ................................ SUCCESS [ 9.491 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:16 min
[INFO] Finished at: 2016-05-31T11:22:10+08:00
[INFO] Final Memory: 73M/1725M
[INFO] ------------------------------------------------------------------------
3.5. 找到對應的模塊包
3.5.1. 核心框架
3.5.2. 管理控制台
3.5.3. 簡易監控中心
3.5.4. 簡易注冊中心
4. Dubbo框架說明
4.1. 背景
4.2. 服務治理
4.3. 架構
調用關系:
1. 服務容器負責啟動,加載,運行服務提供者。
2. 服務提供者在啟動時,向注冊中心注冊自己提供的服務。
3. 服務消費者在啟動時,向注冊中心訂閱自己所需的服務。
4. 注冊中心返回服務提供者地址列表給消費者,如果有變更,注冊中心將基於長連接推送變更數據給消費者。
5. 服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一台提供者進行調用,如果調用失敗,再選另一台調用。
6. 服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鍾發送一次統計數據到監控中心。
5. 快速入門
5.1. 實現功能
存在2個系統,A系統和B系統,A系統調用B系統的接口獲取數據,用於查詢用戶列表。
5.2. 安裝zookeeper
解壓得到如下:
修改配置文件zoo.cfg: 該目錄必須存在。
啟動zookeeper服務:
5.3. 搭建B系統
5.3.1. 創建工程
5.3.2. 導入依賴
<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>cn.itcast.dubbo</groupId>
<artifactId>dubbo-b</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<!-- dubbo采用spring配置方式,所以需要導入spring容器依賴 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.4</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
<exclusions>
<exclusion>
<!-- 排除傳遞spring依賴 -->
<artifactId>spring</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8081</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
</project>
5.3.3. 配置log4j文件
log4j.properties:
log4j.rootLogger=DEBUG,A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n
5.3.4. 創建User對象
package cn.itcast.dubbo.pojo;
// 使用dubbo要求傳輸的對象必須實現序列化接口
public class User implements java.io.Serializable {
private static final long serialVersionUID = -2668999087589887337L;
private Long id;
private String username;
private String password;
private Integer age;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
5.3.5. 創建UserService(接口)提供查詢服務
package cn.itcast.dubbo.service;
import java.util.List;
import cn.itcast.dubbo.pojo.User;
public interface UserService {
/**
* 查詢所有的用戶數據
*
* @return
*/
public List<User> queryAll();
}
5.3.6. 創建UserServiceImpl實現類
package cn.itcast.dubbo.service.impl;
import java.util.ArrayList;
import java.util.List;
import cn.itcast.dubbo.pojo.User;
import cn.itcast.dubbo.service.UserService;
public class UserServiceImpl implements UserService {
/**
* 實現查詢,這里做模擬實現,不做具體的數據庫查詢
*/
public List<User> queryAll() {
List<User> list = new ArrayList<User>();
for (int i = 0; i < 10; i++) {
User user = new User();
user.setAge(10 + i);
user.setId(Long.valueOf(i + 1));
user.setPassword("123456");
user.setUsername("username_" + i);
list.add(user);
}
return list;
}
}
5.3.7. 編寫dubbo配置文件
具體配置:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" 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-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 提供方應用信息,用於計算依賴關系 --> <dubbo:application name="dubbo-b-server" /> <!-- 這里使用的注冊中心是zookeeper --> <dubbo:registry address="zookeeper://127.0.0.1:2181" client="zkclient"/> <!-- 用dubbo協議在20880端口暴露服務 --> <dubbo:protocol name="dubbo" port="20880" /> <!-- 將該接口暴露到dubbo中 --> <dubbo:service interface="cn.itcast.dubbo.service.UserService" ref="userServiceImpl" /> <!-- 將具體的實現類加入到Spring容器中 --> <bean id="userServiceImpl" class="cn.itcast.dubbo.service.impl.UserServiceImpl" /> </beans>
5.3.8. 導入zookeeper依賴
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.3.3</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
5.3.9. 編寫Web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>dubbo-b</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:dubbo/dubbo-*.xml</param-value>
</context-param>
<!--Spring的ApplicationContext 載入 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
5.3.10. 啟動tomcat
查看tomcat啟動日志:
2016-06-03 09:38:35,307 [localhost-startStop-1] [com.alibaba.dubbo.registry.zookeeper.ZookeeperRegistry]-[INFO] [DUBBO] Register: dubbo://192.168.56.1:20880/cn.itcast.dubbo.service.UserService?anyhost=true&application=dubbo-b-server&dubbo=2.5.3&interface=cn.itcast.dubbo.service.UserService&methods=queryAll&pid=5436&side=provider×tamp=1464917914608, dubbo version: 2.5.3, current host: 127.0.0.1
可以看到,已經將UserService服務注冊到zookeeper注冊中心,協議采用的是dubbo。
5.4. 搭建A系統
5.4.1. 創建工程
創建完成:
5.4.2. 導入依賴
<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>cn.itcast.dubbo</groupId>
<artifactId>dubbo-a</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<!-- dubbo采用spring配置方式,所以需要導入spring容器依賴 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.4</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
<exclusions>
<exclusion>
<!-- 排除傳遞spring依賴 -->
<artifactId>spring</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.3.3</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
</dependencies>
</project>
5.4.3. 配置log4j文件
log4j.properties:
log4j.rootLogger=DEBUG,A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n
5.4.4. 從b系統中拷貝User對象、UserService接口道a系統
5.4.5. 編寫dubbo配置文件
dubbo-consumer.xml:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" 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-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 提供方應用信息,用於計算依賴關系 --> <dubbo:application name="dubbo-a-consumer" /> <!-- 這里使用的注冊中心是zookeeper --> <dubbo:registry address="zookeeper://127.0.0.1:2181" client="zkclient"/> <!-- 從注冊中心中查找服務 --> <dubbo:reference id="userService" interface="cn.itcast.dubbo.service.UserService"/> </beans>
5.4.6. 編寫UserService測試用例
package cn.itcast.dubbo.service;
import static org.junit.Assert.*;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.itcast.dubbo.pojo.User;
public class UserServiceTest {
private UserService userService;
@Before
public void setUp() throws Exception {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
"classpath:dubbo/*.xml");
this.userService = applicationContext.getBean(UserService.class);
}
@Test
public void testQueryAll() {
List<User> users = this.userService.queryAll();
for (User user : users) {
System.out.println(user);
}
}
}
5.4.7. 查看效果
可以看到,已經查詢到10條數據,那么,也就是說A系統通過B系統提供的服務獲取到了數據。
5.5. 解決代碼重復問題
通過剛剛的示例我們可以發現,其中User對象和UserService在A系統和B系統中都使用,那么,我們是否應該講該代碼復用呢?
答案是肯定的。
在使用dubbo時,provider需要將提供服務所需要的java代碼(bean、interface等)單獨打包成jar提供給consumer使用。
5.5.1. 創建dubbo-b-api
5.5.2. 將dubbo-b中的pojo和service接口移動到dubbo-b-api中
結果如下:
5.5.3. 在dubbo-b的pom.xml文件中添加dubbo-b-api的依賴
5.5.4. 在dubbo-a的pom.xml文件中添加dubbo-b-api的依賴,並且將pojo與service接口刪除
刪除代碼:
5.5.5. 測試
測試,發現,和之前實現一樣。
6. 監控
原理:服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鍾發送一次統計數據到監控中心。
6.1. 搭建監控服務
6.2. 修改配置文件
修改注冊中心的地址:
6.3. 在dubbo-b中配置監控
6.4. 啟動
啟動成功:
6.5. 查看界面
說明:端口在這里指定:
6.6. 功能
查看服務:
統計:
圖表:
7. 管理
dubbo提供了一套在線管理整個服務的功能,管理控制台為阿里內部裁剪版本,開源部分主要包含:路由規則,動態配置,服務降級,訪問控制,權重調整,負載均衡,等管理功能。
7.1. 安裝
將dubbo-admin-2.5.3.war部署到tomcat的webapps目錄下:
7.2. 修改配置文件
7.3. 啟動tomcat
7.4. 查看管理界面
使用用戶登錄:
效果:
功能:
8. dubbo的配置詳解
8.1. <dubbo:protocol/>
服務提供者協議配置:
配置類:com.alibaba.dubbo.config.ProtocolConfig
說明:如果需要支持多協議,可以聲明多個<dubbo:protocol>標簽,並在<dubbo:service>中通過protocol屬性指定使用的協議。
標簽 |
屬性 |
對應URL參數 |
類型 |
是否必填 |
缺省值 |
作用 |
描述 |
兼容性 |
<dubbo:protocol> |
id |
|
string |
可選 |
dubbo |
配置關聯 |
協議BeanId,可以在<dubbo:service protocol="">中引用此ID,如果ID不填,缺省和name屬性值一樣,重復則在name后加序號。 |
2.0.5以上版本 |
<dubbo:protocol> |
name |
<protocol> |
string |
必填 |
dubbo |
性能調優 |
協議名稱 |
2.0.5以上版本 |
<dubbo:protocol> |
port |
<port> |
int |
可選 |
dubbo協議缺省端口為20880,rmi協議缺省端口為1099,http和hessian協議缺省端口為80 |
服務發現 |
服務端口 |
2.0.5以上版本 |
<dubbo:protocol> |
host |
<host> |
string |
可選 |
自動查找本機IP |
服務發現 |
-服務主機名,多網卡選擇或指定VIP及域名時使用,為空則自動查找本機IP,-建議不要配置,讓Dubbo自動獲取本機IP |
2.0.5以上版本 |
<dubbo:protocol> |
threadpool |
threadpool |
string |
可選 |
fixed |
性能調優 |
線程池類型,可選:fixed/cached |
2.0.5以上版本 |
<dubbo:protocol> |
threads |
threads |
int |
可選 |
100 |
性能調優 |
服務線程池大小(固定大小) |
2.0.5以上版本 |
<dubbo:protocol> |
iothreads |
threads |
int |
可選 |
cpu個數+1 |
性能調優 |
io線程池大小(固定大小) |
2.0.5以上版本 |
<dubbo:protocol> |
accepts |
accepts |
int |
可選 |
0 |
性能調優 |
服務提供方最大可接受連接數 |
2.0.5以上版本 |
<dubbo:protocol> |
payload |
payload |
int |
可選 |
88388608(=8M) |
性能調優 |
請求及響應數據包大小限制,單位:字節 |
2.0.5以上版本 |
<dubbo:protocol> |
codec |
codec |
string |
可選 |
dubbo |
性能調優 |
協議編碼方式 |
2.0.5以上版本 |
<dubbo:protocol> |
serialization |
serialization |
string |
可選 |
dubbo協議缺省為hessian2,rmi協議缺省為java,http協議缺省為json |
性能調優 |
協議序列化方式,當協議支持多種序列化方式時使用,比如:dubbo協議的dubbo,hessian2,java,compactedjava,以及http協議的json等 |
2.0.5以上版本 |
<dubbo:protocol> |
accesslog |
accesslog |
string/boolean |
可選 |
|
服務治理 |
設為true,將向logger中輸出訪問日志,也可填寫訪問日志文件路徑,直接把訪問日志輸出到指定文件 |
2.0.5以上版本 |
<dubbo:protocol> |
path |
<path> |
string |
可選 |
|
服務發現 |
提供者上下文路徑,為服務path的前綴 |
2.0.5以上版本 |
<dubbo:protocol> |
transporter |
transporter |
string |
可選 |
dubbo協議缺省為netty |
性能調優 |
協議的服務端和客戶端實現類型,比如:dubbo協議的mina,netty等,可以分拆為server和client配置 |
2.0.5以上版本 |
<dubbo:protocol> |
server |
server |
string |
可選 |
dubbo協議缺省為netty,http協議缺省為servlet |
性能調優 |
協議的服務器端實現類型,比如:dubbo協議的mina,netty等,http協議的jetty,servlet等 |
2.0.5以上版本 |
<dubbo:protocol> |
client |
client |
string |
可選 |
dubbo協議缺省為netty |
性能調優 |
協議的客戶端實現類型,比如:dubbo協議的mina,netty等 |
2.0.5以上版本 |
<dubbo:protocol> |
dispatcher |
dispatcher |
string |
可選 |
dubbo協議缺省為all |
性能調優 |
協議的消息派發方式,用於指定線程模型,比如:dubbo協議的all, direct, message, execution, connection等 |
2.1.0以上版本 |
<dubbo:protocol> |
queues |
queues |
int |
可選 |
0 |
性能調優 |
線程池隊列大小,當線程池滿時,排隊等待執行的隊列大小,建議不要設置,當線程程池時應立即失敗,重試其它服務提供機器,而不是排隊,除非有特殊需求。 |
2.0.5以上版本 |
<dubbo:protocol> |
charset |
charset |
string |
可選 |
UTF-8 |
性能調優 |
序列化編碼 |
2.0.5以上版本 |
<dubbo:protocol> |
buffer |
buffer |
int |
可選 |
8192 |
性能調優 |
網絡讀寫緩沖區大小 |
2.0.5以上版本 |
<dubbo:protocol> |
heartbeat |
heartbeat |
int |
可選 |
0 |
性能調優 |
心跳間隔,對於長連接,當物理層斷開時,比如拔網線,TCP的FIN消息來不及發送,對方收不到斷開事件,此時需要心跳來幫助檢查連接是否已斷開 |
2.0.10以上版本 |
<dubbo:protocol> |
telnet |
telnet |
string |
可選 |
|
服務治理 |
所支持的telnet命令,多個命令用逗號分隔 |
2.0.5以上版本 |
<dubbo:protocol> |
register |
register |
boolean |
可選 |
true |
服務治理 |
該協議的服務是否注冊到注冊中心 |
2.0.8以上版本 |
<dubbo:protocol> |
contextpath |
contextpath |
String |
可選 |
缺省為空串 |
服務治理 |
|
2.0.6以上版本 |
8.2. 協議
dubbo提供的協議有:
8.2.1. dubbo://
Dubbo缺省協議采用單一長連接和NIO異步通訊,適合於小數據量大並發的服務調用,以及服務消費者機器數遠大於服務提供者機器數的情況。
Dubbo缺省協議不適合傳送大數據量的服務,比如傳文件,傳視頻等,除非請求量很低。
配置:
執行過程:
默認連接:
限制最大連接:
8.3. <dubbo:registry/>
注冊中心配置:
配置類:com.alibaba.dubbo.config.RegistryConfig
說明:如果有多個不同的注冊中心,可以聲明多個<dubbo:registry>標簽,並在<dubbo:service>或<dubbo:reference>的registry屬性指定使用的注冊中心。
標簽 |
屬性 |
對應URL參數 |
類型 |
是否必填 |
缺省值 |
作用 |
描述 |
兼容性 |
<dubbo:registry> |
id |
|
string |
可選 |
|
配置關聯 |
注冊中心引用BeanId,可以在<dubbo:service registry="">或<dubbo:reference registry="">中引用此ID |
1.0.16以上版本 |
<dubbo:registry> |
address |
<host:port> |
string |
必填 |
|
服務發現 |
注冊中心服務器地址,如果地址沒有端口缺省為9090,同一集群內的多個地址用逗號分隔,如:ip:port,ip:port,不同集群的注冊中心,請配置多個<dubbo:registry>標簽 |
1.0.16以上版本 |
<dubbo:registry> |
protocol |
<protocol> |
string |
可選 |
dubbo |
服務發現 |
注同中心地址協議,支持dubbo, http, local三種協議,分別表示,dubbo地址,http地址,本地注冊中心 |
2.0.0以上版本 |
<dubbo:registry> |
port |
<port> |
int |
可選 |
9090 |
服務發現 |
注冊中心缺省端口,當address沒有帶端口時使用此端口做為缺省值 |
2.0.0以上版本 |
<dubbo:registry> |
username |
<username> |
string |
可選 |
|
服務治理 |
登錄注冊中心用戶名,如果注冊中心不需要驗證可不填 |
2.0.0以上版本 |
<dubbo:registry> |
password |
<password> |
string |
可選 |
|
服務治理 |
登錄注冊中心密碼,如果注冊中心不需要驗證可不填 |
2.0.0以上版本 |
<dubbo:registry> |
transport |
registry.transporter |
string |
可選 |
netty |
性能調優 |
網絡傳輸方式,可選mina,netty |
2.0.0以上版本 |
<dubbo:registry> |
timeout |
registry.timeout |
int |
可選 |
5000 |
性能調優 |
注冊中心請求超時時間(毫秒) |
2.0.0以上版本 |
<dubbo:registry> |
session |
registry.session |
int |
可選 |
60000 |
性能調優 |
注冊中心會話超時時間(毫秒),用於檢測提供者非正常斷線后的臟數據,比如用心跳檢測的實現,此時間就是心跳間隔,不同注冊中心實現不一樣。 |
2.1.0以上版本 |
<dubbo:registry> |
file |
registry.file |
string |
可選 |
|
服務治理 |
使用文件緩存注冊中心地址列表及服務提供者列表,應用重啟時將基於此文件恢復,注意:兩個注冊中心不能使用同一文件存儲 |
2.0.0以上版本 |
<dubbo:registry> |
wait |
registry.wait |
int |
可選 |
0 |
性能調優 |
停止時等待通知完成時間(毫秒) |
2.0.0以上版本 |
<dubbo:registry> |
check |
check |
boolean |
可選 |
true |
服務治理 |
注冊中心不存在時,是否報錯 |
2.0.0以上版本 |
<dubbo:registry> |
register |
register |
boolean |
可選 |
true |
服務治理 |
是否向此注冊中心注冊服務,如果設為false,將只訂閱,不注冊 |
2.0.5以上版本 |
<dubbo:registry> |
subscribe |
subscribe |
boolean |
可選 |
true |
服務治理 |
是否向此注冊中心訂閱服務,如果設為false,將只注冊,不訂閱 |
2.0.5以上版本 |
<dubbo:registry> |
dynamic |
dynamic |
boolean |
可選 |
true |
服務治理 |
服務是否動態注冊,如果設為false,注冊后將顯示后disable狀態,需人工啟用,並且服務提供者停止時,也不會自動取消冊,需人工禁用。 |
2.0.5以上版本 |
8.4. 注冊中心
8.4.1. zookeeper注冊中心
原理:
流程說明:
l 服務提供者啟動時
n 向/dubbo/com.foo.BarService/providers目錄下寫入自己的URL地址。
l 服務消費者啟動時
n 訂閱/dubbo/com.foo.BarService/providers目錄下的提供者URL地址。
n 並向/dubbo/com.foo.BarService/consumers目錄下寫入自己的URL地址。
l 監控中心啟動時
n 訂閱/dubbo/com.foo.BarService目錄下的所有提供者和消費者URL地址。
支持以下功能:
l 當提供者出現斷電等異常停機時,注冊中心能自動刪除提供者信息。
l 當注冊中心重啟時,能自動恢復注冊數據,以及訂閱請求。
l 當會話過期時,能自動恢復注冊數據,以及訂閱請求。
l 當設置<dubbo:registry check="false" />時,記錄失敗注冊和訂閱請求,后台定時重試。
l 可通過<dubbo:registry username="admin" password="1234" />設置zookeeper登錄信息。
l 可通過<dubbo:registry group="dubbo" />設置zookeeper的根節點,不設置將使用無根樹。
l 支持*號通配符<dubbo:reference group="*" version="*" />,可訂閱服務的所有分組和所有版本的提供者。
zkClient的使用: