使用Netty和Spring MVC结合实现什么?

8

我该如何在Spring MVC中配置Netty呢?在什么时候和地方应该启动Netty tcp服务器呢?我应该在Spring启动后初始化Netty吗?有没有人能给我展示一个例子,比如Spring配置xml文件或其他东西?谢谢!


更好的问题不是如何,而是它是否有意义?请参见https://dev59.com/snXZa4cB1Zd3GeqPAfhk - Maksym
4个回答

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

选项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


2
两个链接都已失效。 - Eugene Petrenko

1

只需创建一个带有 startstop 方法的 Bean,负责启动和关闭 Netty 服务器,然后使用适当的初始化和销毁钩子在上下文中注册该 Bean,例如:

<bean id="myNettyServer" class="x.y.z.MyNettyServer" init-method="start" destroy-method="shutdown"/>

或者,如果您不想使用XML配置,可以使用@PostConstruct@PreDestroy注释。

0

实际上,使用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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接