Dubbo 高性能 RPC 框架实践

2022-09-15 10:22:19 浏览数 (1)

Dubbo 介绍

Dubbo 是什么?

介绍:Apache Dubbo 是一款微服务框架,为大规模微服务实践提供高性能 RPC 通信、流量治理、可观测性等解决方案,涵盖 Java、Golang 等多种语言 SDK 实现。

特征:RPC 通讯框架,服务注册中心,支持原生云(Dubbo3.0)

主流版本:2.7.x , 3.0 **SDK: **官方 SDK 支持开发语言:Java、Golang

使用厂家:阿里巴巴、饿了么、钉钉、工商银行、小米等

注:本文后续主要基于 2.7.x 版本展开。

Dubbo 和 Eureka 对比

对比

Dubbo

Eureka(Spring-Cloud-Netflix)

注册中心

ZK

Eureka

CAP

CP

AP

容错机制

支持

通过 Hytrix 支持

负载均衡

支持

通过 Ribbon 支持

服务注册和发现协议

封装 NettyClient 实现

使用 HttpClient

社区支持

Apache

不更新

总结:Dubbo 对比 Eureka 来说的话,其实一个打包的微服务中间件,并且定制化了 RPC 通讯 dubbo 协议对比 HTTP 协议来说性能上会有一定的提高。但是我们对于微服务本身来说应该是一个细粒度的,可以定制的组件对于 Eureka 来说这方面更强。

Dubbo 使用案例

下面是一个通过 dubbo 作为 RPC 通讯的一个例子,一般在生产中会使用 zk 或者 redis 等,作为服务注册中心来保存服务信息。一个大致的交互图如下:

三个角色

  • Zookeeper 作为一个服务注册中心,管理和维护服务列表;
  • Provider 服务提供者,发布服务;
  • Consumer 服务消费者,通过 API stub 可以像调用本地方法一样调用远程的方法;

服务提供者

  1. 服务接口定义
代码语言:javascript复制
public interface OrderService {
    String createOrder(String request);
}
  1. 服务提供者实现
代码语言:javascript复制
public class OrderServiceImpl implements OrderService {

    @Override
    public String createOrder(String request) {
        return "create order success, request : "   request;
    }
}
  1. 服务启动类
代码语言:javascript复制
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. 配置文件
代码语言:javascript复制
<?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. 服务配置
代码语言:javascript复制
<?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. 服务调用方代码
代码语言:javascript复制
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. 运行一下:
  • 我们首先启动 RpcDubboProvidorApp
  • 然后启动 RpcDubboConsumerApp
  • 控制台输出如下:

image-20220811223333584.png

你如果也能获得如下的输出表示实验成功。恭喜。

Dubbo 监控

Dubbo Admin 安装

  1. 下载代码: git clone https://github.com/apache/dubbo-admin.git
  2. dubbo-admin-server/src/main/resources/application.properties中指定注册中心地址

image.png

  1. 构建
    • mvn clean package -Dmaven.test.skip=true
  2. 启动
    • mvn --projects dubbo-admin-server spring-boot:run 或者
    • cd dubbo-admin-distribution/target; java -jar dubbo-admin-0.4.0.jar
  3. 访问 http://localhost:8080

image.png

  1. 默认密码是 root/root

Dubbo Admin 使用

  1. 找到自己注册服务

image.png

  1. 模拟请求服务

点击上一个页面的 测试 按钮,进入如下页面,测试服务接口,如下图:

我传递参数,下面成功返回,可以在开发期间做一个简单的测试。

  1. 服务提供者和服务消费者查询如下图所示。

双击服务列表中的服务即可进入。

参考文档

  • https://dubbo.apache.org/zh/docsv2.7/user/quick-start/
  • https://github.com/apache/dubbo-admin/blob/develop/README_ZH.md

公众号:运维开发故事

github:https://github.com/orgs/sunsharing-note/dashboard

博客:https://www.devopstory.cn

爱生活,爱运维

我是冬子先生,《运维开发故事》公众号团队中的一员,一线运维农民工,云原生实践者,这里不仅有硬核的技术干货,还有我们对技术的思考和感悟,欢迎关注我们的公众号,期待和你一起成长!

关注我,不定期维护优质内容

温馨提示

如果我的文章对你有所帮助,还请帮忙点赞、在看、转发一下,你的支持会激励我输出更高质量的文章,非常感谢!

你还可以把我的公众号设为「星标」,这样当公众号文章更新时,你会在第一时间收到推送消息,避免错过我的文章更新。

0 人点赞