【发布时间】:2021-03-14 11:16:49
【问题描述】:
我目前正在 Spring Boot 2.4.0 中编写一个应用程序,该应用程序需要侦听多个端口(具体来说是 3 个,但将来可能是 4 个)。这个想法是每个端口都为其他服务/应用程序提供不同的 API 来连接它。
所以,对于一个最小的工作示例,我会说我们有一个这样的 SpringBootApp:
@SpringBootApplication
public class MultiportSpringBoot {
public static void main(String[] args)
{
SpringApplication.run(MultiportSpringBoot.class, args);
}
}
现在,我希望在 3 个不同的端口上进行监听,例如 8080、8081 和 8082。对于对其中一个端口的所有(!)请求,应该由特定的控制器“负责”。此要求的原因之一是一个控制器需要处理(常规)Web 前端,另一个控制器需要处理 API。如果收到无效请求,API 控制器需要提供与前端不同的错误消息。因此,给出的要求是明确的分离。
所以我想象不同端口有多个控制器,例如:
@Controller
public class Controller8080
{
@RequestMapping(value = "/", method = RequestMethod.GET)
public ModelAndView test8080()
{
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("test8080");
return modelAndView;
}
}
其他端口使用类似的控制器:
@Controller
public class Controller8081
{
@RequestMapping(value = "/", method = RequestMethod.GET)
public ResponseEntity test8081()
{
JSONObject stuff = doSomeStuffForPort8081();
return new ResponseEntity<String>(stuff, HttpStatus.OK);
}
}
我希望类似于@RequestMapping 的注解能够匹配和修复控制器的端口号,但这似乎是不可能的,因为似乎不存在这样的注解。
现在,这个主题似乎有点具体,这可能是您在网络上找不到太多信息的原因。我找到了Starting Spring boot REST controller in two ports,但我也只能运行一个实例。我查看了https://tech.asimio.net/2016/12/15/Configuring-Tomcat-to-Listen-on-Multiple-ports-using-Spring-Boot.html,但这对于 Spring Boot 2.4.0 来说已经过时了,而且 JavaMelody 示例有点臃肿。
任何人都可以为此提供解决方案的最低工作示例吗?
--
编辑:
澄清一点:我需要多个单独的 RESTController,每个 RESTController 处理不同端口上的请求。 IE。对domain.com:8080/ 的请求应由与对domain.com:8081/ 的请求不同的控制器处理。
例如,考虑以下两个控制器,它们应该分别处理端口 8080 和 8081 上的请求:
//controller for port 8080
@RestController
public class ControllerA
{
@GetMapping("/")
String helloA(HttpServletRequest request)
{
return "ControllerA at port " + request.getLocalPort();
}
}
和
//controller for port 8081
@RestController
public class ControllerB
{
@GetMapping("/")
String helloB(HttpServletRequest request)
{
return "ControllerB at port " + request.getLocalPort();
}
}
【问题讨论】:
-
如前所述,追求这样的设计有多种原因。清晰分离 API 的便利性只是其中之一。无论如何,我无权推翻整个架构。
-
你如何使用像 nginx 这样的反向代理,将不同端口的调用转发到你的应用程序?一个 nginx 实例用于侦听端口并转发到您的 api 和一个应用程序实例。
-
感谢您的想法,但我仅限于带有嵌入式 Tomcat 的 SpringBoot 2.4.0,没有其他外部服务
标签: java spring-boot controller