Rumah > Artikel > pembangunan bahagian belakang > Pembangunan backend Java: Menggunakan Netty untuk melaksanakan pelayan API berprestasi tinggi
Dalam beberapa tahun kebelakangan ini, dengan perkembangan pesat teknologi Internet, keperluan untuk prestasi tinggi, keselarasan tinggi dan ketersediaan tinggi pada bahagian pelayan semakin tinggi sebagai rangka kerja komunikasi rangkaian berprestasi tinggi, tak segerak dan tidak menyekat , Netty menjadi semakin popular di kalangan orang ramai perhatian dan penggunaan.
Artikel ini akan memperkenalkan cara menggunakan rangka kerja Netty untuk melaksanakan pelayan API berprestasi tinggi.
1. Apakah itu Netty
Netty ialah rangka kerja rangkaian dipacu peristiwa tak segerak berdasarkan Java NIO, digunakan untuk membangunkan program komunikasi rangkaian berprestasi tinggi dan kebolehpercayaan tinggi dengan cepat, seperti pelanggan dan bahagian pelayan.
Komponen terasnya termasuk Penampan, Saluran, EventLoop, Codec, dsb. Penampan ialah komponen penimbal Netty, Channel menyediakan antara muka komunikasi rangkaian abstrak, EventLoop ialah model dipacu peristiwa Netty dan Codec ialah codec. Melalui komponen ini, rangka kerja Netty boleh menyediakan keupayaan komunikasi rangkaian berprestasi tinggi, berkonkurensi tinggi dan kependaman rendah.
2. Penggunaan asas Netty
Pertama, kita perlu memperkenalkan kebergantungan Netty:
<dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.42.Final</version> </dependency>
Kemudian, kita perlu mencipta objek Bootstrap untuk memulakan pelayan Netty kami :
EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try{ ServerBootstrap bootstrap = new ServerBootstrap(); bootstrap.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); pipeline.addLast(new HttpServerCodec()); pipeline.addLast(new HttpObjectAggregator(65536)); pipeline.addLast(new ChunkedWriteHandler()); pipeline.addLast(new HttpServerHandler()); } }); ChannelFuture future = bootstrap.bind(port).sync(); future.channel().closeFuture().sync(); }finally{ bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); }
Dalam kod di atas, kami mencipta dua objek EventLoopGroup, bossGroup untuk menerima permintaan pelanggan dan workerGroup untuk memproses permintaan pelanggan. Konfigurasikan parameter pelayan Netty melalui objek ServerBootstrap, termasuk protokol komunikasi (NioServerSocketChannel), pemproses (Handler), dan permulaan Saluran dan operasi lain.
Kami juga dapat melihat bahawa dalam kod di atas, kami menambah komponen HttpServerCodec dan HttpObjectAggregator untuk melaksanakan pengekodan, penyahkodan dan pengagregatan permintaan dan respons HTTP. Pada masa yang sama, kami juga menambah ChunkedWriteHandler untuk melaksanakan pemprosesan aliran data besar.
Akhir sekali, kami mengikat port dan memulakan pelayan Netty melalui kaedah bootstrap.bind, dan menyekat utas utama dan menunggu pelayan Netty ditutup melalui future.channel().closeFuture(). kaedah penyegerakan().
3. Gunakan Netty untuk melaksanakan pelayan API berprestasi tinggi
Untuk pelayan API, biasanya kami perlu mengendalikan sejumlah besar permintaan dan respons sambil memastikan ketersediaan sistem dan masa tindak balas berprestasi tinggi .
Di sini, kami mengambil pelaksanaan pelayan API ringkas sebagai contoh untuk memperkenalkan cara menggunakan rangka kerja Netty untuk melaksanakan pelayan API berprestasi tinggi.
1. Definisi antara muka
Mari kita tentukan antara muka API yang mudah, yang digunakan untuk melaksanakan fungsi mendapatkan maklumat pengguna:
GET /user/{id} HTTP/1.1 Host: localhost:8888
di mana {id} adalah pengguna Nombor ID, kita perlu menanyakan maklumat pengguna berdasarkan nombor ID ini dan mengembalikannya kepada pelanggan.
2. Pemprosesan perniagaan
Seterusnya, kami perlu melaksanakan pemprosesan logik perniagaan, iaitu, bertanya maklumat pengguna berdasarkan nombor ID dalam permintaan pelanggan, dan mengembalikan hasil pertanyaan kepada pelanggan .
Pertama, mari kita cipta pemproses HttpServerHandler, yang mewarisi daripada SimpleChannelInboundHandler Kami boleh melaksanakan logik perniagaan kami dalam pemproses ini.
public class HttpServerHandler extends SimpleChannelInboundHandler<FullHttpRequest> { @Override protected void channelRead0(ChannelHandlerContext ctx, FullHttpRequest msg) throws Exception { HttpServerRoute route = HttpServerRoute.builder() .addRoute("/user/{id}", new GetUserHandler()) .build(); HttpServerRequest request = new HttpServerRequest(msg); HttpServerResponse response = new HttpServerResponse(ctx, msg); route.route(request, response); } }
Seperti yang anda lihat, dalam kod di atas, kami melaksanakan padanan laluan melalui objek HttpServerRoute. Apabila menerima permintaan pelanggan, kami akan menukar permintaan itu kepada objek HttpServerRequest, membungkus objek respons HttpServerResponse di dalamnya, dan kemudian menggunakan objek HttpServerRoute untuk memadankan peraturan penghalaan dan mengedarkan permintaan kepada pemproses yang sepadan untuk diproses.
Kami perlu melaksanakan pemproses GetUserHandler, yang digunakan untuk menanyakan maklumat pengguna berdasarkan ID pengguna:
public class GetUserHandler implements HttpServerHandlerInterface { @Override public void handle(HttpServerRequest request, HttpServerResponse response) throws Exception { String id = request.getPathParam("id"); //查询用户信息 User user = UserService.getUserById(id); if (user != null) { JSONObject json = new JSONObject(); json.put("id", user.getId()); json.put("name", user.getName()); response.sendJSON(HttpResponseStatus.OK, json.toJSONString()); } else { response.sendError(HttpResponseStatus.NOT_FOUND); } } }
Dalam kod di atas, kami akan menanyakan maklumat pengguna berdasarkan nombor ID dalam request, dan Gunakan JSONObject untuk membina data rentetan JSON bagi respons permintaan, dan akhirnya mengembalikan hasil pertanyaan kepada klien.
Kami juga perlu melaksanakan kelas UserService untuk menyediakan fungsi menanyakan maklumat pengguna:
public class UserService { public static User getUserById(String id) { //查询数据库中的用户信息 } }
3 Ujian prestasi
Akhir sekali, mari kita uji prestasi tinggi Netty we. melaksanakan masa tindak balas pelayan API dan QPS (bilangan permintaan serentak sesaat).
Dengan alat Apache ab, kami boleh mensimulasikan berbilang permintaan serentak pelanggan dan mengumpul statistik tentang masa tindak balas dan maklumat QPS. Gunakan arahan berikut:
ab -n 10000 -c 100 -k http://localhost:8888/user/1
Perihalan parameter:
-n: mewakili jumlah bilangan permintaan
-c: mewakili bilangan permintaan serentak
-k: mewakili Dayakan sambungan Keep-alive
Melalui ujian, kami boleh mendapatkan masa tindak balas dan maklumat QPS:
Server Software: Server Hostname: localhost Server Port: 8888 Document Path: /user/1 Document Length: 36 bytes Concurrency Level: 100 Time taken for tests: 3.777 seconds Complete requests: 10000 Failed requests: 0 Keep-Alive requests: 10000 Total transferred: 1460000 bytes HTML transferred: 360000 bytes Requests per second: 2647.65 [#/sec] (mean) Time per request: 37.771 [ms] (mean) Time per request: 0.378 [ms] (mean, across all concurrent requests) Transfer rate: 377.12 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 2 1.2 2 10 Processing: 3 32 11.3 32 84 Waiting: 3 32 11.3 32 84 Total: 6 34 11.2 34 86 Percentage of the requests served within a certain time (ms) 50% 34 66% 38 75% 40 80% 42 90% 49 95% 55 98% 64 99% 71 100% 86 (longest request)
Seperti yang anda lihat, pelayan API kami boleh mengendalikan 100 serentak dengan berkesan permintaan daripada ujian Simulasi boleh mengendalikan 2647.65 permintaan sesaat, dan purata masa tindak balas hanya 37.771 milisaat.
4. Ringkasan
Melalui pengenalan dan langkah di atas, kami telah mempelajari cara menggunakan Netty sebagai rangka kerja komunikasi rangkaian dan menggunakannya untuk membangunkan pelayan API berprestasi tinggi. Menggunakan rangka kerja Netty boleh meningkatkan prestasi pelayan dengan sangat baik, menjadikan pelayan kami mempunyai konkurensi yang tinggi, kebolehpercayaan yang tinggi, kependaman rendah dan ciri-ciri lain. Pada masa yang sama, rangka kerja Netty juga mempunyai skalabiliti dan fleksibiliti yang tinggi dan boleh disepadukan dengan mudah ke dalam sebarang aplikasi.
Sebagai sebahagian daripada susunan teknologi pembangunan back-end Java, menggunakan rangka kerja Netty juga merupakan salah satu kemahiran yang mesti dikuasai.
Atas ialah kandungan terperinci Pembangunan backend Java: Menggunakan Netty untuk melaksanakan pelayan API berprestasi tinggi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!