Dubbo学习笔记之基本使用

Dubbo的基本使用

Dubbo简单介绍

dubbo 主要是一个分布式服务治理解决方案。服务治理主要是针对大规模服务化以后,服务之间的路由、负载均衡、容错机制、服务降级这些问题的解决方案,而 Dubbo 实现的不仅仅是远程服务通信,并且还解决了服务路由、负载、降级、容错等功能。
详情参考官网文档介绍

基本使用

使用版本:2.7.5
使用zookeeper作为注册中心,zookeeper版本:3.5.5

Demo项目

创建三个maven项目
dubbo-client:客户端
dubbo-server:服务端
dxy-api:公共API接口

dxy-api 公共接口定义

1
2
3
public interface HelloService {
String sayHello(String name);
}

dubbo-client端

maven依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<dependencies>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
</dependency>

<dependency>
<groupId>com.dxysun</groupId>
<artifactId>dxy-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>

<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
</dependency>
</dependencies>

在resources下创建application.xml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="hello-client-app" />

<!-- 使用multicast广播注册中心暴露服务地址 -->
<!-- <dubbo:registry address="multicast://224.5.6.7:1234" />-->
<!-- <dubbo:registry address="N/A" />-->
<dubbo:registry address="zookeeper://localhost:2181" />

<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />

<!-- 声明需要暴露的服务接口 -->
<!-- <dubbo:reference interface="com.dxysun.dubbo.api.HelloService" id="helloService" url="dubbo://192.168.196.1:20880/com.dxysun.dubbo.api.HelloService"/>-->
<dubbo:reference interface="com.dxysun.dubbo.api.HelloService" id="helloService"/>
</beans>

client 入口Main函数

1
2
3
4
5
6
7
8
9
10
11
12
public class ClientMain
{

public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext(new String[]
{ "application.xml" });
HelloService helloService = (HelloService) classPathXmlApplicationContext.getBean("helloService");
System.out.println(helloService.sayHello("client"));

System.in.read();
}
}

dubbo-server端

maven依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<dependencies>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<dependency>
<groupId>com.dxysun</groupId>
<artifactId>dxy-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>

<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>

<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
</dependency>
</dependencies>

在resources/META-INF/spring下创建spring.xml 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="hello-server-app" />

<!-- 使用multicast广播注册中心暴露服务地址 -->
<!-- <dubbo:registry address="multicast://224.5.6.7:1234" />-->
<!-- <dubbo:registry address="N/A" />-->
<dubbo:registry address="zookeeper://127.0.0.1:2181" />

<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />

<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="com.dxysun.dubbo.api.HelloService" ref="helloService" />

<!-- 和本地bean一样实现服务 -->
<bean id="helloService" class="com.dxysun.dubbo.server.impl.HelloServiceImpl" />
</beans>

在resources下新建logback.xml文件,设置日志打印级别为debug,使启动时打印更多的日志

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT"
class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%date{ISO8601} %-5level
[%thread] %logger{32} - %message%n</pattern>
</layout>
</appender>
<root>
<level value="DEBUG"/>
<appender-ref ref="STDOUT"/>
</root>
</configuration>

server端接口实现

1
2
3
4
5
6
7
public class HelloServiceImpl implements HelloService
{
public String sayHello(String name)
{
return "dubbo say hello " + name;
}
}

server端入口Main函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class ServerMain {
public static void main(String[] args) throws IOException {
// Dubbo 自带的入口函数启动
Main.main(args);

// Dubbo 自带的入口函数启动,可设置相应参数
// Main.main(new String[]{"spring", "log4j"});

// spring配置文件启动
/* ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext(new String[]
{ "META-INFO/spring/spring.xml" });
classPathXmlApplicationContext.start();
System.in.read();*/
}
}

Dubbo 提供了几种容器去启动和发布服务
容器类型
Spring Container 自动加载 META-INF/spring 目录下的所有 Spring 配置。
logback Container 自动装配 logback 日志
Log4j Container 自动配置 log4j 的配置
Dubbo 提供了一个 Main.main 快速启动相应的容器,默认情况下,只会启动 spring 容器

使用 zookeeper 作为注册中心

需要以下jar包依赖

1
2
3
4
5
6
7
8
9
10
<dependency> 
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.0.0</version>
</dependency>

curator 4.0.0 版本对应的是zookeeper 3.5 版本,使用3.4版本会报错

Dubbo 监控平台安装

Dubbo 也有相应的监控平台,github地址

使用步骤

  1. 将该项目clone下来,切换到develop分支,修改 dubbo-admin-server/src/main/resources/application.properties中的配置信息
  2. mvn clean package 进行构建
  3. mvn --projects dubbo-admin-server spring-boot:run
  4. 访问 localhost:8080

Dubbo 的终端操作方法

Dubbo 里面提供了一种基于终端操作的方法来实现服务治理
使用 telnet localhost 20880 连接到服务对应的端口

经测试,dubbo 2.7.5版本有bug,运行telnet命令会提示Unsupported command,dubbo 2.7.2 版本无此问题

解决方法

在项目resources目录中添加META-INF/dubbo/org.apache.dubbo.remoting.telnet.TelnetHandler文本文件,然后将加载失败的类包名修改后,配置到文件中。
文件内容如下:

1
2
3
4
5
6
7
8
9
ls=org.apache.dubbo.qos.legacy.ListTelnetHandler
ps=org.apache.dubbo.qos.legacy.PortTelnetHandler
cd=org.apache.dubbo.qos.legacy.ChangeTelnetHandler
pwd=org.apache.dubbo.qos.legacy.CurrentTelnetHandler
invoke=org.apache.dubbo.qos.legacy.InvokeTelnetHandler
trace=org.apache.dubbo.qos.legacy.TraceTelnetHandler
count=org.apache.dubbo.qos.legacy.CountTelnetHandler
select=org.apache.dubbo.qos.legacy.SelectTelnetHandler
shutdown=org.apache.dubbo.qos.legacy.ShutdownTelnetHandler

在项目中添加配置项:

1
2
3
4
# spring boot 项目添加配置
dubbo.protocol.telnet=ls,ps,cd,pwd,invoke,trace,count,select,shutdown
# 若是xml配置,添加如下配置
<dubbo:protocol telnet="ls,ps,cd,pwd,invoke,trace,count,select,shutdown" />

使用方法在官方文档中有说明:扩展telnet

常见命令

ls

1
2
3
4
ls: 显示服务列表 
ls -l: 显示服务详细信息列表
ls XxxService: 显示服务的方法列表
ls -l XxxService: 显示服务的方法详细信息列表

ps

1
2
3
4
ps: 显示服务端口列表 
ps -l: 显示服务地址列表
ps 20880: 显示端口上的连接信息
ps -l 20880: 显示端口上的连接详细信息

cd

1
2
3
cd XxxService: 改变缺省服务,当设置了缺省服务,凡是需要输入服务名作
为参数的命令,都可以省略服务参数
cd /: 取消缺省服务

pwd

1
pwd: 显示当前缺省服务

count

1
2
3
4
count XxxService: 统计 1 次服务任意方法的调用情况 
count XxxService 10: 统计 10 次服务任意方法的调用情况
count XxxService xxxMethod: 统计 1 次服务方法的调用情况
count XxxService xxxMethod 10: 统计 10 次服务方法的调用情况

更多参考官网Telnet 命令参考手册

代码gitee地址

参考

Dubbo官网
Dubbo github地址
telnet问题解决方案

打赏

请我喝杯咖啡吧~

支付宝
微信