一、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:服务运行容器
- 调用流程
- 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-admin与Dubbo-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界面
- step3:点击tar.gz下载
- 修改配置
- 复制/conf/zoo_sample.cfg文件,改名为zoo.cfg
- 启动
E:\apache-zookeeper-3.6.1-bin\bin>zkServer
- 启动报错问题及分析
- 错误一
- 报错信息:
java.lang.NumberFormatException: For input string: "E:\apache-zookeeper-3.6.1-bin\bin\..\conf\zoo.cfg"
- 报错截图
- 解决方案:不能用zkServer start启动,直接zkServer 启动就行
- 报错信息:
- 错误二
- 报错信息:
Caused by: java.lang.IllegalArgumentException: E:\apache-zookeeper-3.6.1-bin\bin\..\conf\zoo.cfg file is missing
- 报错截图
- 解决方案:由于conf目录下没有zoo.cfg文件,需要在conf目录下复制zoo_sample.cfg文件,改名为zoo.cfg,重新启动即可成功
- 报错信息:
- 错误一
- zookeeper官网下载地址:
2.2 创建maven项目
-
项目结构(三大模块)
- dubbo-api:存放公共接口
- dubbo-provider :提供远程服务
- dubbo-consumer:调用远程服务
-
导入依赖:spring、dubbo、zookeeper等jar包。
-
dubbo-api 模块
-
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"> <parent> <artifactId>DubboDemo</artifactId> <groupId>com.awen</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>dubbo-api</artifactId> <packaging>war</packaging> <name>dubbo-api Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> <build> <finalName>dubbo-api</finalName> </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依赖)
<?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"> <parent> <artifactId>DubboDemo</artifactId> <groupId>com.awen</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>dubbo-provider</artifactId> <dependencies> <dependency> <groupId>com.awen</groupId> <artifactId>dubbo-api</artifactId> <version>1.0-SNAPSHOT</version> </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:application /> 服务提供方应用信息,用于计算依赖关系,在 dubbo-admin 或 dubbo-monitor 会显示这个名字,方便辨识
- <dubbo:registry /> 使用 zookeeper 注册中心暴露服务,注意要先开启zookeeper
- <dubbo:protocol /> 用 dubbo 协议在20880端口暴露服务
- <dubbo:service /> 使用dubbo协议实现定义好的 api.PermissionService 接口
- 具体实现该接口的bean
<?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://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-admin 或 dubbo-monitor 会显示这个名字,方便辨识 --> <dubbo:application name="demotest-provider" owner="programmer" organization="dubbox" /> <!-- 使用 zookeeper 注册中心暴露服务,注意要先开启 zookeeper --> <dubbo:registry address="zookeeper://localhost:2181" /> <!-- 用 dubbo 协议在 20880 端口暴露服务 --> <dubbo:protocol name="dubbo" port="20880" /> <!-- 使用 dubbo 协议实现定义好的 api.PermissionService 接口 --> <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" protocol="dubbo" /> <!-- 具体实现该接口的 bean --> <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(); } }
- pom.xml(引入公共接口所在的dubbo-api依赖)
-
dubbo-consumer1 模块
- pom.xml(引入公共接口所在的dubbo-api依赖)
<?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"> <parent> <artifactId>DubboDemo</artifactId> <groupId>com.awen</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>dubbo-consumer1</artifactId> <dependencies> <dependency> <groupId>com.awen</groupId> <artifactId>dubbo-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> </project>
- dubbo-consumer1.xml(用spring配置引用远程服务)
- <dubbo:registry /> 向zookeeper订阅provider地址,由zookeeper定时推送
- <dubbo:reference /> 使用dubbo协议调用定义好的api.PermissionService接口
<?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://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"/> <!--向 zookeeper 订阅 provider 的地址,由 zookeeper 定时推送--> <dubbo:registry address="zookeeper://localhost:2181"/> <!--使用 dubbo 协议调用定义好的 api.PermissionService 接口--> <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)); } }
- pom.xml(引入公共接口所在的dubbo-api依赖)
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.
- 报错截图
- 如果先启动Customer,没有启动Provider,则会报错
2.4 dubbo-admin
- 详情过程见六 Dubbo管理控制台。
四、Dubbo配置文件详解
1、dubbo 配置文件信息解释
-
<dubbo:application />
应用配置:配置当前应用信息eg:<dubbo:application name=“demotest-provider” owner=“programmer” organization=“dubbox” />
-
<dubbo:registry />
注册中心配置:配置连接注册中心信息eg:<dubbo:registry address=“zookeeper://localhost:2181”/>
-
<dubbo:protocol />
协议配置:配置提供服务的协议信息,协议由提供方指定,消费方被动接收eg:<dubbo:protocol name=“dubbo” port=“20880” />
- 属性name:协议名称
- 属性port:协议端口号(用哪个端口暴露服务)
- Dubbo支持协议
- dubbo、redis、hessian、rmi、http、webservice、thrift、memcached
- dubbo官方推荐dubbo协议,dubbo协议默认端口20880
-
<dubbo:service />
服务配置:暴露一个服务,定义服务的元信息;一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心eg:<dubbo:service interface=“com.alibaba.dubbo.demo.DemoService” ref=“demoService” protocol=“dubbo” />
- 属性protocol:使用哪个dubbo协议,与 dubbo:protocol 标签里的 name 值对应
-
<dubbo:reference />
引用服务配置:创建一个远程服务代理,一个引用可以指向多个注册中心 -
<dubbo:module />
模块配置:可选,配置当前模块信息 -
<dubbo:monitor />
监控中心配置:可选,配置连接监控中心信息 -
<dubbo:provider />
提供方缺省值:可选,当ProtocolConfig和ServiceConfig某属性没有配置时,采用此缺省值 -
<dubbo:consumer />
消费方缺省配置:可选,当ReferenceConfig某属性没有配置时,采用此缺省值 -
<dubbo:method />
方法配置:用于ServiceConfig和ReferenceConfig指定方法级的配置信息 -
<dubbo:argument />
用于指定方法参数配置
2、不同粒度配置的覆盖关系
- 方法级优先,接口级次之,全局配置再次之。
- 如果级别一样,则消费方优先,提供方次之。
- 其中,服务提供方配置通过URL经由注册中心传递给消费方。
- 例子(以timeout为例)
3、分类(随后再补充)
(按超时设置、启动时检查、订阅、回声测试、延迟连接、令牌验证、日志适配、dubbo缓存文件分类)
4、分类(随后再补充)
(按服务发现、服务治理、性能调优分类)
- 服务发现:让消费者找到服务
- 服务治理:治理服务之间的关系
- 性能调优:对服务进行性能调优
五、Dubbo服务化最佳实践
1、分包
- 建议将服务接口、服务模型等均放在公共包中。
2、粒度
- 服务接口尽可能大粒度,每个服务付费代表一个功能,而不是某功能的一个步骤;
- 服务接口建议以业务场景为单位划分,并对相近业务做抽象,防止接口数据爆炸;
- 不建议使用过于抽象的通用接口,如Map,这样的接口没有明确语义,会给后期维护带来不便;
3、版本
- 每个接口都应该定义版本号,区分同一接口的不同实现。
如:<dubbo:service interface=“com.xxx.xxxService” version=“1.0” />
六、Dubbo管理控制台
1、管理控制台功能
路由规则、动态配置、服务降级、访问控制、权重调整、负载均衡
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包
-
step3:将dubbo-admin-2.5.10.war复制到apache-tomcat-8.0.32//webapps目录下,并解压
-
step4:将dubbo-admin-2.5.10文件夹下的所有文件复制到ROOT文件夹里
-
step5:修改tomcat启动端口号为8090,因为zookeeper启动端口号也是8080。(进入apache-tomcat-8.0.32/conf下,修改server.xml文件)
-
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
- 需要账号密码登录
- 登录成功
- 账号密码在webapps/ROOT/WEB-INF下的dubbo.properties文件中,可以是root/root,也可以是guest/guest