Dubbo——入门介绍

news2024/10/7 18:29:06

目录

  • 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

cd /opt/zookeeper/apache-zookeeper-3.5.6-bin/bin/
# 启动 ZooKeeper
./zkServer.sh start
# 关闭 ZooKeeper
./zkServer.sh stop

在这里插入图片描述

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

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

在这里插入图片描述

2.2.创建项目

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

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

在这里插入图片描述

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

<?xml version="1.0" encoding="UTF-8"?>
<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.itheima</groupId>
    <artifactId>dubbo-service</artifactId>
    <version>1.0-SNAPSHOT</version>


    <properties>
        <spring.version>5.1.9.RELEASE</spring.version>
        <dubbo.version>2.7.4.1</dubbo.version>
        <zookeeper.version>4.0.0</zookeeper.version>
    </properties>

    <dependencies>
        <!-- servlet3.0规范的坐标 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <!--spring的坐标-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!--springmvc的坐标-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <!--日志-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.21</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.21</version>
        </dependency>

        <!--Dubbo的起步依赖,版本2.7之后统一为rg.apache.dubb -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>${dubbo.version}</version>
        </dependency>
        <!--ZooKeeper客户端实现 -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>${zookeeper.version}</version>
        </dependency>
        <!--ZooKeeper客户端实现 -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>${zookeeper.version}</version>
        </dependency>
    </dependencies>
</project>

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

<?xml version="1.0" encoding="UTF-8"?>
<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.itheima</groupId>
    <artifactId>dubbo-web</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <properties>
        <spring.version>5.1.9.RELEASE</spring.version>
        <dubbo.version>2.7.4.1</dubbo.version>
        <zookeeper.version>4.0.0</zookeeper.version>
    </properties>

    <dependencies>
        <!-- servlet3.0规范的坐标 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <!--spring的坐标-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!--springmvc的坐标-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <!--日志-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.21</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.21</version>
        </dependency>

        <!--Dubbo的起步依赖,版本2.7之后统一为rg.apache.dubb -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>${dubbo.version}</version>
        </dependency>
        <!--ZooKeeper客户端实现 -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>${zookeeper.version}</version>
        </dependency>
        <!--ZooKeeper客户端实现 -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>${zookeeper.version}</version>
        </dependency>

        <!--依赖 service 模块-->
        <dependency>
            <groupId>com.itheima</groupId>
            <artifactId>dubbo-service</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!--tomcat插件-->
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.1</version>
                <configuration>
                    <port>8000</port>
                    <path>/</path>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

2.3.代码实现

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

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

2.3.1.dubbo-service 模块

在这里插入图片描述

UserService .java

package com.itheima.service;

public interface UserService {
    public String sayHello();
}

UserServiceImpl.java

package com.itheima.service.impl;

import com.itheima.service.UserService;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements UserService {
    
    @Override
    public String sayHello() {
        return "Hello, dubbo!";
    }
}

log4j.properties

# DEBUG < INFO < WARN < ERROR < FATAL
# Global logging configuration
log4j.rootLogger=info, stdout,file

# My logging configuration...
# log4j.logger.com.tocersoft.school=DEBUG
# log4j.logger.net.sf.hibernate.cache=debug

# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p %d %C: %m%n

log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=../logs/iask.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}  %l  %m%n

applicationContext.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://dubbo.apache.org/schema/dubbo" xmlns:context="http://www.springframework.org/schema/context"
	   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        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">


	<context:component-scan base-package="com.itheima.service" />

</beans>

2.3.2.dubbo-web 模块

在这里插入图片描述

UserController.java

package com.itheima.controller;

import com.itheima.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {
    
    @Autowired
    private UserService userService;
    
    @RequestMapping("/sayHello")
    public String sayHello() {
        return userService.sayHello();
    }
}

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"
         version="2.5">

		 
	<!-- spring -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:spring/applicationContext*.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
		 
	<!-- Springmvc -->	 
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/springmvc.xml</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
    
</web-app>

log4j.properties

# DEBUG < INFO < WARN < ERROR < FATAL
# Global logging configuration

log4j.rootLogger=info, stdout,file
# My logging configuration...
# log4j.logger.com.tocersoft.school=DEBUG
# log4j.logger.net.sf.hibernate.cache=debug

# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p %d %C: %m%n

log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=../logs/iask.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}  %l  %m%n

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

2.4.本地启动

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

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

(3)在浏览器中输入:

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

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

2.5.使用 Dubbo 实现 PRC

在这里插入图片描述

2.5.1.修改 dubbo-service 模块

