gpt4 book ai didi

Java Spring 一个类的多个节点

转载 作者:行者123 更新时间:2023-11-30 06:10:32 24 4
gpt4 key购买 nike

我是 Spring 新手,我的问题很简单,但我认为我找不到任何好的资源。我查看了初学者示例(例如 thisthis 等)并在 StackOverflow 中搜索答案,但我不太确定应该搜索什么。

让我解释一下这个场景。假设我有一个中心节点 (C) 和多个内部节点 (I_1, ..., I_n),这种情况:

I_1  
.
. ------------------> C
.
I_n

在这个非常简单的图中,我试图说明当 C 请求时,每个 I_i 都会向 C 发送一些内容。就是这样。现在我希望每个 I_i 有一个特殊的 id,并且他们将该 id 发送到 C。我应该如何在 Spring 中对此进行建模?到目前为止我已经有了基本的设置

@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

我有一个 Controller

@RestController
public class Controller {

@RequestMapping(value = "/i1/{id}", method = RequestMethod.GET)
@ResponseBody
public String i1(
@PathVariable("id") String id) {
return id;
}
}

因此,如果我运行此代码并 curl 到 http://localhost:port/i1/560它将返回 560。当然,我可以创建多个节点,例如通过创建一个 jar 文件并在不同的端口上运行它。问题是我无法真正给他们唯一的 ID。我的意思是,它们都是一个应用程序实例。我希望它们属于下面的节点类(或类似的东西):

class node{
private int id;

public node(int id){
this.id = id;
}
}

这样我就有n个内部节点。然后我可以打开一个终端并 curl 它们中的每一个来获取它们的 ID。我希望我已经解释得相当清楚了。简而言之:我的目标是拥有节点类的 n 个实例,并且具有唯一的 id。我想单独 curl 它们并获取它们的id,例如“curl http://localhost:8081/i1”将返回i1的id,而“curl http://localhost:8082/i2”将返回i2的id等等。我什至不确定搜索时应该使用哪些关键字。我已经尝试过“ Spring 多个客户端/主机/应用程序”,但没有真正找到正确的东西,所以我什至希望包含这样的答案。

bean 类

我已阅读this example ,它并没有真正使用 Controller ,而是使用bean。我已经尝试过这种方法,这就是我想要做的,它可以创建多个节点对象,所有对象都具有唯一的 id。但是,我不确定是否可以将它们分别连接到不同的节点和端口。

最佳答案

所以,我认为你的基本要求很容易实现。但关于节点 I_x 的索引仍然存在问题。为什么它们很重要?如果您有节点的端口和 ID,则足以识别该节点。所以我创建了一个具有以下两个属性的答案:

  • 端口
  • 身份证

遵循上述限制,您无法创建监听特定映射 I_xController。但据我所知,这并不是真正需要的。

创建一个包含值的类NodeInformation:

@Getter
@Setter
public class NodeInformation {
private int port;
private int id;


public NodeInformation(int port, int id) {
this.port = port;
this.id = id;
}
}

@Getter@Setter 是自动创建 setter 和 getter 的 org.projectlombok 注解。

然后通过解析您的配置来填写所需的信息。
此配置可以通过以下方式设置:

  • 应用程序属性
  • 传递参​​数 (-Dnode.port=xy -Dnode.id=myid)

注意:或者,您可以使用 spring stock 属性 server.port 自动设置端口。

因此,在 NodeInformation 中填充信息,您必须使用 @Configuration NodeInformationConfiguration,它会构建并返回您的 Bean :

@Configuration
public class NodeInformationConfiguration {

private final int port;
private final int id;

public NodeInformationConfiguration(@Value("${node.port}") int port, @Value("${node.id}") int id) {
this.port = port;
this.id = id;
}

@Bean
public NodeInformation getNodeInfo() {
return new NodeInformation(port, id);
}
}

所以最后你必须设置你的端口并创建一个返回你的 ID 的 Controller 。

设置端口

您可以使用EmbeddedServletContainerCustomizer来设置端口。使用我们之前创建的 NodeInformation,将其自动连接到您的类 PortSetter

@Component
public class PortSetter {


private final int port;

@Autowired
public PortConfiguration(NodeInformation nodeInformation) {
this.port = nodeInformation.getPort();
}

@Bean
public EmbeddedServletContainerCustomizer containerCustomizer() {
return (container -> {
container.setPort(port);
});
}
}

最后创建一个简单的 RestController,通过监听 /id 返回您设置的 Id:

@RestController
public class NodeController {

private final NodeInformation nodeInformation;

@Autowired
public NodeController(NodeInformation nodeInformation) {
this.nodeInformation = nodeInformation;
}

@RequestMapping("/id")
public int getNodeId() {
return this.nodeInformation.getId();
}
}

关于Java Spring 一个类的多个节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50331659/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com