我该如何在Spring MVC中配置Netty呢?在什么时候和地方应该启动Netty tcp服务器呢?我应该在Spring启动后初始化Netty吗?有没有人能给我展示一个例子,比如Spring配置xml文件或其他东西?谢谢!
我该如何在Spring MVC中配置Netty呢?在什么时候和地方应该启动Netty tcp服务器呢?我应该在Spring启动后初始化Netty吗?有没有人能给我展示一个例子,比如Spring配置xml文件或其他东西?谢谢!
这真的取决于你使用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();
}
}
选项1(仅代码):
这是一个非常好的例子,展示了如何使用支持Servlet的处理程序(这将委托Spring MVC完成工作)引导Netty 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
只需创建一个带有 start
和 stop
方法的 Bean,负责启动和关闭 Netty 服务器,然后使用适当的初始化和销毁钩子在上下文中注册该 Bean,例如:
<bean id="myNettyServer" class="x.y.z.MyNettyServer" init-method="start" destroy-method="shutdown"/>
@PostConstruct
和@PreDestroy
注释。实际上,使用Spring 5,您可以配置一个Spring 5 Webflux应用程序,它看起来是一个强大的反应式替代方案。以下行(Config.start()
)在Spring上下文中与主执行并行运行一个小型HTTP服务器。
@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);
}
}
build.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'
顺便提一下,这个例子只使用了不带 Spring Boot 的 Spring 框架,它可以作为一个内嵌的 Web 服务器。但是如果你想进行一项完整的微服务开发,你应该考虑使用 Spring Boot。