介绍:Apache Dubbo 是一款微服务框架,为大规模微服务实践提供高性能 RPC 通信、流量治理、可观测性等解决方案,涵盖 Java、Golang 等多种语言 SDK 实现。
特征:RPC 通讯框架,服务注册中心,支持原生云(Dubbo3.0)
主流版本:2.7.x , 3.0 **SDK: **官方 SDK 支持开发语言:Java、Golang
使用厂家:阿里巴巴、饿了么、钉钉、工商银行、小米等
注:本文后续主要基于 2.7.x 版本展开。
对比 | Dubbo | Eureka(Spring-Cloud-Netflix) |
注册中心 | ZK | Eureka |
CAP | CP | AP |
容错机制 | 支持 | 通过 Hytrix 支持 |
负载均衡 | 支持 | 通过 Ribbon 支持 |
服务注册和发现协议 | 封装 NettyClient 实现 | 使用 HttpClient |
社区支持 | Apache | 不更新 |
总结:Dubbo 对比 Eureka 来说的话,其实一个打包的微服务中间件,并且定制化了 RPC 通讯 dubbo 协议对比 HTTP 协议来说性能上会有一定的提高。但是我们对于微服务本身来说应该是一个细粒度的,可以定制的组件对于 Eureka 来说这方面更强。
下面是一个通过 dubbo 作为 RPC 通讯的一个例子,一般在生产中会使用 zk 或者 redis 等,作为服务注册中心来保存服务信息。一个大致的交互图如下:
三个角色
Zookeeper 作为一个服务注册中心,管理和维护服务列表;
Provider 服务提供者,发布服务;
Consumer 服务消费者,通过 API stub 可以像调用本地方法一样调用远程的方法;
服务接口定义
复制
public interface OrderService {String createOrder(String request);}
1.
2.
3.
服务提供者实现
复制
public class OrderServiceImpl implements OrderService {@Override public String createOrder(String request) {return "create order success, request : " + request;}}
1.
2.
3.
4.
5.
6.
7.
服务启动类
复制
public class RpcDubboProvidorApp {public static void main(String[] args) throws IOException {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"classpath:dubbo.xml"});context.start();System.in.read(); // 按任意键退出}}
1.
2.
3.
4.
5.
6.
7.
配置文件
复制
<?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="rpc-dubbo-provider"/><!-- 使用 zookeeper 注册中心暴露服务地址 --><dubbo:registry address="zookeeper://127.0.0.1:2181"/><!-- 用dubbo协议在20880端口暴露服务 --><dubbo:protocol name="dubbo" port="20880"/><!-- 声明需要暴露的服务接口 --><dubbo:service interface="io.zhengsh.rpc.api.OrderService" ref="orderService" /><!-- 和本地bean一样实现服务 --><bean id="orderService" class="io.zhengsh.rpc.provider.OrderServiceImpl" /></beans>
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
服务配置
复制
<?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="rpc-dubbo-consumer" /><!-- 配置 zookeeper 注册中心的位置 --><dubbo:registry address="zookeeper://127.0.0.1:2181" /><!-- 配置dubbo的通讯方式,即使用的协议及使用的端口 --><dubbo:protocol name="dubbo" port="20890" /><!-- 生成远程服务代理,可以和本地bean一样使用 orderService --><dubbo:reference id="orderService" interface="io.zhengsh.rpc.api.OrderService" /></beans>
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
服务调用方代码
复制
public class RpcDubboConsumerApp {public static void main(String[] args) {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"classpath:dubbo.xml"});context.start();// 获取远程服务代理 OrderService demoService = (OrderService) context.getBean("orderService");// 执行远程方法 String hello = demoService.createOrder("iPhone 19");// 显示调用结果 System.out.println(hello);}}
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
运行一下:
我们首先启动RpcDubboProvidorApp
然后启动RpcDubboConsumerApp
控制台输出如下:
你如果也能获得如下的输出表示实验成功。恭喜。
Dubbo Admin 安装
下载代码:git clone https://github.com/apache/dubbo-admin.git
在dubbo-admin-server/src/main/resources/application.properties中指定注册中心地址
构建
mvn clean package -Dmaven.test.skip=true
启动
mvn --projects dubbo-admin-server spring-boot:run 或者
cd dubbo-admin-distribution/target; java -jar dubbo-admin-0.4.0.jar
访问 http://localhost:8080
默认密码是 root/root
找到自己注册服务
模拟请求服务
点击上一个页面的 测试 按钮,进入如下页面,测试服务接口,如下图:
我传递参数,下面成功返回,可以在开发期间做一个简单的测试。
服务提供者和服务消费者查询如下图所示。
双击服务列表中的服务即可进入。
https://dubbo.apache.org/zh/docsv2.7/user/quick-start/
https://github.com/apache/dubbo-admin/blob/develop/README_ZH.md