Dubbo——入门介绍

深藏阁楼爱情的钟 2023-10-07 22:39 65阅读 0赞

目录

  • 1.概述
    • 1.1.什么是 Dubbo ?
    • 1.2.Dubbo 架构
  • 2.Dubbo 快速入门
    • 2.1.Zookeeper 安装
    • 2.2.创建项目
    • 2.3.代码实现
      • 2.3.1.dubbo-service 模块
      • 2.3.2.dubbo-web 模块
    • 2.4.本地启动
    • 2.5.使用 Dubbo 实现 PRC
      • 2.5.1.修改 dubbo-service 模块
      • 2.5.2.修改 dubbo-web 模块
      • 2.5.3.启动 dubbo-service 和 dubbo-web
      • 2.5.4.代码改进
  • 3.Dubbo 高级特性
    • 3.1.dubbo-admin
      • 3.1.1.概述
      • 3.1.2.安装
      • 3.1.3.启动
    • 3.2.序列化
      • 3.2.1.概述
      • 3.2.2.案例
    • 3.3.地址缓存
    • 3.4.超时
      • 3.4.1.概述
      • 3.4.2.解决方案
    • 3.5.重试
    • 3.6.多版本
    • 3.7.负载均衡
    • 3.8.集群容错
    • 3.9.服务降级

本文笔记整理来自黑马视频https://www.bilibili.com/video/BV1VE411q7dX?p=1,相关资料可在视频评论区进行获取。

1.概述

1.1.什么是 Dubbo ?

(1)Dubbo 是阿里巴巴公司开源的一个高性能、轻量级的 Java RPC 框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案

RPC,即 Remote Procedure Call,指远程过程调用。有非常多的协议和技术来都实现了RPC的过程。比如:HTTP REST风格,Java RMI规范、WebService SOAP 协议、Hession 等等。

(2)Dubbo 官网:http://dubbo.apache.org。

在这里插入图片描述

1.2.Dubbo 架构

(1)Dubbo 架构如下图所示:

在这里插入图片描述

(2)上图中的节点角色说明如下:


























Provider 暴露服务的服务提供方
Container 服务运行容器
Consumer 调用远程服务的服务消费方
Registry 服务注册与发现的注册中心
Monitor 统计服务的调用次数和调用时间的监控中心

2.Dubbo 快速入门

2.1.Zookeeper 安装

(1)Dubbo 官方推荐使用 Zookeeper 作为注册中心,Zookeeper 的官方地址为 https://zookeeper.apache.org/,可以从中下载其安装包,这里使用的版本为 3.5.6:
在这里插入图片描述
(2)Dubbo在 CentOS 7.7 中的安装步骤如下:

  • 将下载的安装包放到 /opt/zookeeper 目录下(也可自行设置);
  • 在 /opt/zookeeper 目录下解压该安装包,解压命令如下:

    tar -zxvf apache-zookeeper-3.5.6-bin.tar.gz

  • 进入到 conf 目录拷贝一个 zoo_sample.cfg,重命名为 zoo.cfg:

    进入到 conf 目录

    cd /opt/zookeeper/apache-zookeeper-3.5.6-bin/conf/

    拷贝

    cp zoo_sample.cfg zoo.cfg

  • 修改 zoo.cfg:

    打开目录

    cd /opt/zooKeeper/

    创建 zooKeeper 存储目录

    mkdir zkdata

    修改 zoo.cfg 后,保存并退出

    vim /opt/zooKeeper/apache-zooKeeper-3.5.6-bin/conf/zoo.cfg

在这里插入图片描述

(3)启动 Zookeeper

  1. cd /opt/zookeeper/apache-zookeeper-3.5.6-bin/bin/
  2. # 启动 ZooKeeper
  3. ./zkServer.sh start
  4. # 关闭 ZooKeeper
  5. ./zkServer.sh stop

在这里插入图片描述

(4)查看 ZooKeeper 状态,ZooKeeper 启动成功后,standalone 代表 ZooKeeper 没有搭建集群,现在是单节点。

  1. # 查看 ZooKeeper 状态
  2. ./zkServer.sh status

在这里插入图片描述

2.2.创建项目

① 在 IDEA 中创建名为 dubbo-pro 的空项目;

