首页 > 其他分享 >22-Dubbo

22-Dubbo

时间:2023-02-28 23:33:33浏览次数:50  
标签:Dubbo 服务 22 dubbo HelloService 服务提供者 org

1. Dubbo 概述

1.1 Dubbo 简介

Apache Dubbo 是一款高性能的 Java RPC 框架。其前身是阿里巴巴公司开源的一个高性能、轻量级的开源 Java RPC 框架,可以和 Spring 框架无缝集成。

Dubbo 官网地址:http://dubbo.apache.org/zh-cn/

Dubbo提供了三大核心能力:面向接口的远程方法调用、智能容错和负载均衡、服务自动注册和发现。


什么是 RPC?

RPC 全称为 Remote Procedure Call,即远程过程调用。比如两台服务器 A 和 B,A 服务器上部署一个应用,B 服务器上部署一个应用,A 服务器上的应用想调用 B 服务器上的应用提供的方法,由于两个应用不在一个内存空间,不能直接调用,所以需要通过网络来表达调用的语义和传达调用的数据。

需要注意的是 RPC 并不是一个具体的技术,而是指整个网络远程调用过程。

RPC 是一个泛化的概念,严格来说一切远程过程调用手段都属于 RPC 范畴。各种开发语言都有自己的 RPC 框架。Java 中的 RPC 框架比较多,广泛使用的有 RMI、Hessian、Dubbo 等。

1.2 Dubbo 架构

调用关系说明:

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

2. ZooKeeper 快速入门

通过前面的 Dubbo 架构图可以看到,Registry(服务注册中心)在其中起着至关重要的作用。Dubbo 官方推荐使用 ZooKeeper 作为服务注册中心。

2.1 ZooKeeper 简介

ZooKeeper 是 Apache Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbo 服务的注册中心,工业强度较高,可用于生产环境,并推荐使用 。

ZooKeeper 树型目录服务:

流程说明:

  • 服务提供者(Provider) 启动时,向 /dubbo/com.foo.BarService/providers 目录下写入自己的 URL 地址。
  • 服务消费者(Consumer) 启动时,订阅 /dubbo/com.foo.BarService/providers 目录下的提供者 URL 地址。并向 /dubbo/com.foo.BarService/consumers 目录下写入自己的 URL 地址。
  • 监控中心(Monitor) 启动时,订阅 /dubbo/com.foo.BarService 目录下的所有提供者和消费者 URL 地址。

2.2 安装 ZooKeeper

  1. 解压压缩包到指定目录:tar -zxvf zookeeper-3.4.6.tar.gz -C /usr/local/
  2. 进入 zookeeper-3.4.6 目录,创建 data 目录:mkdir data
  3. 进入 conf 目录 ,把 zoo_sample.cfg 改名为 zoo.cfg,并修改文件:dataDir=/root/zookeeper-3.4.6/data

2.3 启动、停止 ZooKeeper

进入 ZooKeeper 的 bin 目录:

启动服务命令
./zkServer.sh start

停止服务命令
./zkServer.sh stop

查看服务状态:
./zkServer.sh status

操作示例:

3. Dubbo 快速入门

Dubbo 作为一个 RPC 框架,其最核心的功能就是要实现跨网络的远程调用。本小节就是要创建两个应用,一个作为服务的提供方,一个作为服务的消费方。通过 Dubbo 来实现服务消费方远程调用服务提供方的方法。

3.1 服务提供方

a. pom.xml

创建 Maven 工程(打包方式为 war)dubbo_provider,在 pom.xml 文件中导入如下坐标。

<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <maven.compiler.source>1.8</maven.compiler.source>
  <maven.compiler.target>1.8</maven.compiler.target>
  <spring.version>5.0.5.RELEASE</spring.version>
</properties>
<dependencies>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jms</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <!-- dubbo相关 -->
  <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.6.0</version>
  </dependency>
  <dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.4.7</version>
  </dependency>
  <dependency>
    <groupId>com.github.sgroschupf</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.1</version>
  </dependency>
  <dependency>
    <groupId>javassist</groupId>
    <artifactId>javassist</artifactId>
    <version>3.12.1.GA</version>
  </dependency>
  <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.47</version>
  </dependency>
