Nodejs“实现”Dubbo Provider
背景
目前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的更多相关文章
- dubbo.provider和dubbo.consumer配置
Configure service provider <?xml version="1.0" encoding="UTF-8"?> <bean ...
- Apache Dubbo Provider默认反序列漏洞复现(CVE-2020-1948)
Apache Dubbo Provider默认反序列漏洞(CVE-2020-1948) 0x01 搭建漏洞环境 漏洞介绍 2020年06月23日, 360CERT监测发现Apache Dubbo 官方 ...
- dubbo provider如何对invoker进行export
如何把provider的invoker export出去:1)为原始对象加wrapper,生成invoker:2)给invoker加各种filter,启动监听服务:3)注册服务地址 以HelloSer ...
- 【CVE-2020-1948】Apache Dubbo Provider反序列化漏洞复现
一.实验简介 实验所属系列: 系统安全 实验对象:本科/专科信息安全专业 相关课程及专业: 计算机网络 实验时数(学分):2 学时 实验类别: 实践实验类 二.实验目的 Apache Dubbo是一款 ...
- Node EE方案 -- Rockerjs在微店的建设与发展
本文是根据2019.4.13日参加 "Node-Party"论坛使用的PPT,加上笔者新的思考与沉淀而来.在此再次感谢贝贝网前端部门和芋头君以及相关与会人员的支持! -- 微店杨力 ...
- 【dubbo】dubbo项目基本结构及provider构建
dubbo项目基本结构如下,分别部署于不同服务器: 1.provider(接口API 实现) 2.consumer(web) 3.zookeeper 4.DB provider构建 1.api构建 i ...
- dubbo服务提供与消费
一.前言 项目中用到了Dubbo,临时抱大腿,学习了dubbo的简单实用方法.现在就来总结一下dubbo如何提供服务,如何消费服务,并做了一个简单的demo作为参考. 二.Dubbo是什么 Dubbo ...
- Dubbo学习小记
前言 周一入职的新公司,到了公司第一件事自然是要熟悉新公司使用的各种技术,搭建本地的环境. 熟悉新公司技术的过程中,首先就是Maven,这个前面已经写过文章了,然后就是Dubbo----公司的服务都是 ...
- dubbo 配置解析
1.dubbo 常用配置 <dubbo:service/> 服务配置,用于暴露一个服务,定义服务的元信息,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心.eg.<dub ...
随机推荐
- stm32通用定时器详解
在stm32的开发中我们经常会用到定时器,因此在学习stm32的过程中定时器是必须要学的,而定时主要又分为三大类分别为: 高级控制定时器(TIM1与TIM8) 通用定时器(TIM2~TIM5) 基本定 ...
- [Day23]IO(字节流、字符流)
1.字节流 1.1 字节输出流OutputStream-抽象类,表示输出字节流的所有类的超类 (1)void close() 关闭此输出流并释放与此流相关的所有系统资源 (2)void flush() ...
- Elasticsearch学习笔记(七)document小结
一.生成document id 1.自动生成document id 自动生成的id,长度为20个字符,URL安全,base64编码,GUID,分布式系统并行生成时不可能 ...
- Logstash安装介绍
前言 logstash是ELK日志系统中的一部分,主要承担将收集完成日志进行过滤,并且输出到es的职责. logstash本身也可以作为客户端部署到应用系统的服务器上进行日志收集,但是由于资源开销占用 ...
- .net core mysql ef
利用nuget添加以下引用 MySql.Data.EntityFrameworkCore Pomelo.EntityFrameworkCore.MySql Micros ...
- mysql授权用户,撤销用户,撤销权限基本操作
进入mysql库 use mysql; mysql> select host,user from user; +-----------+---------------+ | host | use ...
- Django---手动编写视图
手动编写视图 一. Request----->URL---->业务处理(Views)(Http Response) Response-------> 二. VOE Django ...
- python报错记录
1.AttributeError: 'NoneType' object has no attribute 'group' import re s=r'<title>kobe<\tit ...
- 杂记:解决Android扫描BLE设备名称不刷新问题
背景 个人开发过一种BLE设备有这样一种需求:当设备处于状态A时,广播设备名称A:处于状态B时,广播设备名称B. 问题 我们发现,当Android在进行Ble扫描的时候,扫描回调函数onScanRes ...
- js写一个chrome 插件
访问网站的时候,最烦的就是一些弹窗和广告.于是,就想着能不能在访问特定网站的时候,执行一段js脚本,去除页面的广告.于是乎,好像 chrome 插件可以实现. 这里,以 百度 的网站为例 新建 sim ...