MoonlightL

Dubbo 基础教程

发表于 2018-02-22   |  分类于 后端   |  阅读数:   |  评论数:

一、前言

当服务越来越多时,容量的评估,小服务资源的浪费等问题逐渐显现,此时需要增加一个调度中心基于访问压力实时管理集群容量,提供集群利用率。其中,用于提高机器利用率的资源调度和治理中心是关键。

二、Dubbo 简介

2.1 概念

Dubbo 是阿里巴巴开源项目的一个分布式服务框架。其致力于提供高性能和透明化的 RPC 远程调用方案,以及 SOA 服务治理方案。

2.2 原理

调用关系说明:

  1. 1) 服务容器启动、加载和运行服务提供者;
  2. 2) 服务提供者在启动时,向注册中心注册自己提供的服务;
  3. 3) 服务消费者在启动时,向注册中心订阅自己所需的服务;
  4. 4) 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更给消费者;
  5. 5) 服务消费者从地址列表中,基于软负载均衡算法选一台服务提供者进行调用,如果调用失败再选另一台;
  6. 6) 服务消费者和服务提供者在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

节点角色说明

节点角色说明
Container服务运行容器
Provider暴露服务的服务提供者
Consumer调用远程服务的服务消费者
Registry服务注册与发现的注册中心
Monitor统计服务的调用此处和调用时间的监控中心

三、快速入门

Dubbo 采用全 Spring 配置方式,透明化接入应用,对应用没有任何 API 入侵,只需用 Spring 加载 Dubbo 配置即可。

3.1 安装注册中心

官方推荐使用 Zookeeper 作为注册中心,因此本次测试使用 Zookeeper,将其放置在 ip 为 192.168.2.14 的虚拟机上。

  1. # 解压和转移目录
  2. tar -zxvf zookeeper-3.4.8.tar.gz -C /usr/
  3. cd /usr
  4. mv zookeeper-3.4.8 zookeeper
  5. # 设置配置文件
  6. cd /usr/zookeeper/conf
  7. cp zoo_sample.cfg zoo.cfg
  8. # 启动 zookeeper
  9. /usr/zookeeper/bin/zkServer.sh start
  10. # 查看 zookeeper 运行状态,如果出现 Mode: standalone 说明运行成功
  11. /usr/zookeeper/bin/zkServer.sh status

3.2 服务提供者

创建一个 Maven 项目(名为 dubbo-service 的 web 项目)。

pom.xml 配置:

  1. <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">
  2. <modelVersion>4.0.0</modelVersion>
  3. <groupId>com.light</groupId>
  4. <artifactId>dubbo-service</artifactId>
  5. <version>0.0.1-SNAPSHOT</version>
  6. <packaging>war</packaging>
  7. <dependencies>
  8. <dependency>
  9. <groupId>org.springframework</groupId>
  10. <artifactId>spring-core</artifactId>
  11. <version>4.3.10.RELEASE</version>
  12. </dependency>
  13. <dependency>
  14. <groupId>com.alibaba</groupId>
  15. <artifactId>dubbo</artifactId>
  16. <version>2.6.0</version>
  17. </dependency>
  18. <dependency>
  19. <groupId>com.101tec</groupId>
  20. <artifactId>zkclient</artifactId>
  21. <version>0.9</version>
  22. </dependency>
  23. </dependencies>
  24. </project>

web.xml 配置:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns="http://java.sun.com/xml/ns/javaee"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  5. id="WebApp_ID" version="3.0">
  6. <display-name>dubbo-service</display-name>
  7. <!-- spring容器 start -->
  8. <listener>
  9. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  10. </listener>
  11. <context-param>
  12. <param-name>contextConfigLocation</param-name>
  13. <param-value>classpath:applicationContext-dubbo.xml</param-value>
  14. </context-param>
  15. <!-- spring容器 end -->
  16. </web-app>

接口:

  1. public interface HelloService {
  2. String sayHello(String name);
  3. }

实现类:

  1. public class HelloServiceImpl implements HelloService {
  2. @Override
  3. public String sayHello(String name) {
  4. return "Hello," + name;
  5. }
  6. }

applicationContext-dubbo.xml 配置:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://code.alibabatech.com/schema/dubbo
  8. http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
  9. <dubbo:application name="hello-demo"/>
  10. <dubbo:registry address="zookeeper://192.168.2.14:2181"/>
  11. <dubbo:protocol name="dubbo" port="20880"/>
  12. <dubbo:service interface="com.light.dubbo.service.HelloService" ref="helloService"/>
  13. <bean id="helloService" class="com.light.dubbo.service.impl.HelloServiceImpl"/>
  14. </beans>

3.3 服务消费者

创建一个 Maven 项目(名为 dubbo-consumer 的 web 项目)。