</dependencies>
<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>2.3.2</version>
      <configuration>
        <source>1.8</source>
        <target>1.8</target>
      </configuration>
    </plugin>
    <plugin>
      <groupId>org.apache.tomcat.maven</groupId>
      <artifactId>tomcat7-maven-plugin</artifactId>
      <configuration>
        <!-- 指定端口 -->
        <port>8081</port>
        <!-- 请求路径 -->
        <path>/</path>
      </configuration>
    </plugin>
  </plugins>
</build>

b. 创建服务接口

package cn.edu.nuist.service;

public interface HelloService {
    public String sayHello(String name);
}

c. 创建服务实现类

package cn.edu.nuist.service.cn.edu.nuist.service.impl;

import cn.edu.nuist.service.HelloService;
import com.alibaba.dubbo.config.annotation.Service;

@Service // 必须使用 Dubbo 提供的 @Service 注解(用于对外发布服务)
public class HelloServiceImpl implements HelloService {

    @Override
    public String sayHello(String name) {
        return "Hello!" + name;
    }
}

d. spring 配置文件

在 src/main/resources 下创建 applicationContext-service.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:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    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://code.alibabatech.com/schema/dubbo
        http://code.alibabatech.com/schema/dubbo/dubbo.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 当前应用名称(唯一),用于注册中心计算应用间依赖关系,注意:消费者和提供者应用名不要一样 -->
    <dubbo:application name="dubbo_provider"/>
    <!-- 指定服务注册中心:zookeeper所在服务器的IP地址 -->
    <dubbo:registry address="zookeeper://192.168.206.129:2181"/>
    <!-- 注册协议和端口(默认20880),服务方才需要配置这行 -->
    <dubbo:protocol name="dubbo" port="20880"/>
    <!-- 扫描指定包,扫描到的加 @Service 注解的类会被发布为服务 -->
    <dubbo:annotation package="cn.edu.nuist.service.impl"/>

</beans>

e. web.xml

<!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext*.xml</param-value>
  </context-param>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
</web-app>

3.2 服务消费方

a. pom.xml

创建 Maven工程(打包方式为 war)dubbo_consumer,pom.xml 配置和上面服务提供者相同,只需要将 Tomcat 插件的端口号改为 8082 即可。

b. 复制服务接口

将服务提供者工程中的 HelloService 接口复制到当前工程。

package cn.edu.nuist.service;

public interface HelloService {
    public String sayHello(String name);
}

c. 编写 Controller

package cn.edu.nuist.controller;

import cn.edu.nuist.service.HelloService;
import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/hello")
public class HelloController {
    @Reference // 必须使用 Dubbo 提供的 @Reference 注解(用于查找服务)
    HelloService helloService; // 去注册中心找叫 HelloService 的服务

    @ResponseBody
    @RequestMapping("/sayHello")
    public String sayHello(String name) {
        return helloService.sayHello(name);
    }
}

d. spring 配置文件

在 src/main/resources 下创建 applicationContext-web.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:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    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://code.alibabatech.com/schema/dubbo
        http://code.alibabatech.com/schema/dubbo/dubbo.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 当前应用名称(唯一),用于注册中心计算应用间依赖关系 -->
    <dubbo:application name="dubbo_consumer"/>
    <!-- 指定服务注册中心:zookeeper所在服务器的IP地址 -->
    <dubbo:registry address="zookeeper://192.168.206.129:2181"/>
    <!-- 消费方的包扫描:扫描到 @Reference 后,会自动到注册中心查找对应服务 -->
    <dubbo:annotation package="cn.edu.nuist.controller"/>
</beans>

e. web.xml

<!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
    <display-name>Archetype Created Web Application</display-name>
    <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:applicationContext-web.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
</web-app>

f. 运行测试

3.3 Tips

a. log4j

项目启动过程中:

在 resources 目录下,加入 log4j.properties 文件。

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=u:\\provider_log.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###

log4j.rootLogger=debug, stdout

b. IDEA

这是第 1 次用 IDEA 开发 web 项目,之前都是用的 STS。故在此记录一下遇到的几个问题。

1. 要先配置 Maven

2. idea application context not configured for this file

3. Maven projects need to be imported

c. Quiz

1. 上面的 Dubbo 入门案例中我们是将 HelloService 接口从服务提供者工程(dubbo_provider) 复制到服务消费者工程(dubbo_consumer) 中,这种做法是否合适?还有没有更好的方式?

:这种做法显然是不好的,同一个接口被复制了两份,不利于后期维护。更好的方式是单独创建一个 Maven 工程,将此接口创建在这个 Maven 工程中。需要依赖此接口的工程只需要在自己工程的 pom.xml 文件中引入 Maven 坐标即可。

2. 在服务消费者工程(dubbo_consumer) 中只是引用了 HelloService 接口,并没有提供实现类,Dubbo 是如何做到远程调用的?

:Dubbo 底层是基于代理技术为 HelloService 接口创建代理对象,远程调用是通过此代理对象完成的。可以通过开发工具的 debug 功能查看此代理对象的内部结构。另外,Dubbo 实现网络传输底层是基于 Netty 框架完成的。

3. 上面的 Dubbo 入门案例中我们使用 Zookeeper 作为服务注册中心,服务提供者需要将自己的服务信息注册到 Zookeeper,服务消费者需要从 Zookeeper 订阅自己所需要的服务,此时 Zookeeper 服务就变得非常重要了,那如何防止 Zookeeper 单点故障呢?

:Zookeeper 其实是支持集群模式的,可以配置 Zookeeper 集群来达到 Zookeeper 服务的高可用,防止出现单点故障。

4. Dubbo 管理控制台

我们在开发时,需要知道 Zookeeper 注册中心都注册了哪些服务,有哪些消费者来消费这些服务。我们可以通过部署一个管理中心来实现。其实管理中心就是一个 web 应用,部署到 tomcat 即可。

4.1 安装

  1. 将 dubbo-admin-2.6.0.war 文件复制到 tomcat 的 webapps 目录下;
  2. 启动 tomcat,此 war 文件会自动解压;
  3. 修改 WEB-INF 下的 dubbo.properties 文件,注意 dubbo.registry.address 对应的值需要对应当前使用的 Zookeeper 的 IP 地址和端口号;
    dubbo.registry.address=zookeeper://192.168.206.129:2181
    dubbo.admin.root.password=root
    dubbo.admin.guest.password=guest
    
  4. 重启 tomcat

如果直接启动可能会遇到的问题:

4.2 使用

5. Dubbo 相关配置说明

5.1 包扫描

服务提供者和服务消费者都需要配置,表示包扫描,作用是扫描指定包(包括子包)下的类,发布 Duubo 服务。

<dubbo:annotation package="cn.edu.nuist.service" />

如果不使用包扫描,也可以通过如下配置的方式来发布服务:

<bean id="helloService" class="cn.edu.nuist.service.impl.HelloServiceImpl" />
<dubbo:service interface="cn.edu.nuist.api.HelloService" ref="helloService" />

作为服务消费者,不使用包扫描则可以通过如下配置来引用服务:

<!-- 生成远程服务代理,可以和本地 bean 一样使用 helloService -->
<dubbo:reference id="helloService" interface="cn.edu.nuist.api.HelloService" />

上面这种方式发布和引用服务,一个配置项(<dubbo:service>、<dubbo:reference>) 只能发布或者引用一个服务,如果有多个服务,这种方式就比较繁琐了。推荐使用包扫描方式。

5.2 协议

<dubbo:protocol name="dubbo" port="20880"/>

一般在服务提供者一方配置,可以指定使用的协议名称和端口号。

其中 Dubbo 支持的协议有:dubbo、rmi、hessian、http、webservice、rest、redis 等。推荐使用的是 dubbo 协议。

Dubbo 协议采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。

也可以在同一个工程中配置多个协议,不同服务可以使用不同的协议,例如:

<!-- 多协议配置 -->
<dubbo:protocol name="dubbo" port="20880" />
<dubbo:protocol name="rmi" port="1099" />
<!-- 使用 dubbo 协议暴露服务 -->
<dubbo:service interface="cn.edu.nuist.api.HelloService" ref="helloService" protocol="dubbo" />
<!-- 使用 rmi 协议暴露服务 -->
<dubbo:service interface="cn.edu.nuist.api.DemoService" ref="demoService" protocol="rmi" />

