Проблема связи NATS между NESTJS (Gateway) и Spring Boot (MicroService) с использованием схемы запроса-рептаJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Проблема связи NATS между NESTJS (Gateway) и Spring Boot (MicroService) с использованием схемы запроса-репта

Сообщение Anonymous »

Я внедряю систему микросервисов, в которой шлюз Nestjs связывается с микросервисом Spring Boot с использованием NAT в качестве брокера сообщения. Ответ.import { Body, Controller, Inject, Post } from "@nestjs/common";
import { ClientProxy, RpcException } from "@nestjs/microservices";

import { SERVICES } from "src/config";
import { LoginUserRequestDto } from "./dtos/LoginUser.dto";
import { catchError, lastValueFrom, timeout } from "rxjs";

export class LoginUserRequestDto {
username: string;
password: string;
}

export enum SERVICES {
NATS_SERVICE = "NATS_SERVICE",
}

@Controller("auth")
export class AuthController {
constructor(
@Inject(SERVICES.NATS_SERVICE) private readonly client: ClientProxy,
) {}

@Post("/login")
async login(@Body() loginUserRequestDto: LoginUserRequestDto) {
console.log(loginUserRequestDto);

const msResponse = await lastValueFrom(
this.client.send("login.crud.ms", loginUserRequestDto).pipe(
timeout(10000),
catchError((error) => {
throw new RpcException(error);
}),
),
);

console.log(msResponse);
return msResponse;

// return this.client.send("login.crud.ms", loginUserRequestDto).pipe(
// timeout(5000),
// catchError((error) => {
// throw new RpcException(error);
// }),
// );
}
}
< /code>
client configuration in nestjs < /h1>
import { Module } from "@nestjs/common";
import { ClientsModule, Transport } from "@nestjs/microservices";

import { enviromentVariables, SERVICES } from "src/config";

@Module({
imports: [
ClientsModule.register([
{
name: SERVICES.NATS_SERVICE,
transport: Transport.NATS,
options: {
servers: enviromentVariables.natsSever,
},
},
]),
],
exports: [
ClientsModule.register([
{
name: SERVICES.NATS_SERVICE,
transport: Transport.NATS,
options: {
servers: enviromentVariables.natsSever,
},
},
]),
],
})
export class TransportsModule {}
< /code>
Spring Boot Microservice < /h1>
@RestController
@Validated
@RequestMapping("/users")
public class UserController {

private UserService userService;
private final Connection natsConnection;
private final ObjectMapper objectMapper;

UserController(UserService userService, Connection natsConnection, ObjectMapper objectMapper) {
this.userService = userService;
this.natsConnection = natsConnection;
this.objectMapper = objectMapper;
}

@PostConstruct
public void subscriberTopic() {
loginUserMS();
}

public void loginUserMS() {
natsConnection.createDispatcher(msg -> {
try {
String rawJSON = new String(msg.getData(), StandardCharsets.UTF_8);
System.out.println(rawJSON); // IN CONSOLE: {"pattern":"login.crud.ms","data":{"username":"pedro123","password":"1234"},"id":"23f2bd6f679cc394c433d"}

JsonNode rootNode = objectMapper.readTree(rawJSON);

JsonNode dataNode = rootNode.get("data");
String correlationId = rootNode.get("id").asText();

LoginUserRequestDto loginUserRequestDto = objectMapper.treeToValue(dataNode,
LoginUserRequestDto.class);

// LLAMO A MI SERVICIO NORMAL
UserDto loggedUser = userService.login(loginUserRequestDto);

System.out.println(loggedUser.toString());

Map replyWrapper = new HashMap();
replyWrapper.put("id", correlationId);
replyWrapper.put("err", null);
replyWrapper.put("response", loggedUser);

// SERIALIZO LA RESPUESTA
String response = objectMapper.writeValueAsString(loggedUser);
// String response = objectMapper.writeValueAsString(replyWrapper);

System.out.println(response); // In console: {"id":"98e54e58-af64-417d-97ba-637e6be6e4b3","name":"Enrique","username":"pedro123","email":"[email protected]"}

// natsConnection.publish(msg.getReplyTo(),
// response.getBytes(StandardCharsets.UTF_8));
natsConnection.publish(msg.getReplyTo(), response.getBytes(StandardCharsets.UTF_8));
} catch (Exception e) {
e.printStackTrace();
if (msg.getReplyTo() != null) {
String errorResponse = "{\"error\": \"" + e.getMessage() + "\"}";
natsConnection.publish(msg.getReplyTo(), errorResponse.getBytes(StandardCharsets.UTF_8));
}
throw new Error(e.getMessage());
}
}

).subscribe("login.crud.ms");
}
< /code>
Журналы показывают, что Spring Boot получает сообщение, обрабатывает его и публикует ответ на правильный ответ, но Nestjs никогда не получает этот ответ, и тайм -аут запускается.>

Подробнее здесь: https://stackoverflow.com/questions/795 ... croservice
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»