pom.xml 配置:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>com.light</groupId>
  5. <artifactId>dubbo-consumer</artifactId>
  6. <version>0.0.1-SNAPSHOT</version>
  7. <packaging>war</packaging>
  8. <dependencies>
  9. <dependency>
  10. <groupId>org.springframework</groupId>
  11. <artifactId>spring-core</artifactId>
  12. <version>4.3.10.RELEASE</version>
  13. </dependency>
  14. <dependency>
  15. <groupId>org.springframework</groupId>
  16. <artifactId>spring-webmvc</artifactId>
  17. <version>4.3.10.RELEASE</version>
  18. </dependency>
  19. <dependency>
  20. <groupId>com.fasterxml.jackson.core</groupId>
  21. <artifactId>jackson-databind</artifactId>
  22. <version>2.9.3</version>
  23. </dependency>
  24. <dependency>
  25. <groupId>com.alibaba</groupId>
  26. <artifactId>dubbo</artifactId>
  27. <version>2.6.0</version>
  28. </dependency>
  29. <dependency>
  30. <groupId>com.101tec</groupId>
  31. <artifactId>zkclient</artifactId>
  32. <version>0.9</version>
  33. </dependency>
  34. </dependencies>
  35. </project>

web.xml 配置:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns="http://java.sun.com/xml/ns/javaee"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  5. id="WebApp_ID" version="3.0">
  6. <display-name>dubbo-consumer</display-name>
  7. <!-- spring容器 start -->
  8. <listener>
  9. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  10. </listener>
  11. <context-param>
  12. <param-name>contextConfigLocation</param-name>
  13. <param-value>classpath:applicationContext-dubbo.xml</param-value>
  14. </context-param>
  15. <!-- spring容器 end -->
  16. <!-- springmvc容器 start -->
  17. <servlet>
  18. <servlet-name>springmvc</servlet-name>
  19. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  20. <init-param>
  21. <param-name>contextConfigLocation</param-name>
  22. <param-value>classpath:springmvc.xml</param-value>
  23. </init-param>
  24. </servlet>
  25. <servlet-mapping>
  26. <servlet-name>springmvc</servlet-name>
  27. <url-pattern>/</url-pattern>
  28. </servlet-mapping>
  29. <!-- springmvc容器 end -->
  30. </web-app>

将 dubbo-service 项目中的 HelloService 接口复制到该项目(dubbo-consumer)中。

控制层:

  1. @Controller
  2. public class HelloController {
  3. @Autowired
  4. private HelloService helloService;
  5. @RequestMapping("hello")
  6. @ResponseBody
  7. public String hello(String name) {
  8. return this.helloService.sayHello(name);
  9. }
  10. }

applicationContext-dubbo.xml 配置:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://code.alibabatech.com/schema/dubbo
  8. http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
  9. <dubbo:application name="hello-demo"/>
  10. <dubbo:registry address="zookeeper://192.168.2.14:2181"/>
  11. <dubbo:protocol name="dubbo" port="20880"/>
  12. <dubbo:reference interface="com.light.dubbo.service.HelloService"/>
  13. </beans>

springmvc.xml 配置:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:mvc="http://www.springframework.org/schema/mvc"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xmlns:context="http://www.springframework.org/schema/context"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
  8. http://www.springframework.org/schema/mvc
  9. http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
  10. http://www.springframework.org/schema/context
  11. http://www.springframework.org/schema/context/spring-context-4.0.xsd">
  12. <!-- 只扫描含有@Controller注解的类 -->
  13. <context:component-scan base-package="com.light.dubbo.controller">
  14. <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
  15. </context:component-scan>
  16. <!-- 加载解析 @rquestMapping等注解的解析器 -->
  17. <mvc:annotation-driven/>
  18. </beans>

先启动服务提供者的项目(8080),再启动服务消费者的项目(8081)。打开浏览器访问http://localhost:8081/hello?name=jack,结果如下图:

四、监控

4.1 获取源码

  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 修改配置

  1. 解压 dubbo-monitor-simple-2.6.0-assembly.tar.gz 压缩包,修改 dubbo-monitor-simple-2.6.0\conf\dubbo.properties:
  1. dubbo.registry.address=zookeeper://192.168.2.14:2181
  1. 在服务提供者的配置文件中添加:
  1. <!-- 注册中心自动查找监控服务 -->
  2. <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 文件内容:

  1. dubbo.registry.address=zookeeper://192.168.2.14:2181
  2. dubbo.admin.root.password=root
  3. dubbo.admin.guest.password=guest

其中,配置中设置 2 个用户:root 和 guest。

最后启动 tomcat 容器,打开浏览器访问http://localhost:8080/,页面要求输入账号和密码,登录后效果图如下:

六、参考资料

Dubbo 官网

分享