下面列出了怎么用org.springframework.boot.web.embedded.netty.NettyReactiveWebServerFactory的API类实例代码及写法,或者点击链接到github查看源代码。
@Bean
public WebServerFactoryCustomizer<NettyReactiveWebServerFactory> webServerFactoryWebServerFactoryCustomizer() {
//解决请求参数最大长度问题
return factory -> factory.addServerCustomizers(httpServer ->
httpServer.httpRequestDecoder(spec -> {
spec.maxInitialLineLength(10240);
return spec;
}));
}
/**
* Netty reactive web server factory netty reactive web server factory.
*
* @return the netty reactive web server factory
*/
@Bean
public NettyReactiveWebServerFactory nettyReactiveWebServerFactory() {
NettyReactiveWebServerFactory webServerFactory = new NettyReactiveWebServerFactory();
webServerFactory.addServerCustomizers(new EventLoopNettyCustomizer());
return webServerFactory;
}
/**
* Since we're impersonating a {@code Zipkin} server we need to support the same set of features.
* One of the features is request compression, which we handle here by adding a {@link HttpContentDecompressor} to the {@code Netty} pipeline.
*/
@Bean
public ReactiveWebServerFactory reactiveWebServerFactory() {
NettyReactiveWebServerFactory factory = new NettyReactiveWebServerFactory();
factory.addServerCustomizers(builder -> builder
.tcpConfiguration(tcpServer -> {
return tcpServer.doOnConnection(connection -> connection.addHandler("decompressor", new HttpContentDecompressor()));
}));
return factory;
}
@Bean
@ConditionalOnProperty(name = "spring.cloud.gateway.httpserver.wiretap")
public NettyWebServerFactoryCustomizer nettyServerWiretapCustomizer(
Environment environment, ServerProperties serverProperties) {
return new NettyWebServerFactoryCustomizer(environment, serverProperties) {
@Override
public void customize(NettyReactiveWebServerFactory factory) {
factory.addServerCustomizers(httpServer -> httpServer.wiretap(true));
super.customize(factory);
}
};
}
@Bean
NettyReactiveWebServerFactory nettyReactiveWebServerFactory(
@Value("${server.port:0}") int serverPort) {
log.info("Starting container at port [" + serverPort + "]");
return new NettyReactiveWebServerFactory(
serverPort == 0 ? SocketUtils.findAvailableTcpPort() : serverPort);
}
@Override
public void customize(NettyReactiveWebServerFactory serverFactory) {
Ssl ssl = new Ssl();
ssl.setEnabled(true);
ssl.setKeyStore("classpath:sample.jks");
ssl.setKeyAlias("alias");
ssl.setKeyPassword("password");
ssl.setKeyStorePassword("secret");
Http2 http2 = new Http2();
http2.setEnabled(false);
serverFactory.addServerCustomizers(new SslServerCustomizer(ssl, http2, null));
serverFactory.setPort(8443);
}
@Bean
public ReactiveWebServerFactory reactiveWebServerFactory(){
return new NettyReactiveWebServerFactory();
}
@Override
public ConfigurableReactiveWebServerFactory get() {
return new NettyReactiveWebServerFactory();
}
public static SpringApplication createSpringApplication(String[] args) {
var environment = new StandardEnvironment();
environment.setDefaultProfiles("exporter", "gateway");
environment.getPropertySources().addFirst(new SimpleCommandLinePropertySource(args));
var pluginsDir = environment.getProperty("plugins.dir", String.class, "./plugins");
var pathMatcher = environment.getProperty("plugins.pathMatcher", String.class, "*.jar");
var pluginsRoot = Paths.get(pluginsDir).toAbsolutePath().normalize();
log.info("Loading plugins from '{}' with matcher: '{}'", pluginsRoot, pathMatcher);
var pluginManager = new LiiklusPluginManager(pluginsRoot, pathMatcher);
pluginManager.loadPlugins();
pluginManager.startPlugins();
var binder = Binder.get(environment);
var application = new SpringApplication(Application.class) {
@Override
protected void load(ApplicationContext context, Object[] sources) {
// We don't want the annotation bean definition reader
}
};
application.setWebApplicationType(WebApplicationType.REACTIVE);
application.setApplicationContextClass(ReactiveWebServerApplicationContext.class);
application.setEnvironment(environment);
application.addInitializers(
new StringCodecInitializer(false, true),
new ResourceCodecInitializer(false),
new ReactiveWebServerInitializer(
binder.bind("server", ServerProperties.class).orElseGet(ServerProperties::new),
binder.bind("spring.resources", ResourceProperties.class).orElseGet(ResourceProperties::new),
binder.bind("spring.webflux", WebFluxProperties.class).orElseGet(WebFluxProperties::new),
new NettyReactiveWebServerFactory()
),
new GatewayConfiguration(),
(GenericApplicationContext applicationContext) -> {
applicationContext.registerBean("health", RouterFunction.class, () -> {
return RouterFunctions.route()
.GET("/health", __ -> ServerResponse.ok().bodyValue("OK"))
.build();
});
applicationContext.registerBean(PluginManager.class, () -> pluginManager);
}
);
application.addInitializers(
pluginManager.getExtensionClasses(ApplicationContextInitializer.class).stream()
.map(it -> {
try {
return it.getDeclaredConstructor().newInstance();
} catch (Exception e) {
throw new RuntimeException(e);
}
})
.toArray(ApplicationContextInitializer[]::new)
);
return application;
}
@Override
public void customize(NettyReactiveWebServerFactory serverFactory) {
serverFactory.addServerCustomizers(new PortCustomizer(8443));
}
@Bean
public NettyReactiveWebServerFactory nettyReactiveWebServerFactory() {
NettyReactiveWebServerFactory webServerFactory = new NettyReactiveWebServerFactory();
webServerFactory.addServerCustomizers(new EventLoopNettyCustomizer());
return webServerFactory;
}