Git Product home page Git Product logo

apache / dubbo-js Goto Github PK

View Code? Open in Web Editor NEW
754.0 115.0 160.0 41.28 MB

The Typescript implementation of Apache Dubbo. An RPC and microservice framework for Node.js and Web development.

Home Page: https://dubbo.apache.org/

License: Apache License 2.0

JavaScript 4.80% Java 0.07% TypeScript 92.26% Shell 0.08% Go 1.61% HTML 0.03% CSS 0.14% Makefile 1.01%
http2 javascript microservices nodejs rpc service-mesh http typescript web

dubbo-js's Introduction

Apache Dubbo for ECMAScript

License Build

Apache Dubbo is an easy-to-use Web and RPC framework that provides different language implementations(Java, Go, Rust, Node.js, Javascript) for communication, service discovery, traffic management, observability, security, tools, and best practices for building enterprise-ready microservices.

Dubbo-js is the TypeScript implementation of Dubbo triple protocol (a fully gRPC compatible and http friendly protocol), which can be used for Node.js and web application development. With dubbo-js, you can easily build applications working on browser and frontend that can communicate with backend services through http-based protocol.

arc

Get Started

The following two demos will guide you on how to create Node.js backend and web applications using dubbo-js.

You can call backend Dubbo services with type-safe APIs:

const resp = await client.say({sentence: "Hello, Dubbo."});
console.log(resp);

Or, you can curl them if you want:

curl \
 --header 'Content-Type: application/json' \
 --data '{"sentence": "Hello World"}' \
 http://localhost:8080/apache.dubbo.demo.example.v1.ExampleService/Say

Get started on the web

Follow this guide to learn how to develop web applications that can access backend Dubbo services and running on browser.

We support all modern web browsers that implement the widely available fetch API and the Encoding API.

Get started on Node.js

Follow this guide here to learn how to develop and spin up a backend Dubbo service in Node.js, and call it from cURL, the web browser, or a Dubbo client in your terminal.

In addition, Dubbo integrates middlewares such as express, fastify, and next, making it easier for users to build a Dubbo distributed service framework using Node.js.

Service Governance features

Besides rpc protocol, we plan to provide dubbo-js rich service governance features so it can work seamlessly with other microservice architecture.

The features listed below are still under development, we will update each feature's status once ready.

  • 🚧 Service Discovery:

Nacos, Zookeeper, Kubernetes, etc.

  • 🚧 Load Balance:

Random, RoundRobin, LeastActive, ConsistentHash, etc.

  • 🚧 Traffic Routing: Traffic split, Circuit breaking, Canary release, etc.

  • 🚧 Filter: Token, AccessLog, Rate limiting, etc.

  • 🚧 Metrics: Prometheus

  • 🚧 Tracing: Jaeger, Zipkin

How to contribute

Please check CONTRIBUTING for how to contribute to this project.

Connect us

Search Dingding group number and join us: 27690019068

Credit

This project is based on bufbuild/connect-es, an open-source project released under Apache License v2. Comparing to connect-es, dubbo-js removed the unused grpc-web and connect protocol, added support for Dubbo protocol, no-idl programming api and many service governance features.

We have a announcement in our LICENSE file and keep all license headers of files come from connect-es unchanged.

dubbo-js's People

Contributors

0808zhongshang avatar 18003228289 avatar 7inspire avatar albumenj avatar atarismio avatar binlaniua avatar chaoshimeng avatar chickenlj avatar coderserio avatar crab666 avatar creasy2010 avatar dependabot[bot] avatar dsky1990 avatar fengwei5280 avatar godkun avatar hsiaosiyuan0 avatar hufeng avatar ikun-lg avatar jackyangkunkun avatar jasonjoo2010 avatar jianyi-gronk avatar lmikoto avatar luckyyyyy avatar ohiamfine avatar ralf0131 avatar realbillwong avatar songjiachao avatar sunchuanleihit avatar zhaoleipeng avatar zhcsyncer avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

dubbo-js's Issues

实现dubbo接口调用的retry机制

在某个版本内部实现中,是有retry的机制
在内部讨论下,在一些场景下接口调用不是幂等的,暂时舍弃这部分功能。

作为opensource就完善这个功能。
在Context记录retry次数,然后在scheduler中timeoutError后者onClose中尝试重试机制。

could not find any agent worker with com.xxx.xxx