(1)修改 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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.itheima</groupId>
    <artifactId>dubbo-service</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--改为 war-->
    <packaging>war</packaging>

	...	

	<!--加入 tomcat 插件,端口号设置为 9000-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.1</version>
                <configuration>
                    <port>9000</port>
                    <path>/</path>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

(2)修改 UserServiceImpl.java

package com.itheima.service.impl;

import com.itheima.service.UserService;
import org.apache.dubbo.config.annotation.Service;

//下面两个注解所属的包不一样,第一个是 Spring 中的,第二个是 dubbo 中的
//@Service    //将该类的对象创建出来,然后放到 Spring 的 Ioc 容器中,即 bean 的定义
@Service      //将这个类提供的方法(服务)对外发布,将访问的地址 ip、端口、路径注册到注册中心(ZooKeeper)中
public class UserServiceImpl implements UserService {
    
    @Override
    public String sayHello() {
        return "Hello, dubbo!";
    }
}

(3)修改配置文件 applicationContext.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://dubbo.apache.org/schema/dubbo" xmlns:context="http://www.springframework.org/schema/context"
	   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        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">

	<!--<context:component-scan base-package="com.itheima.service" />-->

	<!--dubbo 的配置-->
	<!--1.配置项目的名称,唯一-->
	<dubbo:application name="dubbo-service"/>
	<!--2.配置注册中心的地址-->
	<dubbo:registry address="zookeeper://192.168.1.8:2181"/>
	<!--3.配置 dubbo 包扫描-->
	<dubbo:annotation package="com.itheima.service.impl" />
</beans>

(4)添加 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"
         version="2.5">
    
	<!-- spring -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:spring/applicationContext*.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    
</web-app>

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

在这里插入图片描述

在这里插入图片描述

2.5.2.修改 dubbo-web 模块

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

<!--依赖 service 模块-->
<dependency>
    <groupId>com.itheima</groupId>
    <artifactId>dubbo-service</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

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

在这里插入图片描述

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

package com.itheima.service;

public interface UserService {
    public String sayHello();
}

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

<!-- spring -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:spring/applicationContext*.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

(4)修改 UserController.java

package com.itheima.controller;

import com.itheima.service.UserService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {
    
    /*
        @Reference:
        1.从 zookeeper 注册中心获取 userService 的访问 url
        2.进行远程调用 RPC
        3.将结果封装为一个代理对象,给变量赋值
     */
    //@Autowired  // Spring 中的注解,本地注入
    @Reference    // dubbo 中的注解,远程注入
    private UserService userService;
    
    @RequestMapping("/sayHello")
    public String sayHello() {
        return userService.sayHello();
    }
}

(5)修改配置文件 springmvc.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://dubbo.apache.org/schema/dubbo"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
         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">

    <mvc:annotation-driven/>
    <context:component-scan base-package="com.itheima.controller"/>

    <!--dubbo的配置-->
    <!--1.配置项目的名称,唯一-->
    <dubbo:application name="dubbo-web" >
        <dubbo:parameter key="qos.port" value="33333"/>
    </dubbo:application>
    <!--2.配置注册中心的地址-->
    <dubbo:registry address="zookeeper://192.168.1.8:2181"/>
    <!--3.配置dubbo包扫描-->
    <dubbo:annotation package="com.itheima.controller" />

</beans>

2.5.3.启动 dubbo-service 和 dubbo-web

(1)启动 dubbo-service

在这里插入图片描述

(2)启动 dubbo-web

在这里插入图片描述

(3)在浏览器中输入:

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,注意全类名需要一样。

package com.itheima.service;

public interface UserService {
    public String sayHello();
}

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

<dependency>
    <groupId>com.itheima</groupId>
    <artifactId>dubbo-interface</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

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

在这里插入图片描述

在这里插入图片描述

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

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 地址改为与实际情况一样的。

在这里插入图片描述

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

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

mvn clean package

在这里插入图片描述

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

在这里插入图片描述

3.1.3.启动

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

在这里插入图片描述

即执行如下命令:

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

在这里插入图片描述

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

npm run dev

在这里插入图片描述

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

http://localhost:8081

在这里插入图片描述

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

在这里插入图片描述

3.2.序列化

3.2.1.概述

在这里插入图片描述

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

3.2.2.案例

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

(2)定义一个 pojo 类 User:

package com.itheima.pojo;

import java.io.Serializable;

/**
 * 注意!!!
 * 将来所有的pojo类都需要实现Serializable接口
 */
public class User implements Serializable {
    private int id;
    private String username;
    private String password;
    
    public User() {
    }
    
    public User(int id, String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }
    
    public int getId() {
        return id;
    }
    
    public void setId(int 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;
    }
}

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

<dependencies>
    <dependency>
        <groupId>com.itheima</groupId>
        <artifactId>dubbo-pojo</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
