原文地址:Dubbo 基礎教程
博客地址:http://www.extlight.com
一、前言
當服務越來越多時,容量的評估,小服務資源的浪費等問題逐漸顯現,此時需要增加一個調度中心基於訪問壓力實時管理集群容量,提供集群利用率。其中,用於提高機器利用率的資源調度和治理中心是關鍵。
二、Dubbo 簡介
2.1 概念
Dubbo 是阿里巴巴開源項目的一個分布式服務框架。其致力於提供高性能和透明化的 RPC 遠程調用方案,以及 SOA 服務治理方案。
2.2 原理
調用關系說明:
1) 服務容器啟動、加載和運行服務提供者;
2) 服務提供者在啟動時,向注冊中心注冊自己提供的服務;
3) 服務消費者在啟動時,向注冊中心訂閱自己所需的服務;
4) 注冊中心返回服務提供者地址列表給消費者,如果有變更,注冊中心將基於長連接推送變更給消費者;
5) 服務消費者從地址列表中,基於軟負載均衡算法選一台服務提供者進行調用,如果調用失敗再選另一台;
6) 服務消費者和服務提供者在內存中累計調用次數和調用時間,定時每分鍾發送一次統計數據到監控中心。
節點角色說明
節點 | 角色說明 |
---|---|
Container | 服務運行容器 |
Provider | 暴露服務的服務提供者 |
Consumer | 調用遠程服務的服務消費者 |
Registry | 服務注冊與發現的注冊中心 |
Monitor | 統計服務的調用此處和調用時間的監控中心 |
三、快速入門
Dubbo 采用全 Spring 配置方式,透明化接入應用,對應用沒有任何 API 入侵,只需用 Spring 加載 Dubbo 配置即可。
3.1 安裝注冊中心
官方推薦使用 Zookeeper 作為注冊中心,因此本次測試使用 Zookeeper,將其放置在 ip 為 192.168.2.14 的虛擬機上。
# 解壓和轉移目錄
tar -zxvf zookeeper-3.4.8.tar.gz -C /usr/
cd /usr
mv zookeeper-3.4.8 zookeeper
# 設置配置文件
cd /usr/zookeeper/conf
cp zoo_sample.cfg zoo.cfg
# 啟動 zookeeper
/usr/zookeeper/bin/zkServer.sh start
# 查看 zookeeper 運行狀態,如果出現 Mode: standalone 說明運行成功
/usr/zookeeper/bin/zkServer.sh status
3.2 服務提供者
創建一個 Maven 項目(名為 dubbo-service 的 web 項目)。
pom.xml 配置:
<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>com.light</groupId>
<artifactId>dubbo-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.9</version>
</dependency>
</dependencies>
</project>
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_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>dubbo-service</display-name>
<!-- spring容器 start -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext-dubbo.xml</param-value>
</context-param>
<!-- spring容器 end -->
</web-app>
接口:
public interface HelloService {
String sayHello(String name);
}
實現類:
public class HelloServiceImpl implements HelloService {
@Override
public String sayHello(String name) {
return "Hello," + name;
}
}
applicationContext-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="hello-demo"/>
<dubbo:registry address="zookeeper://192.168.2.14:2181"/>
<dubbo:protocol name="dubbo" port="20880"/>
<dubbo:service interface="com.light.dubbo.service.HelloService" ref="helloService"/>
<bean id="helloService" class="com.light.dubbo.service.impl.HelloServiceImpl"/>
</beans>
3.3 服務消費者
創建一個 Maven 項目(名為 dubbo-consumer 的 web 項目)。
pom.xml 配置:
<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>com.light</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.3</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.9</version>
</dependency>
</dependencies>
</project>
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_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>dubbo-consumer</display-name>
<!-- spring容器 start -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext-dubbo.xml</param-value>
</context-param>
<!-- spring容器 end -->
<!-- springmvc容器 start -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- springmvc容器 end -->
</web-app>
將 dubbo-service 項目中的 HelloService 接口復制到該項目(dubbo-consumer)中。
控制層:
@Controller
public class HelloController {
@Autowired
private HelloService helloService;
@RequestMapping("hello")
@ResponseBody
public String hello(String name) {
return this.helloService.sayHello(name);
}
}
applicationContext-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="hello-demo"/>
<dubbo:registry address="zookeeper://192.168.2.14:2181"/>
<dubbo:protocol name="dubbo" port="20880"/>
<dubbo:reference interface="com.light.dubbo.service.HelloService"/>
</beans>
springmvc.xml 配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- 只掃描含有@Controller注解的類 -->
<context:component-scan base-package="com.light.dubbo.controller">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!-- 加載解析 @rquestMapping等注解的解析器 -->
<mvc:annotation-driven/>
</beans>
先啟動服務提供者的項目(8080),再啟動服務消費者的項目(8081)。打開瀏覽器訪問http://localhost:8081/hello?name=jack,結果如下圖:
四、監控
4.1 獲取源碼
git clone --branch dubbo-2.6.0 https://github.com/alibaba/dubbo.git
下載完成后使用 IDE 工具引入其子項目 dubbo-sample\dubbo-monitor-sample 進行編譯和打包。打包后會在項目的 target 目錄下生成 dubbo-monitor-simple-2.6.0-assembly.tar.gz 壓縮文件。
4.2 修改配置
- 解壓 dubbo-monitor-simple-2.6.0-assembly.tar.gz 壓縮包,修改 dubbo-monitor-simple-2.6.0\conf\dubbo.properties:
dubbo.registry.address=zookeeper://192.168.2.14:2181
- 在服務提供者的配置文件中添加:
<!-- 注冊中心自動查找監控服務 -->
<dubbo:monitor protocol="registry"/>
最后啟動 dubbo-monitor-simple-2.6.0\bin\start.bat。打開瀏覽器訪問http://localhost:8080/,效果圖如下:
五、管理控制台
Dubbo 提供了一套在線管理服務的管理控制台,該管理控制台為阿里巴巴內部裁減版本,開源部分主要包含:路由規則、動態配置、服務降級、訪問控制、權重調整和負載均衡。
5.1 獲取運行項目
在第四節下載的 duboo 源碼中,通過 IDE 工具引入其子項目 dubbo-admin 進行編譯和打包。
打包后會在項目的 target 目錄下生成 dubbo-admin-2.6.0.war 壓縮文件。
5.2 修改配置
將 dubbo-admin-2.6.0.war 里邊的文件和文件夾復制粘貼到 tomcat 的 ROOT 目錄中並修改 webapps\ROOT\WEB-INF\dubbo.properties 文件內容:
dubbo.registry.address=zookeeper://192.168.2.14:2181
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest
其中,配置中設置 2 個用戶:root 和 guest。
最后啟動 tomcat 容器,打開瀏覽器訪問http://localhost:8080/,頁面要求輸入賬號和密碼,登錄后效果圖如下: