Dubbo介绍及入门

一、Dubbo背景简介

1、Dubbo演变
  • 单一应用框架(ORM)

    • 当网站流量很小时,只需一个应用,将所有功能,如下单支付等都部署在一起,以减少部署节点和成本。
    • 缺点:单一系统架构,使得在开发过程中,占用的资源越来越多,而且随着流量的增加越来越难以维护
    • 关键:用于简化增删改查工作量的数据访问呢框架ORM是关键。
  • 垂直应用框架(MVC)

    • 垂直应用架构解决了单一应用架构所面临的扩容问题,流量能够分散到各个子系统当中,且系统的体积可控,一定程度上降低了开发人员之间协同以及维护的成本,提升了开发效率。
    • 优点:扩展容易
    • 缺点:但是在垂直架构中相同逻辑代码需要不断的复制,不能复用。页面修改后,可能造成整个项目重新部署,业务与界面没有分开,随着业务种类增加,怎么解决业务之间的互相调用问题,订单服务器与用户服务器交互效率的问题。
    • 关键:用于加速前端页面开发的web框架MVC是关键。
  • 分布式应用架构(RPC)

    • 当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心。
    • 优点:解决了分布式系统中相互调用的问题。
    • 缺点:假设有100台服务器,50台用户业务服务器,50台订单业务服务器,但是在上线后发现,用户服务器使用率很小,但是订单服务器压力很大,最佳配比应该是1:4,这时候需要有一个统一管理的调度中心(即,注册中心)。
    • 关键:用于提高业务复用及整合的分布式服务框架RPC是关键。
  • 流动计算架构(SOA)

    • 随着服务化的进一步发展,服务越来越多,服务之间的调用和依赖关系也越来越复杂,诞生了面向服务的架构体系(SOA),也因此衍生出了一系列相应的技术,如对服务提供、服务调用、连接处理、通信协议、序列化方式、服务发现、服务路由、日志输出等行为进行封装的服务框架
    • 关键:用于提高及其利用率资源调度和治理中心SOA是关键。
2、Dubbo前世今生
  • 2011年之前,作为alibaba内部使用框架;
  • 2011年,托管到了GitHub上开源;
  • 2014年11月,发布2.4.11版本后停止更新,此后很多公司开源了自己基于Dubbo的变种版本(例如当当网的Dubbo X,网易考拉的Dubbo K等);
  • 2017年,SpringCloud(分布式框架)横空出世,Dubbo感到压力后连续更新了版本;
  • 2018年1月,阿里联合当当网将Dubbo和Dubbo X合并,发布了2.6版本;
  • 2018年除夕夜,阿里将Dubbo贡献给了Apache基金会;
  • 2018除夕夜至今,Apache维护更新Dubbo。
3、RPC简介
  • RPC(Remote Procedure Call Protocol):远程过程调用
    • 两台服务器A、B,分别部署于不同的应用a、b。当服务器A想调用服务器B提供的方法时,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义传达调用的数据。因此出现了远程服务调用。
  • RPC是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
    • RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
  • RPC采用客户机/服务器模式请求程序就是一个客户机,而服务提供程序就是一个服务器。
    • 首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。
    • 在服务器端,进程保持睡眠状态直到调用信息到达为止。
    • 当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息。
    • 最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
  • RPC需要解决的问题
    • 通讯问题
      • 通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输。连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远程过程调用共享同一个连接。
    • 寻址问题
      • A服务器上的应用怎么告诉底层的RPC框架,如何连接到B服务器(如主机或IP地址)以及特定的端口方法的名称是什么,这样才能完成调用。
      • 比如基于Web服务协议栈的RPC,就要提供一个endpoint URI,或者是从UDDI服务上查找。如果是RMI调用的话,还需要一个RMI Registry来注册服务的地址。
    • 序列化 与 反序列化
      • 当A服务器上的应用发起远程过程调用时,方法的参数需要通过底层的网络协议如TCP传递到B服务器由于网络协议是基于二进制的,内存中的参数的值要序列化成二进制的形式,也就是序列化(Serialize)或编组(marshal),通过寻址和传输将序列化的二进制发送给B服务器。
      • 同理,B服务器接收参数要将参数反序列化。B服务器应用调用自己的方法处理后返回的结果也要序列化给A服务器,A服务器接收也要经过反序列化的过程。
  • RPC框架:Dubbo的RPC、gRPC、Thrift、HSF等等(国内用Dubbo多)

二、Dubbo

