Node.js的Web服务在Nacos中的实践

打印 上一主题 下一主题

主题 865|帖子 865|积分 2595


前言

Node.js作为Web端一个重要的运行时环境,通常被当做BFF(Backend For FrontEnd)来使用,而鲜有与后端微服务举行共同融合开发的场景。然而,不同团队中配置人员占比及使命分配的不同,有时也会必要多种后端语言(如:Go、Python、Java、Node.js等)共同来提供提供BFD(Backend For Database)的本领。因此,本文主要介绍笔者基于Node.js实现的Web服务在Java微服务架构中的实践。
架构


传统Java微服务通常接纳服务器端的发现模式,客户端通过负载平衡器向服务发起请求,负载平衡器查询服务注册表,并将请求路由转发到对应的服务实例。

对于注册方式,通常包括自我注册方式和第三方注册模式。其中,自我注册模式使用较为简单,但服务实例与服务注册表却细密耦合;第三方注册模式可以实现服务和注册的分离,但却必要额外的三方协调组件。
目录

  1. ├─ server                                 // 基于Node.js的Web服务器
  2. |   ├─ keys                               // HTTPS相关证书
  3. |   ├─ routes                             // 服务模块
  4. |   ├─ utils
  5. |   ├─ app.js                             // Web服务实例
  6. |   ├─ config.js
  7. ├─ main.js                                // Web服务导出及Nacos服务注册
复制代码
实践


现在,Java的微服务服务注册中心通常以Nacos和Eureka为主,二者有联系但也有区别,感兴趣的小伙伴可以参考《详解Nacos和Eureka的区别》这篇文章来学习。
这里,我们以Nacos为例来举行介绍。对于Node.js来说,我们使用nacos的包来举行服务注册,代码如下:
  1. const yaml = require("js-yaml");
  2. const fs = require("fs");
  3. // 注册服务到Nacos服务器
  4. const { NacosNamingClient } = require("nacos");
  5. const { address } = require("ip");
  6. const logger = console;
  7. // 动态获取本机 IP 地址
  8. const ipAddr = address();
  9. // 我们当前的端口号
  10. const port = server.port;
  11. // 服务名称,后面消费方调用的时候通过这个服务名进行服务查询。
  12. const providerServiceName = "inspection-nodejs";
  13. // 读取 YAML 文件内容
  14. const yamlContent = fs.readFileSync(
  15.   `./deploy/${process.env.SERVER_MODE}/config.yaml`,
  16.   "utf8"
  17. );
  18. // 解析 YAML
  19. const config = yaml.load(yamlContent);
  20. const client = new NacosNamingClient({
  21.   logger,
  22.   serverList: config.data["spring.cloud.nacos.discovery.server-addr"],
  23.   namespace: config.data["spring.cloud.nacos.discovery.namespace"],
  24.   username: config.data["spring.cloud.nacos.discovery.username"],
  25.   password: config.data["spring.cloud.nacos.discovery.password"],
  26. });
  27. console.log("[Nacos] 注册Nacos服务");
  28. async () => {
  29.   const allinstance = await client.getAllInstances();
  30.   console.log("[Nacos]----allinstance----", allinstance);
  31. };
  32. (async () => {
  33.   try {
  34.     await client.ready();
  35.     // 注册服务和实例
  36.     await client.registerInstance(providerServiceName, {
  37.       ip: ipAddr,
  38.       port,
  39.     });
  40.     // 这里也可以传入group,不传默认就是 DEFAULT_GROUP
  41.     // const groupName = 'nodejs';
  42.     // await client.registerInstance(providerServiceName, {
  43.     // ip: ipAddr,
  44.     // port
  45.     // }, groupName);
  46.     console.log(`[Nacos] Nacos服务注册实例成功: ${ipAddr}:${port}`);
  47.   } catch (err) {
  48.     console.log("[Nacos] Nacos服务注册实例失败: " + err.toString());
  49.   }
  50. })();
复制代码

我们通过Nacos的服务注册中心界面可以看到,当前服务已经注册乐成。


我们尝试不加token和添加token的方式举行访问,可以看到微服务的拦截及转发功能均已乐成。
总结

传统微服务场景下利用多语言优势,可以提供不同本领的服务特性。在主体结构相对一致的环境下,前端工程师的开发范围大概会进一步扩展,除了常见的BFF场景,也可以提供BFD,以及更加广泛的Serverless本领!
参考



  • 微服务的魂魄摆渡者——Nacos,来一篇原理全攻略
  • 要学习微服务的服务发现?先来相识一些科普知识吧
  • Nacos SDK for Node.js 使用指南
  • Serverless单体架构的崛起
  • 详解Nacos和Eureka的区别

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

自由的羽毛

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表