② 在 dubbo-pro 创建两个名为 dubbo-service 和 dubbo-web 的模块:

在这里插入图片描述

③ dubbo-service 模块的 pom.xml 如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>com.itheima</groupId>
  7. <artifactId>dubbo-service</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. <properties>
  10. <spring.version>5.1.9.RELEASE</spring.version>
  11. <dubbo.version>2.7.4.1</dubbo.version>
  12. <zookeeper.version>4.0.0</zookeeper.version>
  13. </properties>
  14. <dependencies>
  15. <!-- servlet3.0规范的坐标 -->
  16. <dependency>
  17. <groupId>javax.servlet</groupId>
  18. <artifactId>javax.servlet-api</artifactId>
  19. <version>3.1.0</version>
  20. <scope>provided</scope>
  21. </dependency>
  22. <!--spring的坐标-->
  23. <dependency>
  24. <groupId>org.springframework</groupId>
  25. <artifactId>spring-context</artifactId>
  26. <version>${spring.version}</version>
  27. </dependency>
  28. <!--springmvc的坐标-->
  29. <dependency>
  30. <groupId>org.springframework</groupId>
  31. <artifactId>spring-webmvc</artifactId>
  32. <version>${spring.version}</version>
  33. </dependency>
  34. <!--日志-->
  35. <dependency>
  36. <groupId>org.slf4j</groupId>
  37. <artifactId>slf4j-api</artifactId>
  38. <version>1.7.21</version>
  39. </dependency>
  40. <dependency>
  41. <groupId>org.slf4j</groupId>
  42. <artifactId>slf4j-log4j12</artifactId>
  43. <version>1.7.21</version>
  44. </dependency>
  45. <!--Dubbo的起步依赖,版本2.7之后统一为rg.apache.dubb -->
  46. <dependency>
  47. <groupId>org.apache.dubbo</groupId>
  48. <artifactId>dubbo</artifactId>
  49. <version>${dubbo.version}</version>
  50. </dependency>
  51. <!--ZooKeeper客户端实现 -->
  52. <dependency>
  53. <groupId>org.apache.curator</groupId>
  54. <artifactId>curator-framework</artifactId>
  55. <version>${zookeeper.version}</version>
  56. </dependency>
  57. <!--ZooKeeper客户端实现 -->
  58. <dependency>
  59. <groupId>org.apache.curator</groupId>
  60. <artifactId>curator-recipes</artifactId>
  61. <version>${zookeeper.version}</version>
  62. </dependency>
  63. </dependencies>
  64. </project>

④ dubbo-web 模块的 pom.xml 如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>com.itheima</groupId>
  7. <artifactId>dubbo-web</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. <packaging>war</packaging>
  10. <properties>
  11. <spring.version>5.1.9.RELEASE</spring.version>
  12. <dubbo.version>2.7.4.1</dubbo.version>
  13. <zookeeper.version>4.0.0</zookeeper.version>
  14. </properties>
  15. <dependencies>
  16. <!-- servlet3.0规范的坐标 -->
  17. <dependency>
  18. <groupId>javax.servlet</groupId>
  19. <artifactId>javax.servlet-api</artifactId>
  20. <version>3.1.0</version>
  21. <scope>provided</scope>
  22. </dependency>
  23. <!--spring的坐标-->
  24. <dependency>
  25. <groupId>org.springframework</groupId>
  26. <artifactId>spring-context</artifactId>
  27. <version>${spring.version}</version>
  28. </dependency>
  29. <!--springmvc的坐标-->
  30. <dependency>
  31. <groupId>org.springframework</groupId>
  32. <artifactId>spring-webmvc</artifactId>
  33. <version>${spring.version}</version>
  34. </dependency>
  35. <!--日志-->
  36. <dependency>
  37. <groupId>org.slf4j</groupId>
  38. <artifactId>slf4j-api</artifactId>
  39. <version>1.7.21</version>
  40. </dependency>
  41. <dependency>
  42. <groupId>org.slf4j</groupId>
  43. <artifactId>slf4j-log4j12</artifactId>
  44. <version>1.7.21</version>
  45. </dependency>
  46. <!--Dubbo的起步依赖,版本2.7之后统一为rg.apache.dubb -->
  47. <dependency>
  48. <groupId>org.apache.dubbo</groupId>
  49. <artifactId>dubbo</artifactId>
  50. <version>${dubbo.version}</version>
  51. </dependency>
  52. <!--ZooKeeper客户端实现 -->
  53. <dependency>
  54. <groupId>org.apache.curator</groupId>
  55. <artifactId>curator-framework</artifactId>
  56. <version>${zookeeper.version}</version>
  57. </dependency>
  58. <!--ZooKeeper客户端实现 -->
  59. <dependency>
  60. <groupId>org.apache.curator</groupId>
  61. <artifactId>curator-recipes</artifactId>
  62. <version>${zookeeper.version}</version>
  63. </dependency>
  64. <!--依赖 service 模块-->
  65. <dependency>
  66. <groupId>com.itheima</groupId>
  67. <artifactId>dubbo-service</artifactId>
  68. <version>1.0-SNAPSHOT</version>
  69. </dependency>
  70. </dependencies>
  71. <build>
  72. <plugins>
  73. <!--tomcat插件-->
  74. <plugin>
  75. <groupId>org.apache.tomcat.maven</groupId>
  76. <artifactId>tomcat7-maven-plugin</artifactId>
  77. <version>2.1</version>
  78. <configuration>
  79. <port>8000</port>
  80. <path>/</path>
  81. </configuration>
  82. </plugin>
  83. </plugins>
  84. </build>
  85. </project>