1、Dubbo概念
  • Dubbo是一款分布式服务框架高性能和透明化的RPC远程服务调用方案SOA服务治理方案
  • 三大核心能力:
    • 面向接口的远程方法调用
    • 智能容错和负载均衡
    • 服务自动注册和发现
2、Dubbo架构
  • Dubbo架构
    • Provider暴露服务的服务提供方
    • Consumer调用远程服务的服务消费方
    • Registry:服务注册与发现的注册中心
    • Monitor:统计服务的调用次数和调用时间的监控中心
    • Container:服务运行容器
      Dubbo介绍及入门_第1张图片
  • 调用流程
    • step1(start):服务容器负责启动、加载、运行服务提供者;
    • step2(register):服务提供者在启动时向注册中心注册自己提供的服务
    • step3(subscribe):服务消费者在启动时向注册中心订阅自己所需的服务
    • step4(notify):注册中心返回服务提供者地址列表给消费者,如果有变更注册中心将基于长连接推送变更数据给消费者;
    • step5(invoke):服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用如果调用失败,再选另一台调用
    • step6(count ):服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中
  • 架构特点(了解)
    • 连通性
      • 注册中心:负责服务地址的注册与查找,相当于目录服务服务提供者和消费者只在启动时与注册中心交互注册中心不转发请求,压力较小
      • 监控中心:负责统计各服务调用次数,调用时机等,统计先在内存汇总后每分钟一次发送到监控中心服务器,并以报表展示。
      • 服务提供者:向注册中心注册其提供的服务并汇报调用时间到监控中心,此时间不包含网络开销
      • 服务消费者:向注册中心获取服务提供者地址列表,并根据负载算法直接调用提供者,同时汇报调用时间到监控中心,此时间包含网络开销
      • 注册中心,服务提供者,服务消费者三者之间均为长连接,监控中心除外。
      • 注册中心通过长连接感知服务提供者的存在,服务提供者宕机,注册中心将立即推送事件通知消费者
      • 注册中心和监控中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表
      • 注册中心和监控中心都是可选的,服务消费者可以直连服务提供者
    • 健壮性
      • 监控中心宕掉不影响使用,只是丢失部分采样数据。
      • 数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务。
      • 注册中心对等集群,任意一台宕掉后,将自动切换到另一台。
      • 注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯。
      • 服务提供者无状态,任意一台宕掉后,不影响使用。
      • 服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复。
    • 伸缩性
      • 注册中心为对等集群,可动态增加机器部署实例所有客户端将自动发现新的注册中心
      • 服务提供者无状态,可动态增加机器部署实例,注册中心将推送新的服务提供者信息给消费者。
    • 升级性
3、Dubbo注册中心
  • 将服务进行统一管理,可以有效地优化内部应用对服务发布/使用的流程和管理。服务注册中心可以通过特定协议来完成服务对外的统一。
    • 对于服务提供方:它需要发布服务,而由于应用系统的复杂性,服务数量、类型不断膨胀;
    • 对于服务消费方:它需要获取所需服务,而面对复杂应用系统,需要管理大量的服务调用;
    • 对于服务提供方和提供消费方:它们还有可能兼具这两种角色,既需要提供服务,又需要消费服务。
  • Dubbo提供的注册中心有以下几种类型:
    • Multicast注册中心:组播方式
    • Zookeeper注册中心:使用zookeeper作为注册中心
    • Redis注册中心:使用redis作为注册中心
    • Simple注册中心:就是一个dubbo服务,作为注册中心,提供查找服务功能
4、Dubbo优缺点
  • 优点
    • 透明化的远程方法调用
      • 像调用本地方法一样调用远程方法;
      • 只需简单配置,没有任何API侵入。
    • 软负载均衡及容错机制
      • 可以在内网替代nginx lvs等硬件负载均衡器。
    • 服务注册中心自动注册 & 配置管理
      • 不需要写死服务提供者地址,注册中心基于接口名自动查询提供者IP;
      • 使用类似zookeeper等分布式协调服务作为服务注册中心,可以将绝大部分项目配置移入zookeeper集群
    • 服务接口监控与治理
      • Dubbo-adminDubbo-monitor提供了完善的服务接口管理与监控功能,针对不同应用的不同接口,可以进行 多版本,多协议,多注册中心管理
  • 缺点
    • 只支持Java。