在开发过程中 调用 com.qianmi.mc.api.buyer.BuyerActivityQueryProvider 出现异常.跟踪如下:

image

dubbo 启动时,providerurl信息,可以看出BuyerActivityQueryProvider 并没有相应的provider
image
登陆 zookeeper 查看 ,确实没有
image

查看 dubbo源代码 . 在调用接口,如果没找到相应的SocketWorker,则会报:Could not find any agent worker

  private _handleDubboInvoke(requestId: number) {
    //get request context
    const ctx = queue.requestQueue.get(requestId);
    //get socket agent list
    const agentAddrList = this._zkClient.getAgentAddrList(ctx);
    log('agentAddrSet-> %O', agentAddrList);
    const worker = this._serverAgent.getAvailableSocketWorker(agentAddrList);

    //if could not find any available socket agent worker
    if (!worker) {
      const {requestId, dubboInterface, version, group} = ctx;
      const msg = `requestId#${requestId}:Could not find any agent worker with ${dubboInterface}#${version}#${group} agentList: ${agentAddrList.join(
        ',',
      )}`;
      const err = new ScheduleError(msg);
      this._handleFailed(requestId, err);
      log(err);
      traceErr(err);
      return;
    }

    ctx.invokeHost = worker.host;
    ctx.invokePort = worker.port;

    const providerProps = this._zkClient.getDubboServiceProp(ctx);
    queue.consume(ctx.requestId, worker, providerProps);
  }

接口超时的疑问

hi
我现在egg工程中,service内new Dubbo,用proxyService注册方法,然后调用。
第一次能成功,同一个接口调用第二次就会超时。
如果重启工程又能进行一次调用,第二次超时。有碰到过这种情况的吗?

代码大致如下:
`

import { Context, Service } from 'egg';
import { Dubbo, java, TDubboCallResult, Context as DubboContext } from 'dubbo2.js';

export default class MyService extends Service {

constructor(ctx: Context) {
    super(ctx);
}

/**
 * 新建模板活动
 */
public async createActivity(arg1, arg2) {
    const { ctx } = this;
    const { dubboGroup, dubboBase } = ctx.app.config;

     // 创建dubbo实例
    const dubbo = new Dubbo({
        ...dubboBase.myConfig,
        dubboInvokeTimeout: 30,
        service: { myApiService: this.myApiService },
    });

    dubbo.subscribe({
        onTrace: (msg) => {
            this.logger.info(msg);
        },
    });

    const doSometing = dubbo.service['myApiService'].doSometing;
    const result = await doSometing(arg1, arg2);
    
    if (result.err) {
        this.logger.error(result.err);
        this.ctx.throw('dubbo服务出错,请联系管理员');
    }

    return result.res;
}

private myApiService = (dubbo) => {
    const { ctx } = this;
    const { dubboGroup, dubboBase } = ctx.app.config;
    return dubbo.proxyService({
        dubboInterface: 'my.dubbo.interface',
        version: '0.0.0',
        group: dubboGroup.myConfig,
        methods: {
            doSometing(arg1, arg2) {
                return [
                    java.String(arg1),
                    java.String(arg2)
                ];
            },
        },
    });
}

}

`

add invoke type json-rpc?

不知有没有实践过 json-rpc 的调用方式,关于 rt 以及并发上,能否接受,个人觉得 json-rpc 更适合跨语言调用

翻译师:私有变量应该过滤,不进行翻译

目前翻译会把私有变量也翻译出来如下边的logger, 而这个变量在java端是内容的,没有任务语义,应该过滤

import {Logger} from './../../../../../../org/slf4j/Logger';
import java from 'js-to-java';

export interface IUserUpdatePwdRequest {
  serialVersionUID?: number;
  pwdStrength?: string;
  securityType?: string;
  oldPassword?: string;
  logger?: Logger;
  systemType?: string;
  adminId?: string;
  newPassword?: string;
  operationType?: string;
  userId?: string;
  token?: string;
}

export class UserUpdatePwdRequest {
  constructor(params: IUserUpdatePwdRequest) {
    this.serialVersionUID = params.serialVersionUID;
    this.pwdStrength = params.pwdStrength;
    this.securityType = params.securityType;
    this.oldPassword = params.oldPassword;
    this.logger = params.logger;
    this.systemType = params.systemType;
    this.adminId = params.adminId;
    this.newPassword = params.newPassword;
    this.operationType = params.operationType;
    this.userId = params.userId;
    this.token = params.token;
  }

