Node.js вызывает Java через Dubbo2.js

JavaScript

1. Что такое Даббо?

Dubbo — это инфраструктура RPC с открытым исходным кодом от Alibaba.

Кратко поговорим об истории создания RPC-фреймворка.

From dubbo.apache.org

Dubbo — это инфраструктура RPC, используемая в распределенных службах.

2. Интермодуляция Java с использованием Dubbo

Во-первых, мы можем попробовать вызвать Dubbo на том же ниже языке, начиная с простого.

Вы можете обратиться к официальной документации dubboХироши Ватанабэ.apache.org/this-capable/docs/…

Вот простая попытка, есть два основных шага:

  1. Сначала установите поставщика услуг, то есть роль поставщика на приведенном выше рисунке;

  2. Затем создайте потребителя службы, который также похож на роль потребителя на рисунке выше;

Поставщик услуг устанавливает поставщика

1.0 Использование весенней весенней загрузки построить микросервис(можно обратиться)С Чен Чжэнь.GitHub.IO/2018/08/24/…

**1.1. Создание интерфейса**

// TestProviderService.java

package com.dubbo.learn.dubbo;

public interface TestProviderService {
    String Hello (String who);
}

1.2 Реализовать этот TestProviderServiceImpl

// TestProviderServiceImpl
package com.dubbo.learn.dubbo.impl;

import com.dubbo.learn.dubbo.TestProviderService;
import com.alibaba.dubbo.config.annotation.Service;

@Service(version="1.0.0")
public class TestProviderServiceImpl implements TestProviderService  {
    public String Hello(String who) {
        return "Hello world ! Dear Programer " + who ;
    }
}

1.3 Добавьте основную запись программы запуска@EnableDubboаннотация

// ProviderApplication.java
package com.dubbo.learn;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;

@SpringBootApplication
@EnableDubbo
public class ProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }

}	

Чтобы представить это@EnableDubboАннотация, мы должны представитьcom.alibabaупаковка

<!--pom.xml-->
<dependency>
  <groupId>com.alibaba.boot</groupId>
  <artifactId>dubbo-spring-boot-starter</artifactId> 
  <version>0.2.1.RELEASE</version>
</dependency>
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>dubbo</artifactId>
  <version>2.6.5</version>
</dependency>
<dependency>
  <groupId>org.apache.curator</groupId>
  <artifactId>curator-framework</artifactId>
  <version>2.11.1</version>
</dependency>

curator-frameworkэто центр сообщений, используемый dubboZookeeperнеобходимые пакеты
dubbo-spring-boot-starterЭто пакет конфигурации dubbo spring

1.4 Наконец, мы записываем стартовую конфигурацию dubbo вapplication.propertiesв

# application.properties
server.port = 8829
#
dubbo.application.name=provider
dubbo.registry.protocol=zookeeper
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.scan.base-packages=com.dubboo.learn
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
dubbo.consumer.check=false

Вся структура проекта представлена ​​на рисунке:

Затем просто запустите.

После запуска через веб-клиент dubbo Admin видно, что интерфейс Provider успешно зарегистрирован в реестре.

Потребитель услуг Потребитель

1.0 Используйте Spring Boot для создания потребительского микросервиса Spring

1.1 Определите интерфейс, где путь к интерфейсу и имя пакета должны совпадать (в противном случае вам придется настроить его самостоятельно)

// TestProviderService.java
package com.dubbo.learn.dubbo;
public interface TestProviderService {
    String Hello (String who);
}

1.2 Определите службу для вызова интерфейса dubbo

// TestConsumerService.java
package com.dubbo.learn;

import com.alibaba.dubbo.config.annotation.Reference;
import com.dubbo.learn.dubbo.TestProviderService;
import org.springframework.stereotype.Component;

@Component
public class TestConsumerService {
    @Reference(version = "1.0.0")
    TestProviderService testProviderService;

    public void consumer (String who) {
        String res = testProviderService.Hello(who);
        System.out.println("consumer : provider says " + res);
    }
}