5、Dubbo高性能
  • RPC框架主要是远程调用,提升性能最关键、最耗时的两个因素:序列化和网络通信。
  • 序列化
    • 本地对象要在网络上传输,必须要实现Serializable接口,即序列化
    • 序列化方案:可以采用xml、json、二进制流等等,其中二进制流效率最高(因为计算机是二进制的),所以dubbo采用的是效率最高的二进制
  • 网络通信
    • HTTP 需要七步(即,三次握手,四次挥手),效率低。
    • 但是Dubbo采用的是Socket通信机制一步到位,提升通信效率,而且可以建立长连接,不用反复链接,直接传输数据。

三、Dubbo入门Demo

Dubbo+Zookeeper+Spring整合

1、大致步骤
  • 安装Zookeeper并启动;
  • 创建maven项目,构建Dubbo+Zookeeper+Spring实现简单Demo;
  • 安装Dubbo-admin,实现监控。
2、详细步骤
2.1 Zookeeper介绍与安装
  • Zookeeper介绍
    • Zookeeper是一个分布式服务框架,是树型的目录服务的数据存储,可以做到集群管理数据,支持变更推送,适合作为Dubbo服务的注册中心,可用于生产环境,推荐使用;
    • Dubbo能与Zookeeper做到集群部署。
      • 当提供者出现断电等异常停机时,Zookeeper注册中心能自动删除提供者信息
      • 当提供者重启时,能自动恢复注册数据,以及订阅请求。
  • Zookeeper安装
    • zookeeper官网下载地址:https://zookeeper.apache.org/releases.html
      • step1:访问下载地址
      • step2:选择其中一个版本点击进入step3界面Dubbo介绍及入门_第2张图片
      • step3:点击tar.gz下载Dubbo介绍及入门_第3张图片
    • 修改配置
      • 复制/conf/zoo_sample.cfg文件,改名为zoo.cfgDubbo介绍及入门_第4张图片
    • 启动
      • E:\apache-zookeeper-3.6.1-bin\bin>zkServer
        Dubbo介绍及入门_第5张图片
    • 启动报错问题及分析
      • 错误一
        • 报错信息:java.lang.NumberFormatException: For input string: "E:\apache-zookeeper-3.6.1-bin\bin\..\conf\zoo.cfg"
        • 报错截图Dubbo介绍及入门_第6张图片
        • 解决方案:不能用zkServer start启动,直接zkServer 启动就行
      • 错误二
        • 报错信息:Caused by: java.lang.IllegalArgumentException: E:\apache-zookeeper-3.6.1-bin\bin\..\conf\zoo.cfg file is missing
        • 报错截图Dubbo介绍及入门_第7张图片
        • 解决方案:由于conf目录下没有zoo.cfg文件,需要在conf目录下复制zoo_sample.cfg文件,改名为zoo.cfg,重新启动即可成功Dubbo介绍及入门_第8张图片