  serialVersionUID?: number;
  pwdStrength?: string;
  securityType?: string;
  oldPassword?: string;
  logger?: Logger;
  systemType?: string;
  adminId?: string;
  newPassword?: string;
  operationType?: string;
  userId?: string;
  token?: string;

  __fields2java() {
    return {
      $class: 'com.qianmi.usercenter.api.bo.security.UserUpdatePwdRequest',
      $: {
        serialVersionUID: java.Long(this.serialVersionUID),
        pwdStrength: java.String(this.pwdStrength),
        securityType: java.String(this.securityType),
        oldPassword: java.String(this.oldPassword),
        logger: this.logger['__fields2java']
          ? this.logger['__fields2java']()
          : this.logger,
        systemType: java.String(this.systemType),
        adminId: java.String(this.adminId),
        newPassword: java.String(this.newPassword),
        operationType: java.String(this.operationType),
        userId: java.String(this.userId),
        token: java.String(this.token),
      },
    };
  }
}

//generate by interpret-cli dubbo2.js

调用dubbo接口一直报错

hi
我在egg新开工程,尝试调用线上已存在的dubbo服务。一直报错,不知道是什么原因。

Fail to decode request due to: RpcInvocation [methodName=xxx, parameterTypes=null, arguments=null, attachments={path=yyy, input=199, dubbo=2.8.4, version=}]

dubboVersion: 2.8.4

如何支持多application

HI,
现在遇到一个情况,我需要连接2个application。如果我对每个application new Dubbo的话,就破坏了单例模式,导致超时。
请问现在是否支持连接同一register上的不同application?

连接多个zookeeper

你好:
我一个服务注册在两个不同的zookeeper,想通过dubbo2.js 调用这两个不同注册中心上的服务,发现只能调用同一个注册中心上的服务。

以下为实现:
const {Dubbo, java, TDubboCallResult} = require('dubbo2.js');
const {dubboInvoke,invoker} = require('dubbo-invoker');
const app = require('http');

//创建dubbo对象
var dubbo = new Dubbo({
application: {name: 'dubbo-node-consumer'},
//zookeeper address
register: '127.0.0.1:2182',
dubboVersion: '2.0.10',
interfaces: ['com.sitech.hsf.Interface.ServerA'],
});

const demoProvider = dubbo.proxyService({
dubboInterface: 'com.sitech.hsf.Interface.ServerA',
version: '2.0.0',
timeout:10,
group:'',
methods: {
sayHello(name) {
return [java.String(name)];
},
},
});

var dubbo2 = new Dubbo({
application: {name: 'dubbo-node-consumer1'},
//zookeeper address
register: '127.0.0.1:2181',
dubboVersion: '2.0.10',
interfaces: ['com.sitech.hsf.Interface.ServerA'],
});

const demoProvider2 = dubbo2.proxyService({
dubboInterface: 'com.sitech.hsf.Interface.ServerA',
version: '2.0.0',
timeout:10,
group:'',
methods: {
sayHello(name) {
return [java.String(name)];
},
},
});

(async () => {
await dubbo.ready();
await dubbo2.ready();
console.log('dubbo ready over...');
})();
(async () => {
await dubbo.ready();
await dubbo2.ready();
console.log('dubbo ready over...');
})();
app.createServer(async (req, res) => {
const result1 = await demoProvider.sayHello("node");
const result2 = await demoProvider2.sayHello("node");
const result3 = await demoProvider2.sayHello("node");
const result4 = await demoProvider.sayHello("node");
console.log('end->',result1,result2,result3,result4);
res.end(result.res);
}).listen(8080);

如何设置上下文变量?

HI,我想在dubbo调用时传递userid等值,但不想在每个接口都设个变量。请问能否通过上下文的方式传递值?谢谢~

初始化多个dubbo,始终只使用一个客户端