</dependencies>

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

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

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

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

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

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

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

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,即在服务方进行设置:

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

也可在请求方设置:

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

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

3.5.重试

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

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

3.6.多版本

在这里插入图片描述

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

@Service(version = "v2.0")
public class UserServiceImpl2 implements UserService {

    public String sayHello() {
        return "hello dubbo hello!~";
    }

    public User findUserById(int id) {
        System.out.println("new....");
        //查询User对象
        User user = new User(1,"zhangsan", "123");
        return user;
    }
}

(2)设置 UserServiceImpl .java 中的 version

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

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

@RestController
@RequestMapping("/user")
public class UserController {

	...
	
    @Reference(version = "v2.0")
    private UserService userService;
  
	...
}

3.7.负载均衡

在这里插入图片描述

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

@Service(weight = 100)
public class UserServiceImpl implements UserService {
    ...
}

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

@RestController
@RequestMapping("/user")
public class UserController {

    @Reference(loadbalance = "random")
    private UserService userService;

	...
}

3.8.集群容错

在这里插入图片描述

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

@RestController
@RequestMapping("/user")
public class UserController {

    @Reference(cluster = "failover")
    private UserService userService;

	...
}

3.9.服务降级

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

在这里插入图片描述

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

@RestController
@RequestMapping("/user")
public class UserController {
	
	//不再调用 userService 的服务
    @Reference(mock = "force:return null ")
    private UserService userService;

