8

如何在 Spring MVC 中配置 Netty。我应该何时何地启动 Netty tcp 服务器?春天开始后我应该初始化netty吗?有人可以给我看一个例子,比如 Spring 配置 xml 文件或其他东西吗?谢谢!

4

4 回答 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 用户指南才能正确引导服务器。

于 2013-08-22T08:47:24.057 回答
1

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

于 2014-09-19T13:52:12.480 回答
1

只需创建一个 beanstartstop负责启动和关闭 Netty 服务器的方法,然后使用适当的 init 和 destroy 钩子在上下文中注册 bean,例如:

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

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

于 2013-08-22T08:40:28.583 回答
0

实际上,使用 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 进行成熟的微服务开发。

于 2017-12-12T00:15:37.760 回答