2.2 创建maven项目
  • 项目结构(三大模块)

    • dubbo-api:存放公共接口
    • dubbo-provider :提供远程服务
    • dubbo-consumer:调用远程服务
      Dubbo介绍及入门_第9张图片
  • 导入依赖:spring、dubbo、zookeeper等jar包。

  • dubbo-api 模块

    • 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">
          <parent>
              <artifactId>DubboDemoartifactId>
              <groupId>com.awengroupId>
              <version>1.0-SNAPSHOTversion>
          parent>
          <modelVersion>4.0.0modelVersion>
          <artifactId>dubbo-apiartifactId>
          <packaging>warpackaging>
          <name>dubbo-api Maven Webappname>
          <url>http://maven.apache.orgurl>
          <dependencies>
              <dependency>
                  <groupId>junitgroupId>
                  <artifactId>junitartifactId>
                  <version>3.8.1version>
                  <scope>testscope>
              dependency>
          dependencies>
          <build>
              <finalName>dubbo-apifinalName>
          build>
      project>
    • 定义服务接口DemoService (该接口需单独打包,在服务提供方和消费方共享)

      package com.alibaba.dubbo.demo;
      import java.util.List;
      public interface DemoService {
          List<String> getPermissions(Long id);
      }
  • dubbo-provider 模块

    • pom.xml(引入公共接口所在的dubbo-api依赖)
      
      <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">
          <parent>
              <artifactId>DubboDemoartifactId>
              <groupId>com.awengroupId>
              <version>1.0-SNAPSHOTversion>
          parent>
          <modelVersion>4.0.0modelVersion>
          <artifactId>dubbo-providerartifactId>
          <dependencies>
              <dependency>
                  <groupId>com.awengroupId>
                  <artifactId>dubbo-apiartifactId>
                  <version>1.0-SNAPSHOTversion>
              dependency>
          dependencies>
      project>
    • DemoServiceimpl 实现公共接口 DemoService (该接口对消费者隐藏)
      package com.alibaba.dubbo.demo.impl;
      import com.alibaba.dubbo.demo.DemoService;
      import java.util.ArrayList;
      import java.util.List;
      public class DemoServiceImpl implements DemoService {
          @Override
          public List<String> getPermissions(Long id) {
              List<String> list = new ArrayList<>();
              list.add(String.format("Permission_%d", id - 1));
              list.add(String.format("Permission_%d", id));
              list.add(String.format("Permission_%d", id + 1));
              return list;
          }
      }
    • provider.xml(用spring配置声明暴露服务)
      • 服务提供方应用信息,用于计算依赖关系,在 dubbo-admin 或 dubbo-monitor 会显示这个名字,方便辨识
      • 使用 zookeeper 注册中心暴露服务,注意要先开启zookeeper
      • 用 dubbo 协议在20880端口暴露服务
      • 使用dubbo协议实现定义好的 api.PermissionService 接口
      • 具体实现该接口的bean
      
      <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="demotest-provider" owner="programmer" organization="dubbox" />
          
          <dubbo:registry address="zookeeper://localhost:2181" />
          
          <dubbo:protocol name="dubbo" port="20880" />
          
          <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" protocol="dubbo" />
          
          <bean id="demoService" class="com.alibaba.dubbo.demo.impl.DemoServiceImpl" />
      beans>
    • Provider.java(启动远程服务)
      package com.alibaba.dubbo.demo.impl;
      import org.springframework.context.support.ClassPathXmlApplicationContext;
      import java.io.IOException;
      public class Provider {
          public static void main(String[] args) throws IOException {
              ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("provider.xml");
              System.out.println(classPathXmlApplicationContext.getDisplayName() + "here");
              classPathXmlApplicationContext.start();
              System.out.println("服务已经启动...");
              System.in.read();
          }
      }
  • dubbo-consumer1 模块

    • pom.xml(引入公共接口所在的dubbo-api依赖)
      
      <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">
          <parent>
              <artifactId>DubboDemoartifactId>
              <groupId>com.awengroupId>
              <version>1.0-SNAPSHOTversion>
          parent>
          <modelVersion>4.0.0modelVersion>
          <artifactId>dubbo-consumer1artifactId>
          <dependencies>
              <dependency>
                  <groupId>com.awengroupId>
                  <artifactId>dubbo-apiartifactId>
                  <version>1.0-SNAPSHOTversion>
              dependency>
          dependencies>
      project>
    • dubbo-consumer1.xml(用spring配置引用远程服务)
      • 向zookeeper订阅provider地址,由zookeeper定时推送
      • 使用dubbo协议调用定义好的api.PermissionService接口
      
      <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="demotest-consumer" owner="programmer" organization="dubbox"/>
          
          <dubbo:registry address="zookeeper://localhost:2181"/>
          
          <dubbo:reference id="permissionService" interface="com.alibaba.dubbo.demo.DemoService"/>
      beans>
    • Consumer1.java(调用远程服务)
      package com.alibaba.dubbo.consumer1;
      import com.alibaba.dubbo.demo.DemoService;
      import org.springframework.context.support.ClassPathXmlApplicationContext;
      public class Consumer1 {
          public static void main(String[] args) {
              //测试常规服务
              ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("consumer1.xml");
              classPathXmlApplicationContext.start();
              System.out.println("consumer1 start");
              DemoService demoService = classPathXmlApplicationContext.getBean(DemoService.class);
              System.out.println("consumer1");
              System.out.println(demoService.getPermissions(1L));
          }
      }
2.3 运行项目
  • step1:启动zookeeper
  • step2:启动Provider.java,启动远程服务
  • step3:启动Cusumer1.java,调用远程服务
    • 如果先启动Customer,没有启动Provider,则会报错
      • Caused by: java.lang.IllegalStateException: Failed to check the status of the service com.alibaba.dubbo.demo.DemoService. No provider available for the service com.alibaba.dubbo.demo.DemoService from the url zookeeper://localhost:2181/com.alibaba.dubbo.registry.
      • 报错截图Dubbo介绍及入门_第10张图片
2.4 dubbo-admin
  • 详情过程见六 Dubbo管理控制台。

四、Dubbo配置文件详解

