Rumah >pembangunan bahagian belakang >tutorial php >Pembangunan backend Java: Menggunakan Netty untuk melaksanakan pelayan API berprestasi tinggi

Pembangunan backend Java: Menggunakan Netty untuk melaksanakan pelayan API berprestasi tinggi

WBOY
WBOYasal
2023-06-17 11:04:481800semak imbas

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn