Я внедряю систему микросервисов, в которой шлюз 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
Проблема связи NATS между NESTJS (Gateway) и Spring Boot (MicroService) с использованием схемы запроса-репта ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Веб -сервер не удалось запустить. Порт 8080 уже использовался. Spring Boot Microservice
Anonymous » » в форуме JAVA - 0 Ответы
- 5 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Веб -сервер не удалось запустить. Порт 8080 уже использовался. Spring Boot Microservice
Anonymous » » в форуме JAVA - 0 Ответы
- 7 Просмотры
-
Последнее сообщение Anonymous
-