From b7cc946a3297e188de0fb0e77d8bc3ba33cf57da Mon Sep 17 00:00:00 2001 From: isaolmez Date: Tue, 12 Mar 2019 22:35:27 +0300 Subject: [PATCH 1/5] BAEL-2715: Added code samples for Netty server configuration --- pom.xml | 1 + spring-5-reactive-netty/.gitignore | 11 ++++ spring-5-reactive-netty/README.md | 3 ++ spring-5-reactive-netty/pom.xml | 51 ++++++++++++++++++ .../serverconfig/ServerConfigApplication.java | 16 ++++++ .../client/GreetingWebClient.java | 37 +++++++++++++ .../server/GreetingController.java | 23 ++++++++ .../serverconfig/server/GreetingService.java | 12 +++++ .../NettyWebServerFactoryPortCustomizer.java | 31 +++++++++++ .../NettyWebServerFactorySslCustomizer.java | 23 ++++++++ .../src/main/resources/logback.xml | 31 +++++++++++ .../src/main/resources/sample.jks | Bin 0 -> 2264 bytes .../GreetingControllerIntegrationTest.java | 41 ++++++++++++++ .../src/test/resources/logback-test.xml | 13 +++++ 14 files changed, 293 insertions(+) create mode 100644 spring-5-reactive-netty/.gitignore create mode 100644 spring-5-reactive-netty/README.md create mode 100644 spring-5-reactive-netty/pom.xml create mode 100644 spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/ServerConfigApplication.java create mode 100644 spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/client/GreetingWebClient.java create mode 100644 spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/server/GreetingController.java create mode 100644 spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/server/GreetingService.java create mode 100644 spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/server/NettyWebServerFactoryPortCustomizer.java create mode 100644 spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/server/NettyWebServerFactorySslCustomizer.java create mode 100644 spring-5-reactive-netty/src/main/resources/logback.xml create mode 100644 spring-5-reactive-netty/src/main/resources/sample.jks create mode 100644 spring-5-reactive-netty/src/test/java/com/baeldung/serverconfig/server/GreetingControllerIntegrationTest.java create mode 100644 spring-5-reactive-netty/src/test/resources/logback-test.xml 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 0000000000000000000000000000000000000000..6aa9a28053a591e41453e665e5024e8a8cb78b3d GIT binary patch literal 2264 zcmchYX*3iJ7sqE|hQS!q5Mv)4GM2$i#uAFqC`%7x7baWA*i&dRX>3`uq(XS?3XSYp z%38`&ib7E$8j~$cF^}gt?|I+noW8#w?uYxk=iGD8|K9Vzd#pVc0002(2k@T|2@MMI zqxqr2AhQO*TVi`j@((S;e;g;l$#dAA{>vf0kX$R(Qn4oKgGEYjZ5zti2dw?Z6A zh%LuFCNI?9o+Z1duJL-++e#cjO`zlK?u9s030=k_*wD1#-$FbIDRDnA^vo@fm( zzjt(3VJrGOr0iHXSTM|rYN#>RZ@Dp`PwB2zrDQffLvuoR2~V3ReYa0&vU^dXd8isV zsAf*@!8s%xBvHLseXn6f?1kefe(8uAmAbaF$x{Ykzb6c6jdUwY1$y4tFzsj7 zIghr!T#ODfu@Po!a29@kXQ8kY#(LE<0o7?7PQ|eMeY@Equ?R-6*f@Na3o&stDQ=6( zQzDSQhCnS(9Bu9W_~giknP0vECqUsr4_9y_}nEU`cy z4}dApnAip92wMwgzciAFpc3i}+-#Zlq+iF7d1y}d4Qsp8=%l1N8NIs161I`HmkcpQ zY4*CUCFJJf(2!M{`&qQ}3($KeTQ=)mMrBs`DOb;%Of0tC)9he_p~w&CO#DfCgx(%s z{@|D(brX_Gb}ZDLmGej*JgEl0Et>q~kgTXuJg-PwvRjNx8sBbIShxD=xOySzw{;^X zAvrh5HTg>Xq@<{#^!Kg}B?qz@b<{ebD)yaSf&RChBIJQo-?Ahzw@qopSe^e&>^IuU zydM4Y1_C&>k7u|}=; z63R7$H6zat=hNExxEwXu1fQ*ytuEkP!{w{|#6TIEq1#*ck=6_NM*ILF65tmD-O5&R zMI!-MT<3U~t@}(CN4@RlZ~1I>C=!ywF)dNI{VvH;5Y3(Z4jY^%_c&fsm4Q`<1g|qX z&!h29jXjVE3nJnet*L)XL?-8<>qDbVGP%i^NwOZfwWO7?Mr!X7 zl}sG@9S_5}}td}$xrWIYY=e(VVBiv%A+M-{M z!3_^Tc=pV?niT!{D`!{e@W;MvrZ(OER{x7itVAtwE~spPtPtma|J=5dv&_oE!5H#` zdgXJ;+gJ4hI}*9QX9jpL`Gb)yCe%1}t!&O-^sihyZys%%5uF~WhsR_w(q7;vV5d4P zr%ZUA2}kO+L^2ePTgGT9Ua71w<+)poSyjTdLq&xbUn`<6&SpwFp(HRHUyU6J3WZ_! zfztko79+94Tq%mTYj53(RYcL&1~5`I#+w3`(Q|r+P(aT z%?r(^?IWw~19CB&uvXf(f7&BnEE{zwK4piVU`I4j1j?v5d4N<7VUJ8nM`$7S*mfKR z#9-JzPRZ?{M!@L+0N^V)IyeeP2T|^UK|m0QD+Ibs!wEoml^N!YO#vW~j~jraX(0A3 z6Kux?IRLez`O^X;{!4g%BhcRn>^H*qKZ3*|{_YGuz)KCJcu;)DSES5D2tDE`C02YR0R%Vy1T7k|RQ;3g<0icA$AuP0pOvc~jGl zz+NeKv_FT_;GWK&8XlDUv&hv9kxg?@c!bu?83i=YQ$S!K09Y)Glg3Hz?@|)ZCBlVz zP8i}#XZkMoje3I=h&I!!s_m?Qi@1MR`yv7X*yEs47qOs^t^?&=;*IQ!q&)gq_Sx5* z?fhU8Q*PSe*w7y)FH#P!9R^Xw!lTT+zI39L<&8cViaj$A(Z2Cg7!{V?uuyi#vlNCg z40i}2ivw&y&1-&Nh&WMG`&aIt>)(#tKTJ}^@696Kw1-{IzSOTnFF+0@k$o3%ZHS;Q#;t literal 0 HcmV?d00001 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 From 24c5be0e4f2dcfabf60a3ef8accef00eb79f4c6d Mon Sep 17 00:00:00 2001 From: isaolmez Date: Tue, 12 Mar 2019 22:37:51 +0300 Subject: [PATCH 2/5] BAEL-2715: Added code samples for Netty server configuration --- .../com/baeldung/serverconfig/client/GreetingWebClient.java | 2 +- .../server/NettyWebServerFactoryPortCustomizer.java | 1 - .../serverconfig/server/NettyWebServerFactorySslCustomizer.java | 1 - spring-5-reactive-netty/src/main/resources/logback.xml | 2 +- .../serverconfig/server/GreetingControllerIntegrationTest.java | 2 +- spring-5-reactive-netty/src/test/resources/logback-test.xml | 2 +- 6 files changed, 4 insertions(+), 6 deletions(-) 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 index d9bea649c1..77dc98398b 100644 --- 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 @@ -34,4 +34,4 @@ public class GreetingWebClient { .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/NettyWebServerFactoryPortCustomizer.java b/spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/server/NettyWebServerFactoryPortCustomizer.java index be7e442afe..1dda58baa4 100644 --- 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 @@ -28,4 +28,3 @@ public class NettyWebServerFactoryPortCustomizer implements WebServerFactoryCust } } } - 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 index f84e8d143a..0aceae39dc 100644 --- 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 @@ -20,4 +20,3 @@ public class NettyWebServerFactorySslCustomizer implements WebServerFactoryCusto 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 index fc026694b1..48b68c6bf1 100644 --- a/spring-5-reactive-netty/src/main/resources/logback.xml +++ b/spring-5-reactive-netty/src/main/resources/logback.xml @@ -28,4 +28,4 @@ - \ No newline at end of file + 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 index 8bd4e41f1f..f8e384fb6e 100644 --- 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 @@ -38,4 +38,4 @@ public class GreetingControllerIntegrationTest { .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 index 39534b2c41..12cedf5952 100644 --- a/spring-5-reactive-netty/src/test/resources/logback-test.xml +++ b/spring-5-reactive-netty/src/test/resources/logback-test.xml @@ -10,4 +10,4 @@ - \ No newline at end of file + From 4d05dd1d9e7a72bf2903286725463d0b04e8d678 Mon Sep 17 00:00:00 2001 From: isaolmez Date: Sat, 16 Mar 2019 17:01:42 +0300 Subject: [PATCH 3/5] BAEL-2715: Modified customizers --- ...tyWebServerFactoryBootstrapCustomizer.java | 49 +++++++++++++++++++ .../NettyWebServerFactoryPortCustomizer.java | 30 ------------ .../NettyWebServerFactorySslCustomizer.java | 6 ++- 3 files changed, 54 insertions(+), 31 deletions(-) create mode 100644 spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/server/NettyWebServerFactoryBootstrapCustomizer.java delete mode 100644 spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/server/NettyWebServerFactoryPortCustomizer.java diff --git a/spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/server/NettyWebServerFactoryBootstrapCustomizer.java b/spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/server/NettyWebServerFactoryBootstrapCustomizer.java new file mode 100644 index 0000000000..05b2fbb7f7 --- /dev/null +++ b/spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/server/NettyWebServerFactoryBootstrapCustomizer.java @@ -0,0 +1,49 @@ +package com.baeldung.serverconfig.server; + +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioServerSocketChannel; +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 NettyWebServerFactoryBootstrapCustomizer implements WebServerFactoryCustomizer { + + @Override + public void customize(NettyReactiveWebServerFactory serverFactory) { + serverFactory.addServerCustomizers(new PortCustomizer(8443)); + serverFactory.addServerCustomizers(new EventLoopNettyCustomizer()); + } + + 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); + } + } + + private static class EventLoopNettyCustomizer implements NettyServerCustomizer { + + @Override + public HttpServer apply(HttpServer httpServer) { + EventLoopGroup parentGroup = new NioEventLoopGroup(); + EventLoopGroup childGroup = new NioEventLoopGroup(); + return httpServer + .tcpConfiguration(tcpServer -> tcpServer.bootstrap( + serverBootstrap -> serverBootstrap.group(parentGroup, childGroup).channel(NioServerSocketChannel.class) + )); + + } + + } +} 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 deleted file mode 100644 index 1dda58baa4..0000000000 --- a/spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/server/NettyWebServerFactoryPortCustomizer.java +++ /dev/null @@ -1,30 +0,0 @@ -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 index 0aceae39dc..d03c3a7f40 100644 --- 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 @@ -1,6 +1,8 @@ package com.baeldung.serverconfig.server; import org.springframework.boot.web.embedded.netty.NettyReactiveWebServerFactory; +import org.springframework.boot.web.embedded.netty.SslServerCustomizer; +import org.springframework.boot.web.server.Http2; import org.springframework.boot.web.server.Ssl; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.stereotype.Component; @@ -16,7 +18,9 @@ public class NettyWebServerFactorySslCustomizer implements WebServerFactoryCusto ssl.setKeyAlias("alias"); ssl.setKeyPassword("password"); ssl.setKeyStorePassword("secret"); - serverFactory.setSsl(ssl); + Http2 http2 = new Http2(); + http2.setEnabled(false); + serverFactory.addServerCustomizers(new SslServerCustomizer(ssl, http2, null)); serverFactory.setPort(8443); } } From e813a0e64d9828f00643185d5232dacfdf452dc9 Mon Sep 17 00:00:00 2001 From: isaolmez Date: Tue, 19 Mar 2019 22:29:12 +0300 Subject: [PATCH 4/5] BAEL-2715: Modified tests and configurations --- ....java => CustomNettyWebServerFactory.java} | 35 ++++-------- .../{server => }/GreetingController.java | 2 +- .../{server => }/GreetingService.java | 2 +- .../NettyWebServerFactoryPortCustomizer.java | 30 ++++++++++ .../NettyWebServerFactorySslCustomizer.java | 2 +- .../serverconfig/ServerConfigApplication.java | 4 -- .../client/GreetingWebClient.java | 37 ------------ .../GreetingControllerIntegrationTest.java | 8 +-- .../serverconfig/GreetingLiveTest.java | 56 +++++++++++++++++++ .../GreetingSkipAutoConfigLiveTest.java | 8 +++ 10 files changed, 113 insertions(+), 71 deletions(-) rename spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/{server/NettyWebServerFactoryBootstrapCustomizer.java => CustomNettyWebServerFactory.java} (51%) rename spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/{server => }/GreetingController.java (94%) rename spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/{server => }/GreetingService.java (84%) create mode 100644 spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/NettyWebServerFactoryPortCustomizer.java rename spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/{server => }/NettyWebServerFactorySslCustomizer.java (96%) delete mode 100644 spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/client/GreetingWebClient.java rename spring-5-reactive-netty/src/test/java/com/baeldung/serverconfig/{server => }/GreetingControllerIntegrationTest.java (87%) create mode 100644 spring-5-reactive-netty/src/test/java/com/baeldung/serverconfig/GreetingLiveTest.java create mode 100644 spring-5-reactive-netty/src/test/java/com/baeldung/serverconfig/GreetingSkipAutoConfigLiveTest.java diff --git a/spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/server/NettyWebServerFactoryBootstrapCustomizer.java b/spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/CustomNettyWebServerFactory.java similarity index 51% rename from spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/server/NettyWebServerFactoryBootstrapCustomizer.java rename to spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/CustomNettyWebServerFactory.java index 05b2fbb7f7..32e57d2d98 100644 --- a/spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/server/NettyWebServerFactoryBootstrapCustomizer.java +++ b/spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/CustomNettyWebServerFactory.java @@ -1,35 +1,24 @@ -package com.baeldung.serverconfig.server; +package com.baeldung.serverconfig; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioServerSocketChannel; 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 org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; import reactor.netty.http.server.HttpServer; -@Component -public class NettyWebServerFactoryBootstrapCustomizer implements WebServerFactoryCustomizer { +@Configuration +@Profile("skipAutoConfig") +public class CustomNettyWebServerFactory { - @Override - public void customize(NettyReactiveWebServerFactory serverFactory) { - serverFactory.addServerCustomizers(new PortCustomizer(8443)); - serverFactory.addServerCustomizers(new EventLoopNettyCustomizer()); - } - - 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); - } + @Bean + public NettyReactiveWebServerFactory nettyReactiveWebServerFactory() { + NettyReactiveWebServerFactory webServerFactory = new NettyReactiveWebServerFactory(); + webServerFactory.addServerCustomizers(new EventLoopNettyCustomizer()); + return webServerFactory; } private static class EventLoopNettyCustomizer implements NettyServerCustomizer { 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/GreetingController.java similarity index 94% rename from spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/server/GreetingController.java rename to spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/GreetingController.java index 275439a66f..9cb5b27ac5 100644 --- 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/GreetingController.java @@ -1,4 +1,4 @@ -package com.baeldung.serverconfig.server; +package com.baeldung.serverconfig; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; 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/GreetingService.java similarity index 84% rename from spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/server/GreetingService.java rename to spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/GreetingService.java index 5b2b246531..5440f526aa 100644 --- 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/GreetingService.java @@ -1,4 +1,4 @@ -package com.baeldung.serverconfig.server; +package com.baeldung.serverconfig; import org.springframework.stereotype.Service; import reactor.core.publisher.Mono; diff --git a/spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/NettyWebServerFactoryPortCustomizer.java b/spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/NettyWebServerFactoryPortCustomizer.java new file mode 100644 index 0000000000..152e1285aa --- /dev/null +++ b/spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/NettyWebServerFactoryPortCustomizer.java @@ -0,0 +1,30 @@ +package com.baeldung.serverconfig; + +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/NettyWebServerFactorySslCustomizer.java similarity index 96% rename from spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/server/NettyWebServerFactorySslCustomizer.java rename to spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/NettyWebServerFactorySslCustomizer.java index d03c3a7f40..d0ad0dcac5 100644 --- 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/NettyWebServerFactorySslCustomizer.java @@ -1,4 +1,4 @@ -package com.baeldung.serverconfig.server; +package com.baeldung.serverconfig; import org.springframework.boot.web.embedded.netty.NettyReactiveWebServerFactory; import org.springframework.boot.web.embedded.netty.SslServerCustomizer; 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 index c4ff9c3930..9d420cc7da 100644 --- 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 @@ -1,6 +1,5 @@ package com.baeldung.serverconfig; -import com.baeldung.serverconfig.client.GreetingWebClient; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -9,8 +8,5 @@ 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 deleted file mode 100644 index 77dc98398b..0000000000 --- a/spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/client/GreetingWebClient.java +++ /dev/null @@ -1,37 +0,0 @@ -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(); - } -} 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/GreetingControllerIntegrationTest.java similarity index 87% rename from spring-5-reactive-netty/src/test/java/com/baeldung/serverconfig/server/GreetingControllerIntegrationTest.java rename to spring-5-reactive-netty/src/test/java/com/baeldung/serverconfig/GreetingControllerIntegrationTest.java index f8e384fb6e..3c2c08321a 100644 --- 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/GreetingControllerIntegrationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.serverconfig.server; +package com.baeldung.serverconfig; import static org.mockito.Mockito.when; @@ -22,11 +22,11 @@ public class GreetingControllerIntegrationTest { @MockBean private GreetingService greetingService; - private final String name = "baeldung"; + private final String name = "Baeldung"; @Before public void setUp() { - when(greetingService.greet(name)).thenReturn(Mono.just("Hello baeldung")); + when(greetingService.greet(name)).thenReturn(Mono.just("Greeting Baeldung")); } @Test @@ -36,6 +36,6 @@ public class GreetingControllerIntegrationTest { .expectStatus() .isOk() .expectBody(String.class) - .isEqualTo("Hello baeldung"); + .isEqualTo("Greeting Baeldung"); } } diff --git a/spring-5-reactive-netty/src/test/java/com/baeldung/serverconfig/GreetingLiveTest.java b/spring-5-reactive-netty/src/test/java/com/baeldung/serverconfig/GreetingLiveTest.java new file mode 100644 index 0000000000..7c4a37c890 --- /dev/null +++ b/spring-5-reactive-netty/src/test/java/com/baeldung/serverconfig/GreetingLiveTest.java @@ -0,0 +1,56 @@ +package com.baeldung.serverconfig; + +import io.netty.handler.ssl.SslContext; +import io.netty.handler.ssl.SslContextBuilder; +import io.netty.handler.ssl.util.InsecureTrustManagerFactory; +import javax.net.ssl.SSLException; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.http.client.reactive.ReactorClientHttpConnector; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.reactive.server.WebTestClient; +import org.springframework.test.web.reactive.server.WebTestClient.ResponseSpec; +import reactor.netty.http.client.HttpClient; + +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = WebEnvironment.DEFINED_PORT) +public class GreetingLiveTest { + + private static final String BASE_URL = "https://localhost:8443"; + + private WebTestClient webTestClient; + + @Before + public void setup() throws SSLException { + webTestClient = WebTestClient.bindToServer(getConnector()) + .baseUrl(BASE_URL) + .build(); + } + + @Test + public void shouldGreet() { + final String name = "Baeldung"; + + ResponseSpec response = webTestClient.get() + .uri("/greet/{name}", name) + .exchange(); + + response.expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo("Greeting Baeldung"); + } + + private ReactorClientHttpConnector getConnector() throws SSLException { + SslContext sslContext = SslContextBuilder + .forClient() + .trustManager(InsecureTrustManagerFactory.INSTANCE) + .build(); + HttpClient httpClient = HttpClient.create().secure(t -> t.sslContext(sslContext)); + return new ReactorClientHttpConnector(httpClient); + } +} diff --git a/spring-5-reactive-netty/src/test/java/com/baeldung/serverconfig/GreetingSkipAutoConfigLiveTest.java b/spring-5-reactive-netty/src/test/java/com/baeldung/serverconfig/GreetingSkipAutoConfigLiveTest.java new file mode 100644 index 0000000000..646742b3d7 --- /dev/null +++ b/spring-5-reactive-netty/src/test/java/com/baeldung/serverconfig/GreetingSkipAutoConfigLiveTest.java @@ -0,0 +1,8 @@ +package com.baeldung.serverconfig; + +import org.springframework.test.context.ActiveProfiles; + +@ActiveProfiles("skipAutoConfig") +public class GreetingSkipAutoConfigLiveTest extends GreetingLiveTest { + +} From ddcc4964688a1a2a21119c85dfb02cdb237d571b Mon Sep 17 00:00:00 2001 From: isaolmez Date: Tue, 19 Mar 2019 22:44:07 +0300 Subject: [PATCH 5/5] BAEL-2715: Modified tests and configurations --- .../com/baeldung/serverconfig/CustomNettyWebServerFactory.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/CustomNettyWebServerFactory.java b/spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/CustomNettyWebServerFactory.java index 32e57d2d98..8a1cdbba97 100644 --- a/spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/CustomNettyWebServerFactory.java +++ b/spring-5-reactive-netty/src/main/java/com/baeldung/serverconfig/CustomNettyWebServerFactory.java @@ -31,8 +31,6 @@ public class CustomNettyWebServerFactory { .tcpConfiguration(tcpServer -> tcpServer.bootstrap( serverBootstrap -> serverBootstrap.group(parentGroup, childGroup).channel(NioServerSocketChannel.class) )); - } - } }