diff --git a/pom.xml b/pom.xml
index 18e3ace31b..2c173346ee 100644
--- a/pom.xml
+++ b/pom.xml
@@ -575,6 +575,7 @@
spring-5-reactive-client
spring-5-reactive-oauth
spring-5-reactive-security
+ spring-5-reactive-netty
spring-5-security
spring-5-security-oauth
diff --git a/spring-5-reactive-netty/.gitignore b/spring-5-reactive-netty/.gitignore
new file mode 100644
index 0000000000..70ed41e73a
--- /dev/null
+++ b/spring-5-reactive-netty/.gitignore
@@ -0,0 +1,11 @@
+# Folders #
+**/.idea
+**/target
+
+# Files #
+*.log
+
+# Packaged files #
+*.jar
+*.war
+*.ear
\ No newline at end of file
diff --git a/spring-5-reactive-netty/README.md b/spring-5-reactive-netty/README.md
new file mode 100644
index 0000000000..09f7cc0e24
--- /dev/null
+++ b/spring-5-reactive-netty/README.md
@@ -0,0 +1,3 @@
+## Spring 5 Reactive Project With Netty Server
+
+Includes configuration options for Netty server.
diff --git a/spring-5-reactive-netty/pom.xml b/spring-5-reactive-netty/pom.xml
new file mode 100644
index 0000000000..48fc0b201f
--- /dev/null
+++ b/spring-5-reactive-netty/pom.xml
@@ -0,0 +1,51 @@
+
+
+ 4.0.0
+ com.baeldung
+ spring-5-reactive-netty
+ 0.0.1-SNAPSHOT
+ spring-5-reactive-netty
+ jar
+ Spring 5 sample project about reactive web with Netty server
+
+
+ com.baeldung
+ parent-boot-2
+ 0.0.1-SNAPSHOT
+ ../parent-boot-2
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-webflux
+
+
+
+ org.projectlombok
+ lombok
+
+
+
+ org.springframework.boot
+ spring-boot-devtools
+ runtime
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
diff --git a/spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/ServerConfigApplication.java b/spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/ServerConfigApplication.java
new file mode 100644
index 0000000000..c4ff9c3930
--- /dev/null
+++ b/spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/ServerConfigApplication.java
@@ -0,0 +1,16 @@
+package com.baeldung.serverconfig;
+
+import com.baeldung.serverconfig.client.GreetingWebClient;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class ServerConfigApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(ServerConfigApplication.class, args);
+
+ GreetingWebClient webClient = new GreetingWebClient();
+ webClient.getResult();
+ }
+}
diff --git a/spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/client/GreetingWebClient.java b/spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/client/GreetingWebClient.java
new file mode 100644
index 0000000000..d9bea649c1
--- /dev/null
+++ b/spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/client/GreetingWebClient.java
@@ -0,0 +1,37 @@
+package com.baeldung.serverconfig.client;
+
+import io.netty.handler.ssl.SslContext;
+import io.netty.handler.ssl.SslContextBuilder;
+import io.netty.handler.ssl.util.InsecureTrustManagerFactory;
+import lombok.SneakyThrows;
+import org.springframework.http.client.reactive.ReactorClientHttpConnector;
+import org.springframework.web.reactive.function.client.WebClient;
+import reactor.core.publisher.Mono;
+import reactor.netty.http.client.HttpClient;
+
+public class GreetingWebClient {
+
+ private WebClient client = getWebClient();
+
+ public void getResult() {
+ System.out.println("Mono");
+ Mono greetingMono = client.get()
+ .uri("/greet/{name}", "baeldung")
+ .retrieve()
+ .bodyToMono(String.class);
+
+ greetingMono.subscribe(System.out::println);
+ }
+
+ @SneakyThrows
+ private WebClient getWebClient() {
+ SslContext sslContext = SslContextBuilder
+ .forClient()
+ .trustManager(InsecureTrustManagerFactory.INSTANCE)
+ .build();
+ HttpClient httpClient = HttpClient.create().secure(t -> t.sslContext(sslContext));
+ return WebClient.builder()
+ .baseUrl("https://localhost:8443")
+ .clientConnector(new ReactorClientHttpConnector(httpClient)).build();
+ }
+}
\ No newline at end of file
diff --git a/spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/server/GreetingController.java b/spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/server/GreetingController.java
new file mode 100644
index 0000000000..275439a66f
--- /dev/null
+++ b/spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/server/GreetingController.java
@@ -0,0 +1,23 @@
+package com.baeldung.serverconfig.server;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import reactor.core.publisher.Mono;
+
+@RestController
+@RequestMapping("/greet")
+public class GreetingController {
+
+ private final GreetingService greetingService;
+
+ public GreetingController(GreetingService greetingService) {
+ this.greetingService = greetingService;
+ }
+
+ @GetMapping("/{name}")
+ private Mono greet(@PathVariable String name) {
+ return greetingService.greet(name);
+ }
+}
diff --git a/spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/server/GreetingService.java b/spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/server/GreetingService.java
new file mode 100644
index 0000000000..5b2b246531
--- /dev/null
+++ b/spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/server/GreetingService.java
@@ -0,0 +1,12 @@
+package com.baeldung.serverconfig.server;
+
+import org.springframework.stereotype.Service;
+import reactor.core.publisher.Mono;
+
+@Service
+public class GreetingService {
+
+ public Mono greet(String name) {
+ return Mono.just("Greeting " + name);
+ }
+}
diff --git a/spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/server/NettyWebServerFactoryPortCustomizer.java b/spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/server/NettyWebServerFactoryPortCustomizer.java
new file mode 100644
index 0000000000..be7e442afe
--- /dev/null
+++ b/spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/server/NettyWebServerFactoryPortCustomizer.java
@@ -0,0 +1,31 @@
+package com.baeldung.serverconfig.server;
+
+import org.springframework.boot.web.embedded.netty.NettyReactiveWebServerFactory;
+import org.springframework.boot.web.embedded.netty.NettyServerCustomizer;
+import org.springframework.boot.web.server.WebServerFactoryCustomizer;
+import org.springframework.stereotype.Component;
+import reactor.netty.http.server.HttpServer;
+
+@Component
+public class NettyWebServerFactoryPortCustomizer implements WebServerFactoryCustomizer {
+
+ @Override
+ public void customize(NettyReactiveWebServerFactory serverFactory) {
+ serverFactory.addServerCustomizers(new PortCustomizer(8443));
+ }
+
+ private static class PortCustomizer implements NettyServerCustomizer {
+
+ private final int port;
+
+ private PortCustomizer(int port) {
+ this.port = port;
+ }
+
+ @Override
+ public HttpServer apply(HttpServer httpServer) {
+ return httpServer.port(port);
+ }
+ }
+}
+
diff --git a/spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/server/NettyWebServerFactorySslCustomizer.java b/spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/server/NettyWebServerFactorySslCustomizer.java
new file mode 100644
index 0000000000..f84e8d143a
--- /dev/null
+++ b/spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/server/NettyWebServerFactorySslCustomizer.java
@@ -0,0 +1,23 @@
+package com.baeldung.serverconfig.server;
+
+import org.springframework.boot.web.embedded.netty.NettyReactiveWebServerFactory;
+import org.springframework.boot.web.server.Ssl;
+import org.springframework.boot.web.server.WebServerFactoryCustomizer;
+import org.springframework.stereotype.Component;
+
+@Component
+public class NettyWebServerFactorySslCustomizer implements WebServerFactoryCustomizer {
+
+ @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");
+ serverFactory.setSsl(ssl);
+ serverFactory.setPort(8443);
+ }
+}
+
diff --git a/spring-5-reactive-netty/src/main/resources/logback.xml b/spring-5-reactive-netty/src/main/resources/logback.xml
new file mode 100644
index 0000000000..fc026694b1
--- /dev/null
+++ b/spring-5-reactive-netty/src/main/resources/logback.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+ %black(%d{ISO8601}) %highlight(%-5level) [%blue(%t)] %yellow(%C{1.}): %msg%n%throwable
+
+
+
+
+
+ netty-access.log
+
+ %msg%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-5-reactive-netty/src/main/resources/sample.jks b/spring-5-reactive-netty/src/main/resources/sample.jks
new file mode 100644
index 0000000000..6aa9a28053
Binary files /dev/null and b/spring-5-reactive-netty/src/main/resources/sample.jks differ
diff --git a/spring-5-reactive-netty/src/test/java/com/baeldung/serverconfig/server/GreetingControllerIntegrationTest.java b/spring-5-reactive-netty/src/test/java/com/baeldung/serverconfig/server/GreetingControllerIntegrationTest.java
new file mode 100644
index 0000000000..8bd4e41f1f
--- /dev/null
+++ b/spring-5-reactive-netty/src/test/java/com/baeldung/serverconfig/server/GreetingControllerIntegrationTest.java
@@ -0,0 +1,41 @@
+package com.baeldung.serverconfig.server;
+
+import static org.mockito.Mockito.when;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.reactive.server.WebTestClient;
+import reactor.core.publisher.Mono;
+
+@RunWith(SpringRunner.class)
+@WebFluxTest
+public class GreetingControllerIntegrationTest {
+
+ @Autowired
+ private WebTestClient webClient;
+
+ @MockBean
+ private GreetingService greetingService;
+
+ private final String name = "baeldung";
+
+ @Before
+ public void setUp() {
+ when(greetingService.greet(name)).thenReturn(Mono.just("Hello baeldung"));
+ }
+
+ @Test
+ public void shouldGreet() {
+ webClient.get().uri("/greet/{name}", name)
+ .exchange()
+ .expectStatus()
+ .isOk()
+ .expectBody(String.class)
+ .isEqualTo("Hello baeldung");
+ }
+}
\ No newline at end of file
diff --git a/spring-5-reactive-netty/src/test/resources/logback-test.xml b/spring-5-reactive-netty/src/test/resources/logback-test.xml
new file mode 100644
index 0000000000..39534b2c41
--- /dev/null
+++ b/spring-5-reactive-netty/src/test/resources/logback-test.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+ %black(%d{ISO8601}) %highlight(%-5level) [%blue(%t)] %yellow(%C{1.}): %msg%n%throwable
+
+
+
+
+
+
+
\ No newline at end of file