1、dubbo 配置文件信息解释
  • 应用配置:配置当前应用信息

    eg:

  • 注册中心配置:配置连接注册中心信息

    eg:

  • 协议配置:配置提供服务的协议信息,协议由提供方指定,消费方被动接收

    eg:

    • 属性name:协议名称
    • 属性port:协议端口号(用哪个端口暴露服务)
    • Dubbo支持协议
      • dubbo、redis、hessian、rmi、http、webservice、thrift、memcached
      • dubbo官方推荐dubbo协议,dubbo协议默认端口20880
  • 服务配置:暴露一个服务,定义服务的元信息;一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心

    eg:

    • 属性protocol:使用哪个dubbo协议,与 dubbo:protocol 标签里的 name 值对应
  • 引用服务配置:创建一个远程服务代理,一个引用可以指向多个注册中心

  • 模块配置:可选,配置当前模块信息

  • 监控中心配置:可选,配置连接监控中心信息

  • 提供方缺省值:可选,当ProtocolConfig和ServiceConfig某属性没有配置时,采用此缺省值

  • 消费方缺省配置:可选,当ReferenceConfig某属性没有配置时,采用此缺省值

  • 方法配置:用于ServiceConfig和ReferenceConfig指定方法级的配置信息

  • 用于指定方法参数配置

2、不同粒度配置的覆盖关系
  • 方法级优先,接口级次之,全局配置再次之。
  • 如果级别一样,则消费方优先,提供方次之。
  • 其中,服务提供方配置通过URL经由注册中心传递给消费方。
  • 例子(以timeout为例)
    Dubbo介绍及入门_第11张图片
3、分类(随后再补充)

(按超时设置、启动时检查、订阅、回声测试、延迟连接、令牌验证、日志适配、dubbo缓存文件分类)

4、分类(随后再补充)

(按服务发现、服务治理、性能调优分类)

  • 服务发现:让消费者找到服务
  • 服务治理:治理服务之间的关系
  • 性能调优:对服务进行性能调优

五、Dubbo服务化最佳实践

1、分包
  • 建议将服务接口、服务模型等均放在公共包中。
2、粒度
  • 服务接口尽可能大粒度,每个服务付费代表一个功能,而不是某功能的一个步骤;
  • 服务接口建议以业务场景为单位划分,并对相近业务做抽象,防止接口数据爆炸;
  • 不建议使用过于抽象的通用接口,如Map,这样的接口没有明确语义,会给后期维护带来不便;
3、版本
  • 每个接口都应该定义版本号,区分同一接口的不同实现。

    如:

六、Dubbo管理控制台

1、管理控制台功能

路由规则、动态配置、服务降级、访问控制、权重调整、负载均衡
Dubbo介绍及入门_第12张图片

2、步骤
  • step1:下载dubbo-admin:https://github.com/apache/dubbo/tree/2.5.x,clone 2.5.x版本

  • step2:进入到dubbo/dubbo-admin目录下,打包"mvn package -Dmaven.skip.test=true"

    • 然后dubbo/dubbo-admin/target目录下会生成dubbo-admin-2.5.10.war包Dubbo介绍及入门_第13张图片
  • step3:将dubbo-admin-2.5.10.war复制到apache-tomcat-8.0.32//webapps目录下,并解压
    Dubbo介绍及入门_第14张图片

  • step4:将dubbo-admin-2.5.10文件夹下的所有文件复制到ROOT文件夹里
    Dubbo介绍及入门_第15张图片

  • step5:修改tomcat启动端口号为8090,因为zookeeper启动端口号也是8080。(进入apache-tomcat-8.0.32/conf下,修改server.xml文件)
    Dubbo介绍及入门_第16张图片

  • step6:启动zookeeper(进入apache-zookeeper-3.6.1-bin/bin,双击启动zkServer.cmd)

    zookeeper介绍与安装:参考Dubbo入门Demo–详细步骤–Zookeeper介绍与安装

  • step7:启动tomcat(进入apache-tomcat-8.0.32/bin,双击启动startup.bat)

  • step8:访问dubbo-admin地址:http://127.0.0.1:8090/dubbo-admin-2.5.10/

    • 账号密码在webapps/ROOT/WEB-INF下的dubbo.properties文件中,可以是root/root,也可以是guest/guest
      Dubbo介绍及入门_第17张图片
    • 需要账号密码登录
      Dubbo介绍及入门_第18张图片
    • 登录成功Dubbo介绍及入门_第19张图片

你可能感兴趣的:(微服务)