Konfigurasi Netty Reactor Spring Boot

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan melihat pelbagai pilihan konfigurasi untuk pelayan Reactor Netty dalam aplikasi Spring Boot. Pada akhirnya, kami akan mempunyai aplikasi yang menampilkan pendekatan konfigurasi yang berbeza.

2. Apakah Reactor Netty?

Sebelum kita mulakan, mari kita lihat apa itu Reactor Netty dan bagaimana kaitannya dengan Spring Boot.

Reactor Netty adalah kerangka aplikasi rangkaian berdasarkan peristiwa yang tidak segerak . Ia menyediakan klien dan pelayan TCP, HTTP, dan UDP tanpa penyekat dan tekanan balik. Seperti namanya, ini berdasarkan kerangka kerja Netty.

Sekarang, mari kita lihat di mana Spring dan Spring Boot masuk ke dalam gambar.

Spring WebFlux adalah sebahagian daripada rangka Spring dan menyediakan sokongan pengaturcaraan reaktif untuk aplikasi web. Sekiranya kita menggunakan WebFlux dalam aplikasi Spring Boot , Spring Boot secara automatik mengkonfigurasi Reactor Netty sebagai pelayan lalai . Di samping itu, kami dapat secara eksplisit menambahkan Reactor Netty ke projek kami, dan Spring Boot sekali lagi harus mengkonfigurasinya secara automatik.

Sekarang, kami akan membina aplikasi untuk mengetahui bagaimana kami dapat menyesuaikan pelayan Reactor Netty yang dikonfigurasi secara automatik. Selepas itu, kami akan merangkumi beberapa senario konfigurasi biasa.

3. Kebergantungan

Pertama, kami akan menambahkan pergantungan Maven yang diperlukan.

Untuk menggunakan pelayan Reactor Netty, kami akan menambahkan spring-boot-starter-webflux sebagai pergantungan dalam fail pom kami:

 org.springframework.boot spring-boot-starter-webflux 

Ini juga akan menjadikan netty spring-boot-starter-reactor-netty sebagai pergantungan transitif ke dalam projek kami.

4. Konfigurasi Pelayan

4.1. Menggunakan Fail Properties

Sebagai pilihan pertama, kita dapat mengkonfigurasi pelayan Netty melalui fail sifat. Spring Boot mendedahkan beberapa konfigurasi pelayan biasa dalam fail sifat aplikasi :

Mari tentukan port pelayan di application.properties :

server.port=8088

Atau kita boleh melakukan perkara yang sama dalam application.yml :

server: port: 8088

Selain port pelayan, Spring Boot mempunyai banyak pilihan konfigurasi pelayan lain yang tersedia. Sifat yang bermula dengan awalan pelayan membolehkan kita mengatasi konfigurasi pelayan lalai . Kita boleh dengan mudah mencari sifat-sifat ini dalam dokumentasi Spring di bawah SERVER KONFIGURASI TERBENAM seksyen .

4.2. Menggunakan Konfigurasi Terprogram

Sekarang, mari kita lihat bagaimana kita dapat mengkonfigurasi pelayan Netty yang tertanam melalui kod . Bagi tujuan ini, Spring Boot memberikan kita WebServerFactoryCustomizer dan NettyServerCustomizer kelas.

Mari gunakan kelas ini untuk mengkonfigurasi port Netty seperti yang kita lakukan sebelumnya dengan fail sifat kita:

@Component public class NettyWebServerFactoryPortCustomizer implements WebServerFactoryCustomizer { @Override public void customize(NettyReactiveWebServerFactory serverFactory) { serverFactory.setPort(8088); } }

Spring Boot akan mengambil komponen penyesuai kilang kami semasa permulaan dan akan mengkonfigurasi port pelayan.

Sebagai alternatif, kami dapat melaksanakan NettyServerCustomizer :

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); } }

Dan tambahkan ke kilang pelayan:

serverFactory.addServerCustomizers(new PortCustomizer(8088));

Kedua-dua pendekatan ini memberi kami banyak kelonggaran ketika mengkonfigurasi pelayan Reactor Netty yang disematkan.

Selain itu, kami juga dapat mengakses kelas ServerBootstrap dari kerangka Netty dan membuat penyesuaian kami di sana:

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))); } }

Walau bagaimanapun, terdapat peringatan untuk kes ini. Oleh kerana Spring Boot secara automatik mengkonfigurasi pelayan Netty, kami mungkin perlu melangkau konfigurasi automatik dengan menentukan secara jelas kacang NettyReactiveWebServerFactory kami .

Untuk tujuan ini, kita harus menentukan kacang kita dalam kelas konfigurasi dan menambahkan penyesuai kita di sana:

@Bean public NettyReactiveWebServerFactory nettyReactiveWebServerFactory() { NettyReactiveWebServerFactory webServerFactory = new NettyReactiveWebServerFactory(); webServerFactory.addServerCustomizers(new EventLoopNettyCustomizer()); return webServerFactory; }

Seterusnya, kami akan meneruskan beberapa senario konfigurasi Netty yang biasa.

5. Konfigurasi SSL

Mari lihat bagaimana kita dapat mengkonfigurasi SSL.

Kami akan menggunakan kelas SslServerCustomizer yang merupakan pelaksanaan lain dari NettyServerCustomizer :

@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"); Http2 http2 = new Http2(); http2.setEnabled(false); serverFactory.addServerCustomizers(new SslServerCustomizer(ssl, http2, null)); serverFactory.setPort(8443); } }

Di sini kami telah menentukan sifat-sifat yang berkaitan dengan kedai kunci kami, melumpuhkan HTTP / 2, dan menetapkan port ke 8443.

6. Konfigurasi Log Akses

Sekarang, kita akan melihat bagaimana kita dapat mengkonfigurasi pembalakan akses menggunakan Logback.

Spring Boot membolehkan kita mengkonfigurasi akses masuk dalam fail sifat aplikasi untuk Tomcat, Jetty, dan Undertow. Walau bagaimanapun, Netty belum mempunyai sokongan ini.

Untuk membolehkan log masuk akses Netty, kita harus menetapkan -Dreactor.netty.http.server.accessLogEnabled = true semasa menjalankan aplikasi kita:

mvn spring-boot:run -Dreactor.netty.http.server.accessLogEnabled=true

7. Kesimpulannya

Dalam artikel ini, kami telah membahas cara mengkonfigurasi pelayan Reactor Netty dalam aplikasi Spring Boot.

Pertama, kami menggunakan keupayaan konfigurasi berasaskan sifat Spring Boot umum. Dan kemudian, kami meneroka cara mengkonfigurasi Netty secara terprogram secara terperinci.

Akhirnya, kod sumber untuk artikel ini terdapat di Github.