若不使用配置文件方式,可以使用 @Service 的 protocol 属性指定使用的协议。

5.3 启动时检查

<dubbo:consumer check="false"/>

上面这个配置需要配置在【服务消费者】一方,如果不配置默认 check 值为 true。Dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止 Spring 初始化完成,以便上线时能及早发现问题。

10:33:51,417 ERROR Logger:225 -  [DUBBO] Failed to init remote service reference at filed
helloService in class cn.edu.nuist.controller.HelloController, cause: Failed to check the
status of the service cn.edu.nuist.service.HelloService. No provider available for the
service cn.edu.nuist.service.HelloService from the url zookeeper://192.168.206.129:2181/
com.alibaba.dubbo.registry.RegistryService?application=dubbo_consumer
&dubbo=2.6.0&interface=cn.edu.nuist.service.HelloService&methods=sayHello ...

java.lang.IllegalStateException: Failed to check the status of the service
cn.edu.nuist.service.HelloService. No provider available for the service
cn.edu.nuist.service.HelloService from the url zookeeper://192.168.206.129:2181
/com.alibaba.dubbo.registry.RegistryService?application=dubbo_consumer ...

可以通过将 check 值改为 false 来关闭检查,在此之后就不需要严格按照先起 provider 后起 consumer 的顺序了,只要保证最终都起来就行。

建议在开发阶段将 check 值设置为 false,在生产环境下改为 true。

5.4 负载均衡

负载均衡(Load Balance):其实就是将请求分摊到多个操作单元上进行执行,从而共同完成工作任务。

在集群负载均衡时,Dubbo 提供了多种均衡策略(包括随机、轮询、最少活跃调用数、一致性 Hash),缺省为 random 随机调用。

配置负载均衡策略,既可以在服务提供者一方配置,也可以在服务消费者一方配置:

@Controller
@RequestMapping("/demo")
public class HelloController {
    // 在服务消费者一方配置负载均衡策略
    @Reference(check = false, loadbalance = "random")
    private HelloService helloService;

    @RequestMapping("/hello")
    @ResponseBody
    public String getName(String name){
        // 远程调用
        String result = helloService.sayHello(name);
        System.out.println(result);
        return result;
    }
}

// ··························································

// 在服务提供者一方配置负载均衡
@Service(loadbalance = "random")
public class HelloServiceImpl implements HelloService {
    public String sayHello(String name) {
        return "hello!" + name;
    }
}

可以通过启动多个服务提供者来观察 Dubbo 负载均衡效果。但要注意!因为我们是在一台机器上启动多个服务提供者,所以需要修改 tomcat 的端口号和 Dubbo 服务的端口号 <dubbo:protocol port=""> 来防止端口冲突。在实际生产环境中,多个服务提供者是分别部署在不同的机器上,所以不存在端口冲突问题。

6. 事务代理的 Service

解决 Dubbo 无法发布被事务代理的 Service 问题

6.1 问题说明

前面我们已经完成了 Dubbo 的入门案例,通过入门案例我们可以看到通过 Dubbo 提供的标签配置就可以进行包扫描,扫描到 @Service 注解的类就可以被发布为服务。

<dubbo:annotation package="cn.edu.nuist.service.impl"/>

但是我们如果在服务提供者类上加入 @Transactional 事务控制注解后,服务就发布不成功了。原因是事务控制的底层原理是为服务提供者类创建代理对象,而默认情况下Spring是基于 JDK 动态代理方式创建代理对象,而此代理对象的完整类名为 com.sun.proxy.$Proxy42(最后两位数字不是固定的),导致 Dubbo 在发布服务前进行包匹配时无法完成匹配,进而没有进行服务的发布。

6.2 问题展示

上面的错误为没有可用的服务提供者,此时查看 dubbo 管理控制台发现服务并没有发布,如下:

可以通过断点调试的方式查看 Dubbo 执行过程,Dubbo 通过 AnnotationBean 的 postProcessAfterInitialization 方法进行处理:

