暴露一个 RPC 服务,并发布到注册中心

  1. 'use strict';
  2. const { RpcServer } = require('sofa-rpc-node').server;
  3. const { ZookeeperRegistry } = require('sofa-rpc-node').registry;
  4. const logger = console;
  5. // 1. 创建 zk 注册中心客户端
  6. const registry = new ZookeeperRegistry({
  7. logger,
  8. address: '127.0.0.1:2181', // 需要本地启动一个 zkServer
  9. });
  10. // 2. 创建 RPC Server 实例
  11. const server = new RpcServer({
  12. logger,
  13. registry, // 传入注册中心客户端
  14. port: 12200,
  15. });
  16. // 3. 添加服务
  17. server.addService({
  18. interfaceName: 'com.nodejs.test.TestService',
  19. }, {
  20. async plus(a, b) {
  21. return a + b;
  22. });
  23. // 4. 启动 Server 并发布服务
  24. server.start()
  25. .then(() => {
  26. });

调用 RPC 服务(直连模式)

  1. 'use strict';
  2. const { RpcClient } = require('sofa-rpc-node').client;
  3. const logger = console;
  4. async function invoke() {
  5. // 不需要传入 registry 实例了
  6. const client = new RpcClient({
  7. logger,
  8. });
  9. const consumer = client.createConsumer({
  10. interfaceName: 'com.nodejs.test.TestService',
  11. serverHost: '127.0.0.1:12200', // 直接指定服务地址
  12. });
  13. await consumer.ready();
  14. const result = await consumer.invoke('plus', [ 1, 2 ], { responseTimeout: 3000 });
  15. console.log('1 + 2 = ' + result);
  16. }
  17. invoke().catch(console.error);

服务端代码

  1. 'use strict';
  2. const antpb = require('antpb');
  3. const protocol = require('sofa-bolt-node');
  4. const { RpcServer } = require('sofa-rpc-node').server;
  5. const { ZookeeperRegistry } = require('sofa-rpc-node').registry;
  6. // 传入 *.proto 文件存放的目录,加载接口定义
  7. // 将 proto 设置到协议中
  8. protocol.setOptions({ proto });
  9. const registry = new ZookeeperRegistry({
  10. logger,
  11. address: '127.0.0.1:2181',
  12. });
  13. const server = new RpcServer({
  14. logger,
  15. protocol, // 覆盖协议
  16. registry,
  17. codecType: 'protobuf', // 设置默认的序列化方式为 protobuf
  18. port: 12200,
  19. });
  20. server.addService({
  21. interfaceName: 'com.alipay.sofa.rpc.test.ProtoService',
  22. }, {
  23. async echoObj(req) {
  24. req = req.toObject({ enums: String });
  25. return {
  26. code: 200,
  27. message: 'hello ' + req.name + ', you are in ' + req.group,
  28. };
  29. },
  30. });
  31. server.start()
  32. .then(() => {
  33. server.publish();
  34. });