你好:
我现在需要初始化多个dubbo 但是初始化或后始终调用的是一个zk上的服务。
如下为编写的代码。
如果我想通过监听事件动态调用,注册在不同zk上的服务,会出现调用不到我想要的调用的服务。
`const {Dubbo, java, TDubboCallResult} = require('dubbo2.js');
const {dubboInvoke,invoker} = require('dubbo-invoker');
const app = require('http');
var url = require('url');
var events = require('events');
var emitor = new events.EventEmitter();

var opt = [{
application: {name: 'dubbo-node-consumerA'},
register: '127.0.0.1:2182',
dubboVersion: '2.0.10',
interfaces: ['com.sitech.hsf.Interface.ServerA'],
},{
application: {name: 'dubbo-node-consumerB'},
register: '127.0.0.1:2181',
dubboVersion: '2.0.10',
interfaces: ['com.sitech.hsf.Interface.ServerA'],
}];
var proxy = {
dubboInterface: 'com.sitech.hsf.Interface.ServerA',
version: '2.0.0',
timeout:10,
group:'',
methods: {
sayHello(name) {
return [java.String(name)];
},
},
};

var dubbo = new Dubbo(opt[0]);
var dubbo1 = new Dubbo(opt[1]);

var proxyProvider = dubbo.proxyService(proxy);

var proxyProvider1 = dubbo1.proxyService(proxy);

//始终调用到dubbo1注册的zk的服务。

emitor.on('input',function (res,pid){
var result = async (id) => {
var result = await proxyProvider'sayHello';
var result1 = await proxyProvider1'sayHello';
console.log('result',result);
console.log('result',result1);
return result;
};
result(pid).then((data) => {res.end(result1.res);} );
});

app.createServer(function(req, res) {
const path = url.parse(req.url).pathname;
var params = url.parse(req.url,true).query;
if(path == '/dubbo'){
emitor.emit('input',res,params.id);
}
}).listen(9090);`

如何优雅的处理错误?

例:
router.get('/user', async ctx => { const {res, err} = await dubbo.service.demoProvider.getUserInfo(); ctx.body = res || err.message; });
node端调用rpc服务,service端抛出异常err信息带打印信息不是标准的json对象,不知道问题出在哪里?求指教!!

能否自动从jar包内生成provider

类似最下面的代码,如果人工去编写,成本较高,最好能通过JAR包直接生成,这个功能点有没有规划去落地?
/Create the service to be injected
import {Dubbo} from 'dubbo2.js';
const demoProvider = dubbo =>
dubbo.proxyService({
dubboInterface: 'com.alibaba.dubbo.demo.DemoProvider',
version: '1.0.0',
methods: {
sayHello(name) {
return [java.String(name)];
},

echo() {},

test() {},

getUserInfo() {
return [
java.combine('com.alibaba.dubbo.demo.UserRequest', {
id: 1,
name: 'nodejs',
email: '[email protected]',
}),
];
},
},
});

翻译师 deflated.json 文件路径问题

因为我的电脑用户名被设置了中文,导致路径乱码,求处理一下这个路径编码问题!!,而且生成的ts文件里面的引用路径也有问题

use const enum instead of enum

const enum feature:

  1. Inlines any usages of the enum
  2. Does not generate any JavaScript for the enum definition as its usages are inlined.

for example:

const enum

const enum Status {
    PADDING = "PADDING",
    READY = "READY",
    FAILD = "FAILD"
}

function test() {
    const currentStatus = Status.PADDING;
}

output:

function test() {
    var currentStatus = "PADDING" /* PADDING */;
}

enum

 enum Status {
    PADDING = "PADDING",
    READY = "READY",
    FAILD = "FAILD"
}

function test() {
    const currentStatus = Status.PADDING;
}

output

var Status;
(function (Status) {
    Status["PADDING"] = "PADDING";
    Status["READY"] = "READY";
    Status["FAILD"] = "FAILD";
})(Status || (Status = {}));
function test() {
    var currentStatus = Status.PADDING;
}

去除Dubbo构造方法中的interfaces参数

//创建dubbo对象
const dubbo = new Dubbo({
  application: {name: 'node-dubbo'},
  //zookeeper address
  register: 'localhost:2181',
  dubboVersion: '2.0.0',
  interfaces: ['com.alibaba.dubbo.demo.DemoService'],
});

在目前的dubbo创建对象中,需要传递interfaces参数,原因是zookeeper的注册中心里面可能包含了大量的dubbo接口的信息,如果都去订阅,在zookeeper发生变化的时候,就会大量的watch,所有通过传递这个参数来设置我们需要关心和订阅的接口。

能不能在保证相同的体验下,内部获取这些参数。可能的思路,比如proxyService异步将代理服务的接口名搜集起来,告诉zookeeper。

现在能够通过 node 在 Dubbo 上注册服务吗?