6.3 解决方案

通过上面的断点调试可以看到,在 HelloServiceImpl 类上加入事务注解后,Spring 会为此类基于 JDK 动态代理技术创建代理对象,创建的代理对象完整类名为 com.sun.proxy.$Proxy35,导致 Dubbo 在进行包匹配时没有成功(因为我们在发布服务时扫描的包为 com.itheima.service),所以后面真正发布服务的代码没有执行。

操作步骤:

1. 修改 applicationContext-service.xml 配置文件,开启事务控制注解支持时指定 proxy-target-class 属性,值为 true。其作用是使用 cglib 代理方式为 Service 类创建代理对象。

<!--开启事务控制的注解支持-->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

虽然服务发布成功了,但是查看详情:

2. 修改 HelloServiceImpl 类,在 Service 注解中加入 interfaceClass 属性,值为 HelloService.class,作用是指定服务的接口类型。

@Service(interfaceClass = HelloService.class)
@Transactional
public class HelloServiceImpl implements HelloService {
    public String sayHello(String name) {
        return "hello " + name;
    }
}

标签:Dubbo,服务,22,dubbo,HelloService,服务提供者,org
From: https://www.cnblogs.com/liujiaqi1101/p/17166485.html

相关文章

  • 力扣20-有效的括号&力扣22-括号生成
    有效的括号原题链接:https://leetcode.cn/problems/valid-parentheses/题目描述给定一个只包括'(',')','{','}','[',']' 的字符串s,判断字符串是否有效。有效字符串需满足:......
  • java学习日记20230227-dos原理
    DOS原理 磁盘操作系统disoperatingsystemmdc:\\temp创建文件夹rdc:\\jyltemp移除文件夹相对路径和绝对路径 相对路径:从当前目录开始定位形成的路径绝对路径......
  • P5221 Product
    简要题意给出\(N\),计算:\[\prod_{i=1}^N\prod_{j=1}^N\frac{\operatorname{lcm}(i,j)}{\gcd(i,j)}\pmod{104857601}\]\(1\leqN\leq10^6\)。时间限制\(200\operator......
  • 数据库报ORA-00600 [2252]错误
    同事运维的数据库出现了一个ORA-00600 [2252]错误,针对该问题简单记录下。1、alter日志信息:TueFeb2814:22:302023Errorsinfiled:\app\diag\rdbms\pubb\pubb\trac......
  • 江南信息学2023年第一周练习20230223 题解
    比赛链接1001:鸡尾酒疗法1#include<bits/stdc++.h>2usingnamespacestd;3intmain()4{5intn;6cin>>n;7doublea,b;8cin>>a......
  • 2021年Dubbo面试题大汇总附答案
    2021年Dubbo面试题大汇总附答案全部面试题答案,更新日期:01月30日,直接下载吧!下载链接:高清500+份面试题资料及电子书,累计10000+页大厂面试题PDFDubbo题1:为什么Dubbo......
  • 最新面试题2021年常见Dubbo面试题及答案汇总
    最新面试题2021年常见Dubbo面试题及答案汇总全部面试题答案,更新日期:01月30日,直接下载吧!下载链接:高清500+份面试题资料及电子书,累计10000+页大厂面试题PDFDubbo题1:D......
  • 2022年最全Docker面试题附答案解析大汇总
    2022年最全Docker面试题附答案解析大汇总全部面试题答案,更新日期:01月30日,直接下载吧!下载链接:高清500+份面试题资料及电子书,累计10000+页大厂面试题PDFDocker题1:非......
  • 最新2022年Docker面试题高级面试题及附答案解析
    最新2022年Docker面试题高级面试题及附答案解析全部面试题答案,更新日期:01月30日,直接下载吧!下载链接:高清500+份面试题资料及电子书,累计10000+页大厂面试题PDFDocker......
  • AWS Ubuntu22.04安装Mysql及配置远程连接
    一、升级apt资源包sudoaptupdate二、安装MySQLsudoaptinstallmysql-server三、启动MySQL服务sudoservicemysqlstart四、登录MySql查看MySql用户名/密码su......