From b7cc946a3297e188de0fb0e77d8bc3ba33cf57da Mon Sep 17 00:00:00 2001 From: isaolmez Date: Tue, 12 Mar 2019 22:35:27 +0300 Subject: [PATCH] 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