Вызов функции Сервиса в основной функции программы

// DubboConsumerApplication.java
package com.dubbo.learn;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import com.dubbo.learn.TestConsumerService;

@SpringBootApplication
public class DubboConsumerApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(DubboConsumerApplication.class, args);
        TestConsumerService testConsumer = run.getBean(TestConsumerService.class);
        testConsumer.consumer("White");
    }

}

@ReferenceЭта аннотация используется для вызова интерфейса, соответствующего dubbo. Так что также необходимо ввести эти пакеты с сервером

<!--pom.xml-->
<dependency>
  <groupId>com.alibaba.boot</groupId>
  <artifactId>dubbo-spring-boot-starter</artifactId> 
  <version>0.2.1.RELEASE</version>
</dependency>
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>dubbo</artifactId>
  <version>2.6.5</version>
</dependency>
<dependency>
  <groupId>org.apache.curator</groupId>
  <artifactId>curator-framework</artifactId>
  <version>2.11.1</version>
</dependency>  

1.3 Наконец, мы записываем стартовую конфигурацию dubbo в application.properties

#application.properties
server.port=8830
dubbo.application.name=consumer
#注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181

dubbo.scan.base-packages=com.dubboo.learn.dubbo
dubbo.protocol.port=20880

Структура каталогов проекта выглядит следующим образом:

Эффект после запуска следующий:

3. Как Node.js вызывает Java через Dubbo

Сторона Node вызывает интерфейс Java-провайдера через dubbo, мы пробовали вызывать несколько пакетов: диван-rpc-node, node-zookeeper-dubbo и dubbo2.js.
Среди них диван-rpc-node более удобен для использования среды egg.js, а node-zookeeper-dubbo похож на диван-rpc-node, однако немного хлопотно, что оба пакета должны писать определения интерфейса proto3.
Да и dubbo2.js удобнее, ниже пример использования dubbo2.js

const { Dubbo, java, setting } = require('dubbo2.js')
const interfaceName = 'com.dubbo.learn.dubbo.TestProviderService'
const interfaceVersion = '1.0.0'
const dubboSetting = setting.match(
  interfaceName, { version: interfaceVersion }
)
const dubboService = dubbo => dubbo.proxyService({
  dubboInterface: interfaceName,
  version: '1.0.0',
  methods: {
    Hello (who) {
      return [
        java.String(who)
      ]
    }
  }
})
const service = {dubboService}
// 实例化Dubbo, 入参主要是名称和 dubbo 接口的设置
const dubbo = new Dubbo({
  application: {name: 'dubbo-node-test'},
  register: '127.0.0.1:2181',
  dubboSetting,
  service
})

module.exports = dubbo

Код очень прост: зарегистрируйте интерфейс (включая имя интерфейса, информацию о версии интерфейса, метод интерфейса), предоставленный dubbo, в службе Java.
После получения экземпляра Dubbo вызовите соответствующий сервис для его использования.
следующее:

await dubbo.service.dubboService.Hello(who)

Мы просто написали интерфейс:

const KoaRouter = require('koa-router')
const dubbo = require('./dubbo')
const router = new KoaRouter({prefix: '/api/v1'})

router.use('/')

router.get('/testNodeDubbo', async (ctx, next) => {
  console.info(`[testNodeDubbo]:==:> start`)
  let {who} = ctx.request.query
  const res = await dubbo.service.dubboService.Hello(who)
  ctx.body = res
})

module.exports = router

Результат вызова:


Это завершает узел как потребитель для вызова интерфейса Java через dubbo.

4. Сравнение Node.js, вызывающего Java через интерфейс и вызывающего Java через Dubbo


Здесь мы пытаемся использовать интерфейсы dubbo и http, которые вызывают одну и ту же логику, и сравниваем время возврата двух реализаций.
Красный — интерфейс dubbo, синий — интерфейс http.

разное:

адрес проекта:
GitHub.com/с Чен Чжэнем/…
GitHub.com/с Чен Чжэнем/…
GitHub.com/с Чен Чжэнем/…