Nestjs 微服务实战 - 动态微服务创建链接

发布时间:2024年01月05日

所有的微服务都需要做服务治理

服务治理包括(配置中心、服务发现、注册服务等等),常见的包括 Java 的 Nacos,这里不关注与服务治理,只说明,如何用 nest 网关,并且在网关层动态实现微服务注入

nestjs 官网的案例明显是偏向于手动注册微服务的,例如:

/** Model */
@Module({
   
  imports: [
 	/** Model 中使用并注册 */ 
    ClientsModule.register([
      {
    name: 'MATH_SERVICE', transport: Transport.TCP },
    ]),
  ]
  ...
});

/** service / controller 使用 */
constructor(
  /** 通过 @Inject 装饰器只能挨个进行倒入,有多少服务倒入多少 */
  @Inject('MATH_SERVICE') private client: ClientProxy,
) {
   }

以上属于官网列出的例子,对于真正的微服务开发肯定是不够用的,因为服务并没有根据配置中心的配置进行动态变更倒入,这种情况下,假如某个服务很占用 CPU、内存导致荡机了,也无法进行动态扩展,只能去重启服务手动更改配置,而我需要的是完全动态,每个服务部署都独立部署出来,对于高CPU的服务进行动态扩展服务器,进行自动切换 ip 端口线路。

首先所有的服务都不要在 Model 中进行注册,建议全丢在 service / controller 中使用,我这里以 controller 为例:

import {
    All, Controller, Req, Res } from '@nestjs/common';
import {
    ClientProxyFactory, Transport } from '@nestjs/microservices';
import {
    createProxyServer } from 'http-proxy';

/** 动态数组,这里后面要通过定时任务去配置中心拉取 */
const serviceList = [
  {
   
    name: 'user-center',
    host: '127.0.0.1',
    port: 65531,
  },
];

@Controller()
export class AppController {
   
  /** 首先所有路由不管任何请求方式全部代理到这个方法上 */
  @All('*')
  async root(@Req() req, @Res() res): Promise<any> {
   
    /** 获取所有可获取的参数 */
    const {
    method, originalUrl, query, body, headers } = req;

    /** 根据 url 字符串切割一下获取,主要获取第一级和第二级路由 */
    const list = originalUrl.split('?'
文章来源:https://blog.csdn.net/weixin_43704471/article/details/135403752
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。