2.3.代码实现

  • 创建服务提供者 Provider 模块;
  • 创建服务消费者 Consumer 模块;
  • 在服务提供者模块编写 UserServiceImpl 提供服务;
  • 在服务消费者中的 UserController 远程调用 UserServiceImpl 提供的服务;
  • 分别启动两个服务,测试;

下面先在本地实现 service 和 web 模块:

2.3.1.dubbo-service 模块

在这里插入图片描述

UserService .java

  1. package com.itheima.service;
  2. public interface UserService {
  3. public String sayHello();
  4. }

UserServiceImpl.java

  1. package com.itheima.service.impl;
  2. import com.itheima.service.UserService;
  3. import org.springframework.stereotype.Service;
  4. @Service
  5. public class UserServiceImpl implements UserService {
  6. @Override
  7. public String sayHello() {
  8. return "Hello, dubbo!";
  9. }
  10. }

log4j.properties

  1. # DEBUG < INFO < WARN < ERROR < FATAL
  2. # Global logging configuration
  3. log4j.rootLogger=info, stdout,file
  4. # My logging configuration...
  5. # log4j.logger.com.tocersoft.school=DEBUG
  6. # log4j.logger.net.sf.hibernate.cache=debug
  7. # Console output...
  8. log4j.appender.stdout=org.apache.log4j.ConsoleAppender
  9. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
  10. log4j.appender.stdout.layout.ConversionPattern=%5p %d %C: %m%n
  11. log4j.appender.file=org.apache.log4j.FileAppender
  12. log4j.appender.file.File=../logs/iask.log
  13. log4j.appender.file.layout=org.apache.log4j.PatternLayout
  14. log4j.appender.file.layout.ConversionPattern=%d{
  15. yyyy-MM-dd HH:mm:ss} %l %m%n

applicationContext.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://dubbo.apache.org/schema/dubbo" xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  6. http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
  7. <context:component-scan base-package="com.itheima.service" />
  8. </beans>

2.3.2.dubbo-web 模块

在这里插入图片描述

UserController.java

  1. package com.itheima.controller;
  2. import com.itheima.service.UserService;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5. import org.springframework.web.bind.annotation.RestController;
  6. @RestController
  7. @RequestMapping("/user")
  8. public class UserController {
  9. @Autowired
  10. private UserService userService;
  11. @RequestMapping("/sayHello")
  12. public String sayHello() {
  13. return userService.sayHello();
  14. }
  15. }

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_2_5.xsd"
  5. version="2.5">
  6. <!-- spring -->
  7. <context-param>
  8. <param-name>contextConfigLocation</param-name>
  9. <param-value>classpath*:spring/applicationContext*.xml</param-value>
  10. </context-param>
  11. <listener>
  12. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  13. </listener>
  14. <!-- Springmvc -->
  15. <servlet>
  16. <servlet-name>springmvc</servlet-name>
  17. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  18. <!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载-->
  19. <init-param>
  20. <param-name>contextConfigLocation</param-name>
  21. <param-value>classpath:spring/springmvc.xml</param-value>
  22. </init-param>
  23. </servlet>
  24. <servlet-mapping>
  25. <servlet-name>springmvc</servlet-name>
  26. <url-pattern>*.do</url-pattern>
  27. </servlet-mapping>
  28. </web-app>

