如何在 Spring MVC 中配置 Netty。我应该何时何地启动 Netty tcp 服务器?春天开始后我应该初始化netty吗?有人可以给我看一个例子,比如 Spring 配置 xml 文件或其他东西吗?谢谢!
4 回答
这真的取决于你使用 Netty 的目的。假设您将它用作在单独端口上运行的嵌入式 HTTP 服务器,您可以简单地在 Spring bean 中初始化它。过去我使用一个有用的 Netty/Atmosphere 包装器Nettosphere实现了这一点:
@Service
public class NettyServer implements ServletContextAware {
private ServletContext servletContext;
private Nettosphere server;
@Autowired
private MyStatusHandler statusHandler;
@PostConstruct
public void initialiseNettyServer() {
String rootPath = servletContext.getContextPath() + "/api";
server = new Nettosphere.Builder().config(
new Config.Builder()
.host(SERVER_HOST)
.port(SERVER_PORT)
.resource(rootPath + "/status", statusHandler)
.build())
.build();
server.start();
}
@PreDestroy
public void shutdownNettyServer() {
server.stop();
}
}
这假设Spring中基于注释的配置,您可以使用 XML 轻松实现与Jonathan 的答案中解释的相同的结果。
当然,您可能更喜欢直接使用 Netty,在这种情况下,同样的原则也适用,但您需要深入研究Netty 用户指南才能正确引导服务器。
选项 1(仅代码):
这是一个非常好的示例,展示了如何使用支持 Servlets 的处理程序引导 Netty(这反过来会将工作委托给 Spring MVC)https://github.com/rstoyanchev/netty-spring-mvc
在那里你定义了 ServletNettyHandler加上基于 Java 的 Spring MVC 配置器(DispatcherServletChannelInitializer),并且TestController使用@Controller和@RequestMapping注释,就像在这些情况下一样。
注意:考虑更新示例的 Netty 和 Spring 版本以使其工作。
选项 2(只是博客文章):
我找到了一篇描述该过程的博客文章。http://www.hypersocket.com/content/?p=12
只需创建一个 beanstart
和stop
负责启动和关闭 Netty 服务器的方法,然后使用适当的 init 和 destroy 钩子在上下文中注册 bean,例如:
<bean id="myNettyServer" class="x.y.z.MyNettyServer" init-method="start" destroy-method="shutdown"/>
或者,如果您不想使用 XML 配置,也可以使用@PostConstruct
和注释。@PreDestroy
实际上,使用 Spring 5,您可以配置Spring 5 Webflux应用程序,它看起来像一个健壮的响应式替代方案。以下几行 ( Config.start()
) 运行一个小型 HTTP 服务器,与 Spring 上下文的主要执行并行。
@Configuration
public class Config extends DelegatingWebFluxConfiguration{
@Bean
String test(){
return "Hello WOrLd";
}
@Bean
AdminController controller(){
return new AdminController();
}
public static void start() {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Config.class);
HttpHandler handler = WebHttpHandlerBuilder.applicationContext(applicationContext).build();
ReactorHttpHandlerAdapter adapter = new ReactorHttpHandlerAdapter(handler);
HttpServer.create("0.0.0.0", 8082).newHandler(adapter).subscribe();
}
}
控制器代码:
@RestController
public class AdminController {
@Autowired
String text;
@GetMapping(path = "/commands")
Mono<String> commands(){
return Mono.just(text);
}
}
构建.gradle
compile 'org.springframework:spring-context:5.0.2.RELEASE'
compile 'org.springframework:spring-web:5.0.2.RELEASE'
compile 'org.springframework:spring-webflux:5.0.2.RELEASE'
compile 'io.projectreactor.ipc:reactor-netty:0.7.2.RELEASE'
PS 这个例子只使用了没有 Spring Boot 的 Spring,它与嵌入式 Web 服务器一样好,但是您应该考虑使用 Spring Boot 进行成熟的微服务开发。