	...
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/169328.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

可免费编辑 PDF 内容的 7 大 PDF 编辑工具

有时您可能希望编辑 PDF 文档中的敏感信息&#xff0c;例如财务帐号和 ID 号&#xff0c;以便在不泄露隐私的情况下共享 PDF。编辑 PDF 是从 PDF 中删除私有内容。使用PDF 编辑工具可以轻松完成编辑。市场上有这么多工具&#xff0c;您需要选择最好的一种。 7 大 PDF 编辑工具 …

data analysis and predict

data anlysis and predict 谢邀&#xff0c;本人正在崩溃和兴奋间反复横跳&#xff08;崩溃居多&#xff09;&#xff0c;anyway, 我心态超好的&#xff01;besides, 仅供个人学习查阅&#xff0c;不具任何参考价值&#xff01;&#xff01;&#xff01; &#xff08;小边不想努…

路由信息协议RIP

文章目录路由信息协议RIP一、Routing Information Protocol的定义二、RIP的基本工作过程三、“坏消息传播得慢”的问题四、总结路由信息协议RIP 一、Routing Information Protocol的定义 RIP是分布式的基于距离向量的路由选择协议 协议RIP的特点是&#xff1a; 仅和相邻路由…

Java数据结构(泛型)

1、集合框架 Java 集合框架Java Collection Framework &#xff0c;又被称为容器container &#xff0c;是定义在 java.util 包下的一组接口interfaces 和其实现类classes 。 其主要表现为将多个元素element 置于一个单元中&#xff0c;用于对这些元素进行快速、便捷的存储sto…

【XML了解】xml与hxml 标记语言学习

XML与HXML的区别 XML 被设计用来传输和存储数据&#xff0c;结构化、存储以及传输信息&#xff08;如&#xff1a;数据包&#xff09; XML 被设计用来传输和存储数据&#xff0c;其焦点是数据的内容 XML 标签没有被预定义, 需要自行定义标签 HTML 被设计用来表现和展示数据&…

数组常用方法总结 (7) :copyWithin / fill / reduce / reduceRight

copyWithin 将指定位置的元素复制到数组的其他位置。返回值为移动后数组。原始数组的内容会被改变&#xff0c;原始数组的长度不会改变。arr.copyWithin(index, startIndex, endIndex)第一个参数为&#xff0c;期望被复制的内容将要插入的位置。第二个参数为&#xff0c;数组中…

SpringBoot 参数接收只看这一篇文章就够了

好久没有写过接口了&#xff0c;最近在写一些基础接口&#xff0c;在写参数接口接收参数的时候居然想不起来&#xff0c;会有那么一丝丝的怀疑&#xff0c;虽然并不会影响编码&#xff0c;但是说明一个问题&#xff0c;没有系统的总结知识&#xff0c;没有温故知新&#xff0c;…

PMP真的有用吗?

作为一个考了PMP的前辈来说&#xff0c;是有用的。PMP 含金量&#xff0c;PMP有没有用&#xff0c;这类问题一直是大家关注的重点&#xff0c;知乎上几个相关问题热度也一直很高。友情提示一句&#xff1a;PMP 就是一个证书&#xff0c;能起到加分和门槛的作用&#xff0c;技术…

Diazo Biotin-PEG3-DBCO,二苯并环辛炔PEG3重氮生物素,无铜 Click Chemistry

Diazo Biotin-PEG3-DBCO反应原理&#xff1a;Diazo Biotin-PEG3-DBCO 是一种点击化学标记生物素&#xff0c;可通过无铜 Click Chemistry 与叠氮化物发生反应。重氮允许使用连二亚硫酸钠 (Na2S2O4) 从链霉亲和素中有效释放捕获的生物素化分子。点击化学生物素标记试剂包含各种点…

基于麻雀算法优化的深度极限学习机DLM的预测算法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

基于SpringBoot的SSMP整合(业务层表现层)

基于SpringBoot的SSMP整合&#xff08;数据层&#xff09;https://blog.csdn.net/weixin_51882166/article/details/128693739?spm1001.2014.3001.5502 标准CRUD Service层接口定义与数据层接口定义具有较大差距。 定义Service接口&#xff1a; package com.example.ssmp_…

蓝桥杯STM32G431RBT6学习——LCD

蓝桥杯STM32G431RBT6学习——LCD 前言 作为在开发板上最显眼的LCD屏幕&#xff0c;自然而然也是每年的必考考点。国信长天开发板使用的是一块2.4寸&#xff08;240*320&#xff09;的TFT-LCD液晶屏&#xff0c;其引脚占用如下&#xff1a; 其中&#xff0c;CS为片选信号引脚…

【Netty】实现IM聊天室案例Demo

文章目录1、WebSocket链接建立2、实现用户上线功能3、私聊发送消息注意&#xff1a; 该文章不会详细介绍Netty相关概念和原理&#xff0c;主要目的是介绍如何快速构建聊天室Demo 不会在文章主体过多说明代码流程&#xff0c;文章中的代码已经配备了详细的注释 1、WebSocket链接…

网站建设 之 用js写wasm

为什么要这么做&#xff1f;编译js比解释js更快是必然的wasm是什么&#xff1f;我期望是一个二进制文件WebAssembly&#xff08;又名wasm&#xff09;是一种高效的&#xff0c;低级别的编程语言。 它让我们能够使用JavaScript以外的语言&#xff08;例如C&#xff0c;C &#x…

【Linux】进度条小程序

目录一.\r && \n二.行缓存区概念问题&#xff1a;解答&#xff1a;检测&#xff1a;三.进度条1.进度动态条2.进度百分比3.小装饰4.颜色该篇博客会主要按步骤推导出一个在Linux上运行的进度条小程序&#xff0c;会用到vim编辑器和gcc编译器&#xff0c;如果对这两个软件…

Centos7安装、卸载nginx及配置,配置成系统服务(一步到位)

目录 前言 一、下载安装解压 1.进入临时文件夹里&#xff08;随便一个都行&#xff09; 2.下载并安装nginx压缩包 3.解压该压缩包 4.创建目标文件夹 5.&#xff08;默认会安装在/usr/local/nginx&#xff09;这里通过configure命令指定安装目录 6.编译安装 7.最后生成的…

一、初始Numpy

1、numpy简介 简介 Numpy&#xff08;Numerical Python&#xff09;是Python语言的一个扩展程序库&#xff0c;支持大量的维度数组与矩阵运算&#xff0c;此外也针对数组运算提供大量的数学函数库 Numpy的前身Numeric最早是有Jim Hugunin与其他协作者共同开发&#xff0c;20…

十五天学会Autodesk Inventor,看完这一系列就够了(九),主题/色彩/单位设置

众所周知&#xff0c;Autocad是一款用于二维绘图、详细绘制、设计文档和基本三维设计&#xff0c;现已经成为国际上广为流行的绘图工具。Autodesk Inventor软件也是美国AutoDesk公司推出的三维可视化实体模拟软件。因为很多人都熟悉Autocad&#xff0c;所以再学习Inventor&…

使用SpringBoot创建web项目,并使用外部Tomcat

使用SpringBoot创建web项目&#xff0c;并使用外部Tomcat 目录使用SpringBoot创建web项目&#xff0c;并使用外部Tomcat简单介绍&#xff1a;特点&#xff1a;步骤简介下面就使用SpringBoot创建一个web工程&#xff0c;并且使用外部的Tomcat和实现对jsp的支持&#xff1a;一、创…

AIDL 应用间简单通信demo及基本问题

AIDL:Android Interface Definition Language,即Android接口定义语言。 他的作用大家已经知道了&#xff0c;有些童鞋对于其中的使用细节可能会有一些理解误差&#xff0c;并且会造成一写异常或者通讯失败。 我们先看几个关键点再看代码&#xff0c;如果项目不符合这几点&…