浅析分布式服务框架dubbo

2022-09-12

一、dubbo介绍

(一) 基本介绍

dubbo框架是阿里开源 (目前该框架已进入Apache基金孵化器) 的一款高性能SOA框架, 使应用可以通过高性能的RPC (RPC指远程过程调用) 实现服务端的输入和输出功能, 并且框架与spring可以实现无缝集成。dubbo支持高性能RPC调用, 支持动态负载均衡, 支持服务自动注册发现, 高度可扩展, 运行时流量和服务监控, 服务治理等。从dubbo框架的基本结构可知, Container是服务运行容器。其中Provider提供者, 是远程服务的提供方, 具体服务的实现者。Consumer消费者, 调用远程服务的消费者。Registry注册中心, 服务注册和发现的注册中心 (官方推荐使用Zoo Keeper注册中心) 。Monitor监控中心 (Dubbo Admin或Dubbo Monitor) , 可以统计服务的调用次数、调用时间、服务可用性监控等。

第0步:服务运行容器启动时, 会加载并运行Provider服务提供者。第1步:Provider服务提供者启动时, 向Registry注册中心注册所提供的服务。第2步:Consumer服务消费者启动时, 向Registry注册中心订阅需要的服务。第3步:Registry注册中心返回Provider服务提供者地址列表给Consumer消费者。第4步:Consumer服务消费者, 从提供者地址列表中, 基于均衡算法, 选一台Provider提供者进行调用。如果调用失败, 再选另一台调用。第5步:Consumer服务消费者和Provider提供者, 在内存中累计调用次数和调用时间, 定时发送统计数据到监控中心

(二) dubbo优缺点

优点如下:高性能RPC调用。使用时像本地方法一样调用远程方法, 只需要简单配置。负载均衡和容错机构。快速负载均衡扩展, 只需要额外添加一台机器, 并注册到注册中心, 即可使用该机器提供的服务。服务自动发现。不需要每个服务都配置其他服务的地址, 而是通过注册中心动态获取其他服务的地址。可以缓存服务地址, 注册中心可以动态服务服务算法。服务监控和治理。使用Dubbo Admin或Dubbo Monitor工具, 可以方便地定位服务状态, 进行多版本管理。

缺点如下:目前dubbo只支持java语言。

二、疑难问题分析

(一) 简易开发指南

针对具体某个模块, 使用Maven构建项目, 开发目录结构包括以下方面:uc是用户模块, api是接口定义模块, svc是服务提供者, web是服务消费者。在api中定义svc和web层需要的java bean、公共方法及接口规范。svc层中可以使用该java bean或公共方法, 并实现api中定义的接口规范的具体逻辑。web层中也是使用该java bean或公共方法, 并调用api中定义的接口。这样web和svc就实现了解耦, 二者该面向接口编程。不仅如此, 此svc服务也可以供其他svc或web来使用。只要将svc层部署多台, 即可快速实现负载均衡。

(二) 启动时检查问题

dubbo默认情况下会做启动检查, 当服务容器启动时会检查服务是否可用, 如果不可用则会抛出异常, 阻止项目继续初始化。如果项目中存在循环依赖时, 则会有问题, 这时候可以添加check=”false”设置。这时候服务容器可以正常使用, 不会阻止项目继续初始化。一般情况下最好添加这个配置。比如:

这时候如果svc层的IUser Service服务提供者还未启动, web层仍然可以继续使用。当IUser Service服务恢复时可以自动连接上。对于启动时检查问题, 可能会存在一种情况, 不是通过spring容器显式依赖IUser Service服务时, 这时候如果继续添加check=”false”。可能在第一次使用时会有问题, 这时候不要加上这个配置。

(三) 版本号问题

dubbo服务提供者和消费者支持相同版本号之间的调用, 如果提供者和消费者之间版本号不同, 则会调用失败。这一点非常重要, 比如开发机器和测试环境使用同一个Zoo Keeper注册中心时。在未指定版本号 (通用版本号) 的情况下, 则测试环境web也可以调用到开发机器的服务。这时候, 只要在开发机器中添加一个特定的版本号则可以避免这个问题。添加版本号方式如下:

在开发过程中, 建议对特定服务接口指定具体版本号, 而不是全局指定版本号, 方便定位问题并查找解决方案。

(四) 序列化和部署问题

dubbo支持多种序列化方式。dubbo默认序列化方式为hession2, 是阿里修改过的hession2版本。也可以使用json序列化或java序列化方式, 不过这些都不是非常高效。推荐使用高效的kryo序列化方式, 这种方式的优点是序列化和反序列化效率非常高, 同时可以针对一些未实现java.io.Serializable接口的类进行序列化。而hession2, json和java等其他序列化方式均要求实现java.io.Serializable接口。在实践中发现, kryo也有一些缺点, 那就是部署时可能有点不是很方便, 比如api中某个java bean中添加了新字段, 这时候如果svc层使用了最新的java bean, 而web层还是使用旧的java bean, 则可能会报反序列化异常。因此在项目中, 还是要根据项目实际情况选择合适的序列化方式。dubbo序列化和反序列化时默认有一个8M的大小的限制, 一般情况下没有问题, 如果涉及到一键导出数据或者上传数据的时候, 8M肯定是不够用的, 这时候需要添加一个dubbo配置。比如设置限制为100M如下:dubbo.protocol.dubbo.payload=104857600。需要在svc层和web层同时添加此配置。

三、结束语

本文对开源的分布式服务框架dubbo进行了详细介绍, 并针对开发过程中遇到的疑难问题进行了分析并给出了解决方案。希望对想将项目转换为分布式服务框架或正在使用dubbo框架的人员给予一定的指导作用。

摘要:文章介绍了开源的dubbo分布式服务框架, 并对该框架使用过程中遇到的疑难问题进行具体分析。

关键词:分布式服务框架,dubbo

参考文献

[1] 李艳鹏等.可伸缩服务架构:框架与中间件[M].北京:电子工业出版社, 2018.

[2] 李林峰等.分布式服务框架原理与实践[M].北京:电子工业出版社, 2016.

[3] Sam Newman等.微服务设计[M].北京:人民邮电出版社, 2016.

上一篇:基于“服务-学习”模式的高职艺术设计专业服务区域发展探索——以珠海城市职业技术学院为例下一篇:关于天然气长输管道的调度运行管理的若干思考