背景

目前nodejs应用越来越广泛,但和java的dubbo体系接入困难,所以我们需要实现node端的dubbo provider逻辑。java的dubbo provider是和consumer在一个jar中,提供了服务配置、注册、集群与负载均衡、监控和多种协议。使用nodejs实现一个可用的dubbo provider SDK完全没有问题,最简单的实现则是在对应ZK集群注册接口与机器IP的映射关系,consumer便可以访问对应rpc接口。可是,在可用基础上,仍然需要提供相关配套设施如配置、注册和监控等,达到商业上的高可用。在评估了各种实现方案后,决定放弃开发node provider端sdk,使用node+agent的proxy模式。

agent是一个可与node服务交互通信的,并提供dubbo provider功能的java服务。agent部署在nodejs服务机器上,扮演dubbo服务的入口角色,同时node服务返回的数据类型由agent进行转换映射,如 object(node) -> Map(Java), 具体转换规则则由node接口提供方提供调用接口jar包,consumer使用jar包进行调用即可。

整体架构

其中 vitamin为基于数据库的统一配置平台,解耦各个系统的强依赖。

Node中间件

Node中间件提供dubbo接口上报和服务提供功能。上报http接口要暴露的Dubbo服务配置信息(interface+version+method)即映射关系,node的提供rpc服务以HTTP形式存在(兼容之前业务),由agent进行调用,数据类型为JSON。

Agent

  • 根据Vitamin的实时配置向zookeeper注册dubbo服务(泛化)

  • 泛化服务每个method会根据Vitamin中的映射关系找到对应的http本地接口(localhost)进行调用

-入参和返回值进行json和Java类型的转换

Node业务方

  • Node提供普通的HTTP+JSON服务,可复用历史接口

  • 提供一个对应dubbo接口的jar包,需保证http接口json和jar中的model转换关系可行

上游业务

  • 拿到jar包依赖之后,像普通dubbo服务一样调用即可

类型转换

Dubbo方法入参转换成NodeJs的http调用参数:强类型转弱类型,可直接转换
NodeJs服务返回的json转Dubbo方法返回值:弱类型转强类型
解决方案:Dubbo泛化服务返回Map,consumer端拿到这个Map会自动根据client.jar的方法返回值类型(支持泛型)进行相应的字段注入

可能存在的问题

  • agent不会在调用nodejs服务进行熔断,即nodejs服务大量超时可能会让agent连接池或线程池占满

  • agent进程的生命周期由node进程维护,通过基于配置中心的心跳机制检测agent进程是否存活

  • 错误排查定位由于多了一层调用,更为复杂

  • 可能存在的单机性能问题

Nodejs“实现”Dubbo Provider的更多相关文章

  1. dubbo.provider和dubbo.consumer配置

    Configure service provider <?xml version="1.0" encoding="UTF-8"?> <bean ...

  2. Apache Dubbo Provider默认反序列漏洞复现(CVE-2020-1948)

    Apache Dubbo Provider默认反序列漏洞(CVE-2020-1948) 0x01 搭建漏洞环境 漏洞介绍 2020年06月23日, 360CERT监测发现Apache Dubbo 官方 ...

  3. dubbo provider如何对invoker进行export

    如何把provider的invoker export出去:1)为原始对象加wrapper,生成invoker:2)给invoker加各种filter,启动监听服务:3)注册服务地址 以HelloSer ...

  4. 【CVE-2020-1948】Apache Dubbo Provider反序列化漏洞复现

    一.实验简介 实验所属系列: 系统安全 实验对象:本科/专科信息安全专业 相关课程及专业: 计算机网络 实验时数(学分):2 学时 实验类别: 实践实验类 二.实验目的 Apache Dubbo是一款 ...

  5. Node EE方案 -- Rockerjs在微店的建设与发展

    本文是根据2019.4.13日参加 "Node-Party"论坛使用的PPT,加上笔者新的思考与沉淀而来.在此再次感谢贝贝网前端部门和芋头君以及相关与会人员的支持! -- 微店杨力 ...

  6. 【dubbo】dubbo项目基本结构及provider构建

    dubbo项目基本结构如下,分别部署于不同服务器: 1.provider(接口API 实现) 2.consumer(web) 3.zookeeper 4.DB provider构建 1.api构建 i ...

  7. dubbo服务提供与消费

    一.前言 项目中用到了Dubbo,临时抱大腿,学习了dubbo的简单实用方法.现在就来总结一下dubbo如何提供服务,如何消费服务,并做了一个简单的demo作为参考. 二.Dubbo是什么 Dubbo ...

  8. Dubbo学习小记

    前言 周一入职的新公司,到了公司第一件事自然是要熟悉新公司使用的各种技术,搭建本地的环境. 熟悉新公司技术的过程中,首先就是Maven,这个前面已经写过文章了,然后就是Dubbo----公司的服务都是 ...

  9. dubbo 配置解析

    1.dubbo 常用配置 <dubbo:service/> 服务配置,用于暴露一个服务,定义服务的元信息,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心.eg.<dub ...

随机推荐

  1. mac chrome 强制刷新浏览器缓存

    普通刷新 command + r 强制刷新 command + shift + r

  2. Weex开发中的应用小笔记

    内容: 获取输入或其他操作使得值一直改变并在一段不改变的时间后执行下一步操作(输入搜索关键字并执行搜索) https://vuejs.org/v2/guide/computed.html?spm=a2 ...

  3. PHP 多个构造函数

    class A { function __construct() { $a = func_get_args(); $i = func_num_args(); if (method_exists($th ...

  4. Xcode工程编译错误之iOS开发之The Xcode build system has crashed. Please close and reopen your workspace

    解决方法: . 删除DerivedData . 参照上面的链接设置:File -> Workspace Settings -> Build System -> Legacy Buil ...

  5. python之元组

    一.元组定义 元组(tuple)使用小括号()来定义,它是不可变数据类型,它的元素不可变,但元素的元素是可变的,比如tuple中一个元素为list列表时,list中的元素是可变的 # 在定义tuple ...

  6. Spring+Mybatis 复杂的分组查询

    1.需要的结果数据格式为 { "responseCode": "0000", "responseMsg": null, "data ...

  7. linux echo 命令 打印字符串

    打印字符串 [root@MongoDB ~]# echo "heloworld" heloworld

  8. mybatisplus ssm配置要点

    本以为不难,但也捣鼓了大半天,记录要点如下: 在pom中引入mybatis plus相关包 <!-- mybatis-plus框架包 start --> <dependency> ...

  9. P3803 【模板】多项式乘法(FFT)

    传送门: 参考博客 1:大佬  attack 参考博客 2:大佬  胡小兔 在这里再膜拜一下这两位大佬 Orz%%% #include<iostream> #include<cstd ...

  10. Python3.0科学计算学习之绘图(三)

    matplotlib对象: 使用matplotlib的pyplot模块,可以供用户直接使用最重要的绘图命令.多数情况下,我们希望创建一个图形并且立即展示出来,但是有时如果生成要通过更改其属性来修改的图 ...