log4j.properties

  1. # DEBUG < INFO < WARN < ERROR < FATAL
  2. # Global logging configuration
  3. log4j.rootLogger=info, stdout,file
  4. # My logging configuration...
  5. # log4j.logger.com.tocersoft.school=DEBUG
  6. # log4j.logger.net.sf.hibernate.cache=debug
  7. # Console output...
  8. log4j.appender.stdout=org.apache.log4j.ConsoleAppender
  9. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
  10. log4j.appender.stdout.layout.ConversionPattern=%5p %d %C: %m%n
  11. log4j.appender.file=org.apache.log4j.FileAppender
  12. log4j.appender.file.File=../logs/iask.log
  13. log4j.appender.file.layout=org.apache.log4j.PatternLayout
  14. log4j.appender.file.layout.ConversionPattern=%d{
  15. yyyy-MM-dd HH:mm:ss} %l %m%n

springmvc.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://dubbo.apache.org/schema/dubbo"
  5. xmlns:mvc="http://www.springframework.org/schema/mvc"
  6. xmlns:context="http://www.springframework.org/schema/context"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  8. http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
  9. http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
  10. <mvc:annotation-driven/>
  11. <context:component-scan base-package="com.itheima.controller"/>
  12. </beans>

2.4.本地启动

(1)将 dubbo-service 模块进行安装:

在这里插入图片描述

在这里插入图片描述

(2)通过 tomcat 插件启动 dubbo-web:

在这里插入图片描述

在这里插入图片描述

(3)在浏览器中输入:

  1. http://localhost:8000/user/sayHello.do

结果如下:
在这里插入图片描述

2.5.使用 Dubbo 实现 PRC

在这里插入图片描述

2.5.1.修改 dubbo-service 模块

(1)修改 pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>com.itheima</groupId>
  7. <artifactId>dubbo-service</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. <!--改为 war-->
  10. <packaging>war</packaging>
  11. ...
  12. <!--加入 tomcat 插件,端口号设置为 9000-->
  13. <build>
  14. <plugins>
  15. <plugin>
  16. <groupId>org.apache.tomcat.maven</groupId>
  17. <artifactId>tomcat7-maven-plugin</artifactId>
  18. <version>2.1</version>
  19. <configuration>
  20. <port>9000</port>
  21. <path>/</path>
  22. </configuration>
  23. </plugin>
  24. </plugins>
  25. </build>
  26. </project>

(2)修改 UserServiceImpl.java

  1. package com.itheima.service.impl;
  2. import com.itheima.service.UserService;
  3. import org.apache.dubbo.config.annotation.Service;
  4. //下面两个注解所属的包不一样,第一个是 Spring 中的,第二个是 dubbo 中的
  5. //@Service //将该类的对象创建出来,然后放到 Spring 的 Ioc 容器中,即 bean 的定义
  6. @Service //将这个类提供的方法(服务)对外发布,将访问的地址 ip、端口、路径注册到注册中心(ZooKeeper)中
  7. public class UserServiceImpl implements UserService {
  8. @Override
  9. public String sayHello() {
  10. return "Hello, dubbo!";
  11. }
  12. }

(3)修改配置文件 applicationContext.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://dubbo.apache.org/schema/dubbo" xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  6. http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
  7. <!--<context:component-scan base-package="com.itheima.service" />-->
  8. <!--dubbo 的配置-->
  9. <!--1.配置项目的名称,唯一-->
  10. <dubbo:application name="dubbo-service"/>
  11. <!--2.配置注册中心的地址-->
  12. <dubbo:registry address="zookeeper://192.168.1.8:2181"/>
  13. <!--3.配置 dubbo 包扫描-->
  14. <dubbo:annotation package="com.itheima.service.impl" />
  15. </beans>

