我希望我的spring-boot应用程序在第二个端口上侦听(其中“第一个”是用于spring- webmvc端点的server.port),并将所有进入第二个端口上“ /”的流量定向到Servlet的实现。我已经写了。这些请求将是我想要与正常服务流量分开的json-rpc请求。我该如何实现?
我发现代码通过添加另一个Connector来使嵌入式Tomcat在另一个端口上侦听,如下所示:
@Bean public EmbeddedServletContainerFactory servletContainer() { TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory(); tomcat.addAdditionalTomcatConnectors(createRpcServerConnector()); return tomcat; } private Connector createRpcServerConnector() { Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler(); connector.setPort(Integer.parseInt(env.getProperty("rpc.port"))); return connector; }
而且我发现您可以通过将另一个Servlet公开为Bean来注册另一个Servlet,就像这样
@Bean public Servlet rpcServlet() { return new RpcServlet(); }
但是,当公开这样的Servlet时,它只是将其映射到常规server.port上的URL模式。我无法弄清楚如何将其连接到RPC连接器,以使webmvc端口上的“ /”不尝试处理RPC请求,并且RPC端口不将请求转发给我的@RestController方法。
@RestController
也许这是由于我对Tomcat的误解。我是否应该为此使用Tomcat?我应该切换到spring-boot提供的另一个嵌入式servlet容器吗?
要隔离Connector供单个应用程序使用的,该连接器需要与其自己的连接器关联,Service然后您需要Context将该应用程序的连接器与关联Service。
Connector
Service
Context
您可以在Spring Boot应用程序中通过提供您自己的TomcatEmbeddedServletContainerFactory子类a @Bean并进行覆盖来进行设置getEmbeddedServletContainer(Tomcat tomcat)。这使您有机会进行所需的配置更改:
TomcatEmbeddedServletContainerFactory
@Bean
getEmbeddedServletContainer(Tomcat tomcat)
@Bean public TomcatEmbeddedServletContainerFactory tomcatFactory() { return new TomcatEmbeddedServletContainerFactory() { @Override protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer( Tomcat tomcat) { Server server = tomcat.getServer(); Service service = new StandardService(); service.setName("other-port-service"); Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); connector.setPort(8081); service.addConnector(connector); server.addService(service); Engine engine = new StandardEngine(); service.setContainer(engine); Host host = new StandardHost(); host.setName("other-port-host"); engine.addChild(host); engine.setDefaultHost(host.getName()); Context context = new StandardContext(); context.addLifecycleListener(new FixContextListener()); context.setName("other-port-context"); context.setPath(""); host.addChild(context); Wrapper wrapper = context.createWrapper(); wrapper.setServlet(new MyServlet()); wrapper.setName("other-port-servlet"); context.addChild(wrapper); context.addServletMapping("/", wrapper.getName()); return super.getTomcatEmbeddedServletContainer(tomcat); } }; } private static class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().println("Hello, world"); } }
将此bean添加到您的应用程序后,应该由http:// localhost:8081处理MyServlet并返回包含“ Hello,world”的响应。
MyServlet