第一次使用 Dubbo,以下是我对本项目的理解,如有错误,望不吝赐教。

  1. 本项目是一个通过 node 实现的 Dubbo 客户端
  2. 本客户端的作用是订阅服务,不能发布服务
  3. 使用时,需要编写(或 Java 生成)对应的代理服务文件
  4. 代理服务的作用:业务代码调用时,由代理服务组装数据后,执行转发

其中关于第二点是我最困惑的,是我没找到 Node 发布服务的方式,还是 Dubbo 只能通过 JAVA 进行服务发布。

文档看过没有理解应该如何使用,求教

如题,文档看过没有明白应该如何使用,可能我被自己的思路所限制了,可以请教下如何使用吗?

我是一名 Node.js 开发,现有的解决方案是自己实现了一个 node-dubbo-client 的包,通过 Java 提供的服务名(com.alibaba.dubbo.demo.DemoProvider)从 zk 获取 Dubbo 服务的地址与端口,然后通过 Java 提供的函数名(getUserInfo)调用到真实的服务,数据传递使用的是 JSON,然后 Java 那边将 JSON 再反序列化成 Java 的数据类型,然后再通过将结果转成 JSON 返回给我。

基于上述的流程,感觉被自己的思路限制了,看着 dubbo2.js 的文档和示例,依旧没有看懂我应该怎么做,服务名和方法名应该写在哪里,参数应该如何传递。

interpret -c dubbo.json命令为什么接口名称要以provider结尾的才能生成ts文件啊。

1.例如:
package com.example.service;

import com.example.dto.User;

public interface UserServiceProvider {

public String getUserName();

public User  getUser(User user);

}
2.例如:
package com.example.service;

import com.example.dto.User;

public interface UserService {

public String getUserName();

public User  getUser(User user);

}

1是可以生成ts文件,2就是不可以生成。这是哪里可以通过参数设置吗 ?

Java类转为node后子类丢失问题

provider

public interface PaymentProvider{
PayResultBO guaranteePayment(PaymentBO paymentBO, PaymentMethod paymentMethod, String realPayeeUserId, EnumTradeChannel enumTradeChannel)
            throws BaseException;
}

父类

public abstract class PaymentMethod extends BaseBean implements Cloneable {
}

子类

public class PaymentMethodOLP extends PaymentMethod {
}

以上代码,
期望的是Java类转换成node后,依赖包中包含PaymentProvider、PaymentMethod、PaymentMethodOLP等文件。
结果转换成node后只包含了PaymentProvider和PaymentMethod。
PaymentMethodOLP文件丢失了

失败重试,容错机制

您好!
我研究了一下源码,没有发现有失败重试的功能,是不没有实现或者我没有找到对应的代码,是否可以扩展容错的一些机制

may we have to implement a timeout when reconnecting

Is your feature request related to a problem? Please describe.

在这里进行 重连 的时候,我们是否应该像这里描述的一样 nodejs/node#5757 (comment) 增加一个超时的机制,否则,代码可能需要增加类似下面的逻辑

if (this._retry > 0) {
  if (IS_RECONNECTING) return;
  // reconnecting...
 } else {
   ...
 }

Describe the solution you'd like
A clear and concise description of what you want to happen.

Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.

Additional context
Add any other context or screenshots about the feature request here.

负载调用方式

伟大的创造者您好!
请问dubbo2的调用负载均衡方式是何种方式,是否支持负载均衡的动态配置。谢谢!

从java的jar包translator错误

我的dubbo.json配置文件为:

{
  "output": "./src",
  "entryJarPath": "./java/dubbo-demo/qifutong-api/target/qifu-labourer-client-1.1.6-SNAPSHOT.jar",
  "libDirPath": "./java/dubbo-demo/qifutong-api/target/lib/"
}

其中的jar包和依赖包都是有的。
然后npm install interpret-dubbo2js
运行interpret -c dubbo.json
运行结果为:

Output at: C:\Users\ADMINI~1\AppData\Local\Temp\jexpose2045571442071863293

elapsed: 81.317s

read jar ast file C:\Users\ADMINI~1\AppData\Local\Temp\jexpose2045571442071863293\output\deflated.json
Translation completed

第一个是包没有输出到我指定的路径,其二是输出的文件中output文件夹下只有一个deflated文件,里边内容为:

{
  "classes":{},
  "providers":[]
}

请问下这是什么原因呢?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.