(4)添加 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_2_5.xsd"
  5. version="2.5">
  6. <!-- spring -->
  7. <context-param>
  8. <param-name>contextConfigLocation</param-name>
  9. <param-value>classpath*:spring/applicationContext*.xml</param-value>
  10. </context-param>
  11. <listener>
  12. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  13. </listener>
  14. </web-app>

(5)通过 tomcat 插件启动 dubbo-service

在这里插入图片描述

在这里插入图片描述

2.5.2.修改 dubbo-web 模块

(1)在 pom.xml 中去掉 web 模块对 service 模块的依赖,即注释掉下面的代码:

  1. <!--依赖 service 模块-->
  2. <dependency>
  3. <groupId>com.itheima</groupId>
  4. <artifactId>dubbo-service</artifactId>
  5. <version>1.0-SNAPSHOT</version>
  6. </dependency>

(2)注释之后,UserController.java 找不到 com.itheima.service.UserService.java

在这里插入图片描述

解决办法:在 dubbo-service 模块新建一个 UserService.java(应与 dubbo-service 中的一致):

  1. package com.itheima.service;
  2. public interface UserService {
  3. public String sayHello();
  4. }

(3)注释掉 web.xml 的 Spring 相关配置

  1. <!-- spring -->
  2. <context-param>
  3. <param-name>contextConfigLocation</param-name>
  4. <param-value>classpath*:spring/applicationContext*.xml</param-value>
  5. </context-param>
  6. <listener>
  7. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  8. </listener>

(4)修改 UserController.java

  1. package com.itheima.controller;
  2. import com.itheima.service.UserService;
  3. import org.apache.dubbo.config.annotation.Reference;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RestController;
  7. @RestController
  8. @RequestMapping("/user")
  9. public class UserController {
  10. /*
  11. @Reference:
  12. 1.从 zookeeper 注册中心获取 userService 的访问 url
  13. 2.进行远程调用 RPC
  14. 3.将结果封装为一个代理对象,给变量赋值
  15. */
  16. //@Autowired // Spring 中的注解,本地注入
  17. @Reference // dubbo 中的注解,远程注入
  18. private UserService userService;
  19. @RequestMapping("/sayHello")
  20. public String sayHello() {
  21. return userService.sayHello();
  22. }
  23. }

(5)修改配置文件 springmvc.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://dubbo.apache.org/schema/dubbo"
  5. xmlns:mvc="http://www.springframework.org/schema/mvc"
  6. xmlns:context="http://www.springframework.org/schema/context"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  8. http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
  9. http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
  10. <mvc:annotation-driven/>
  11. <context:component-scan base-package="com.itheima.controller"/>
  12. <!--dubbo的配置-->
  13. <!--1.配置项目的名称,唯一-->
  14. <dubbo:application name="dubbo-web" >
  15. <dubbo:parameter key="qos.port" value="33333"/>
  16. </dubbo:application>
  17. <!--2.配置注册中心的地址-->
  18. <dubbo:registry address="zookeeper://192.168.1.8:2181"/>
  19. <!--3.配置dubbo包扫描-->
  20. <dubbo:annotation package="com.itheima.controller" />
  21. </beans>

2.5.3.启动 dubbo-service 和 dubbo-web

(1)启动 dubbo-service

在这里插入图片描述

(2)启动 dubbo-web

在这里插入图片描述

(3)在浏览器中输入:

  1. http://localhost:8000/user/sayHello.do

结果如下之前的本地调用一致:

在这里插入图片描述

2.5.4.代码改进

(1)如下图所示,为了减少代码冗余,我们可以将接口抽取出来,存放到 dubbo-interface 模块中,然后再让 dubbo-service 和 dubbo-web 依赖其即可。
在这里插入图片描述

(2)创建 dubbo-interface 模块

在这里插入图片描述

(3)将 dubbo-service 中的 UserService.java 接口复制到 dubbo-interface,注意全类名需要一样。

  1. package com.itheima.service;
  2. public interface UserService {
  3. public String sayHello();
  4. }

(4)让 dubbo-service 和 dubbo-web 依赖 dubbo-interface,即在它们的 pom.xml 中加入下面的依赖:

  1. <dependency>
  2. <groupId>com.itheima</groupId>
  3. <artifactId>dubbo-interface</artifactId>
  4. <version>1.0-SNAPSHOT</version>
  5. </dependency>

(5)将 dubbo-interfacee 模块进行安装:

在这里插入图片描述

在这里插入图片描述

(6)启动 dubbo-service 和 dubbo-web,浏览器中输入

  1. http://localhost:8000/user/sayHello.do

结果如下之前的一致:
在这里插入图片描述

3.Dubbo 高级特性

3.1.dubbo-admin

3.1.1.概述

  • dubbo-admin 管理平台,是图形化的服务管理页面;
  • 从注册中心中获取到所有的提供者 / 消费者进行配置管理;
  • 路由规则、动态配置、服务降级、访问控制、权重调整、负载均衡等管理功能;
  • dubbo-admin 是一个前后端分离的项目。前端使用 Vue,后端使用 Springboot;
  • 安装 dubbo-admin 其实就是部署该项目;

3.1.2.安装

(1)修改 dubbo-admin-server 中的 application.properties,即将 zookeeper 的 IP 地址改为与实际情况一样的。

在这里插入图片描述

  1. # centers in dubbo2.7
  2. admin.registry.address=zookeeper://192.168.1.8:2181
  3. admin.config-center=zookeeper://192.168.1.8:2181
  4. admin.metadata-report.address=zookeeper://192.168.1.8:2181

(2)构建项目(需要在 windows 下安装 Maven 和 node.js):使用 Windows PowerShell 打开该项目的根目录,执行下面的命令:

  1. mvn clean package

在这里插入图片描述

最后安装结束后的情况如下图所示,安装过程可能长,需耐心等待。

在这里插入图片描述

3.1.3.启动

(1)在 Windows PowerShell 中运行 dubbo-admin-distribution\target 目录下的 dubbo-admin-0.1.jar

在这里插入图片描述

即执行如下命令:

  1. java -jar .\dubbo-admin-0.1.jar

在这里插入图片描述

(2)在 Windows PowerShell 中的 dubbo-admin-ui 目录下执行如下指令:

  1. npm run dev

在这里插入图片描述

(3)在浏览器中输出如下地址,即可看到 dubbo-admin 的主页

  1. http://localhost:8081

在这里插入图片描述

点击服务查询后,输入用户名和密码(初始时均为 root),登录即可:

在这里插入图片描述

3.2.序列化

3.2.1.概述

在这里插入图片描述

  • dubbo 内部已经将序列化和反序列化的过程内部封装了;
  • 我们只需要在定义 pojo 类时实现 Serializable 接口即可;
  • 一般会定义一个公共的 pojo 模块,让生产者和消费者都依赖该模块;

3.2.2.案例

(1)新建一个名为 dubbo-pojo 的模块。

(2)定义一个 pojo 类 User:

  1. package com.itheima.pojo;
  2. import java.io.Serializable;
  3. /**
  4. * 注意!!!
  5. * 将来所有的pojo类都需要实现Serializable接口
  6. */
  7. public class User implements Serializable {
  8. private int id;
  9. private String username;
  10. private String password;
  11. public User() {
  12. }
  13. public User(int id, String username, String password) {
  14. this.id = id;
  15. this.username = username;
  16. this.password = password;
  17. }
  18. public int getId() {
  19. return id;
  20. }
  21. public void setId(int id) {
  22. this.id = id;
  23. }
  24. public String getUsername() {
  25. return username;
  26. }
  27. public void setUsername(String username) {
  28. this.username = username;
  29. }
  30. public String getPassword() {
  31. return password;
  32. }
  33. public void setPassword(String password) {
  34. this.password = password;
  35. }
  36. }

(3)在 dubbo-interface 模块中的 pom.xml 添加如下对 dubbo-pojo 模块的依赖:

  1. <dependencies>
  2. <dependency>
  3. <groupId>com.itheima</groupId>
  4. <artifactId>dubbo-pojo</artifactId>
  5. <version>1.0-SNAPSHOT</version>
  6. </dependency>
  7. </dependencies>

然后在 UserService.java 添加一个查询用户的抽象方法:

  1. //查询用户
  2. public User findUserById(int id);

(4)在 dobbo-service 模块中的 UserServiceImpl.java 中添加相应的实现方法:

  1. @Override
  2. public User findUserById(int id) {
  3. //模拟查询 User 对象
  4. User user = new User(1,"zhangsan","123");
  5. return user;
  6. }

(5)在 dubbo-web 模块中的 UserController.java 中添加如下方法:

  1. @RequestMapping("/find")
  2. public User find(int id){
  3. return userService.findUserById(id);
  4. }

(6)重新对 dubbo-interface 模块和 dubbo-pojo 模块进行安装,并且启动 dubbo-service 模块和 dubbo-web 模块。然后在浏览器中输入:

  1. http://localhost:8000/user/find.do?id=1

其结果如下:

在这里插入图片描述

3.3.地址缓存

在这里插入图片描述

3.4.超时

3.4.1.概述

在这里插入图片描述

3.4.2.解决方案

(1)dubbo 利用超时机制来解决这个问题,设置一个超时时间,在这个时间段内,无法完成服务访问,则自动断开连接。

(2)使用 timeout 属性配置超时时间,默认值 1000,单位是毫秒。

(3)修改 dubbo-service 模块中的 UserServiceImpl.java,即在服务方进行设置:

  1. @Service(timeout = 3000, retries = 0)
  2. public class UserServiceImpl implements UserService {
  3. ...
  4. }

也可在请求方设置:

  1. public class UserController {
  2. //@Autowired // Spring 中的注解,本地注入
  3. // dubbo 中的注解,远程注入
  4. @Reference(timeout = 1000)
  5. private UserService userService;
  6. ...
  7. }

注:由于服务方更清楚某个服务的预计时长,因此建议在服务方设置 timeout。

3.5.重试

在这里插入图片描述
设置如下:

  1. @Service(timeout = 3000, retries = 2)
  2. public class UserServiceImpl implements UserService {
  3. ...
  4. }

3.6.多版本

在这里插入图片描述

(1)在 dubbo-service 模块中新建 UserServiceImpl2.java 并设置 version:

  1. @Service(version = "v2.0")
  2. public class UserServiceImpl2 implements UserService {
  3. public String sayHello() {
  4. return "hello dubbo hello!~";
  5. }
  6. public User findUserById(int id) {
  7. System.out.println("new....");
  8. //查询User对象
  9. User user = new User(1,"zhangsan", "123");
  10. return user;
  11. }
  12. }

(2)设置 UserServiceImpl .java 中的 version

  1. @Service(version = "v1.0")
  2. public class UserServiceImpl implements UserService {
  3. ...
  4. }

(3)在 UserController.java 中注入 UserService 时选择需要的版本即可。

  1. @RestController
  2. @RequestMapping("/user")
  3. public class UserController {
  4. ...
  5. @Reference(version = "v2.0")
  6. private UserService userService;
  7. ...
  8. }

3.7.负载均衡

在这里插入图片描述

(1)在多个服务方设置 weight,下面演示一个:

  1. @Service(weight = 100)
  2. public class UserServiceImpl implements UserService {
  3. ...
  4. }

(2)在请求方设置负载均衡策略:

  1. @RestController
  2. @RequestMapping("/user")
  3. public class UserController {
  4. @Reference(loadbalance = "random")
  5. private UserService userService;
  6. ...
  7. }

3.8.集群容错

在这里插入图片描述

在多个服务方设置集群容错模式,下面演示一个:

  1. @RestController
  2. @RequestMapping("/user")
  3. public class UserController {
  4. @Reference(cluster = "failover")
  5. private UserService userService;
  6. ...
  7. }

3.9.服务降级

(1)服务降级是当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行。

在这里插入图片描述

(2)在多个服务方设置服务降级模式,下面演示一个:

  1. @RestController
  2. @RequestMapping("/user")
  3. public class UserController {
  4. //不再调用 userService 的服务
  5. @Reference(mock = "force:return null ")
  6. private UserService userService;
  7. ...
  8. }

发表评论

表情:
评论列表 (有 0 条评论,65人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Dubbo框架入门介绍

      背景    随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不

    相关 Dubbo 入门介绍

    一、什么是Dubbo Dubbo 是阿里巴巴公司一个开源的高性能服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案,使得应用可通过

    相关 dubbo笔记——入门介绍

    一、基本介绍 1、背景说明         随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已经无法应对,分布式服务架构以及流动计算架构势在必行,急需一