Pembangunan backend Java: Gunakan Netty untuk membina pelayan API konkurensi tinggi

王林
Lepaskan: 2023-06-17 10:24:02
asal
1730 orang telah melayarinya

Dengan pembangunan berterusan Internet dan pengembangan bidang aplikasi yang berterusan, konkurensi tinggi telah menjadi isu yang mesti dipertimbangkan dalam pembangunan aplikasi rangkaian Sebagai bahasa yang digunakan secara meluas dalam pembangunan aplikasi peringkat perusahaan, Java digunakan dalam tahap tinggi -Senario aplikasi concurrency Prestasi berikut menarik perhatian. Netty ialah rangka kerja rangkaian berprestasi tinggi yang dipacu peristiwa tak segerak yang telah digunakan secara meluas dalam bidang pembangunan back-end Java dalam beberapa tahun kebelakangan ini. Artikel ini akan memperkenalkan konsep asas dan penggunaan Netty, dan mengambil membina pelayan API serentak tinggi sebagai contoh untuk menunjukkan aplikasi Netty dalam projek sebenar.

1. Pengenalan kepada Netty

Netty ialah rangka kerja NIO berprestasi tinggi dan tak segerak yang disediakan oleh JBOSS. Ia mempunyai kelebihan prestasi tinggi, berskala, fleksibiliti, dan operasi yang mudah, dan digunakan secara meluas dalam pelbagai bidang, terutamanya dalam membina pelayan rangkaian berprestasi tinggi. Komponen teras Netty ialah Channel, EventLoop, ChannelFuture, dsb., di mana Saluran mewakili aliran data dwiarah, EventLoop bertanggungjawab untuk memproses peristiwa dalam aliran data (seperti sambungan, operasi baca dan tulis, dll.), dan ChannelFuture mewakili hasil operasi tak segerak.

Keseluruhan rangka kerja Netty adalah berdasarkan mod Reaktor, iaitu, apabila peristiwa berlaku pada Saluran, ia akan dimasukkan ke dalam EventLoop untuk pemprosesan tak segerak, dan kemudian dikembalikan kepada aplikasi selepas pemprosesan selesai. Pendekatan ini membolehkan Netty menyokong sejumlah besar permintaan serentak dan mengekalkan kelajuan tindak balas yang baik.

2. Aplikasi Netty

  1. Pelayan TCP

Dalam Netty, anda boleh membina pelayan TCP mudah melalui langkah berikut:

1) Buat contoh ServerBootstrap dan tetapkan parameter yang berkaitan, seperti port pendengaran, saiz kumpulan benang, dll.;

2) Ikat port dan mulakan perkhidmatan Pada masa ini, Saluran baharu akan dibuat dan Daftarkannya dalam EventLoop yang sepadan;

3) Tambahkan objek ChannelInitializer pada Saluran yang baru dibuat, yang bertanggungjawab untuk memproses logik pemprosesan peristiwa dalam Saluran.

Kod sampel adalah seperti berikut:

EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
    ServerBootstrap serverBootstrap = new ServerBootstrap();
    serverBootstrap.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 EchoServerHandler());
                       }
                   });
    ChannelFuture channelFuture = serverBootstrap.bind(port).sync();
    channelFuture.channel().closeFuture().sync();
} finally {
    workerGroup.shutdownGracefully();
    bossGroup.shutdownGracefully();
}
Salin selepas log masuk
  1. Pelayan HTTP

Dalam Netty, anda juga boleh membina pelayan dengan mudah berdasarkan protokol HTTP. Perlu diingat bahawa apabila menggunakan Netty untuk pembangunan HTTP, codec yang berkaitan perlu ditambah untuk menyokong pertukaran data dengan protokol HTTP.

Kod sampel adalah seperti berikut:

EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
    ServerBootstrap serverBootstrap = new ServerBootstrap();
    serverBootstrap.group(bossGroup, workerGroup)
                   .channel(NioServerSocketChannel.class)
                   .childHandler(new ChannelInitializer<SocketChannel>() {
                       @Override
                       public void initChannel(SocketChannel ch) throws Exception {
                           ChannelPipeline pipeline = ch.pipeline();
                           // 添加HTTP请求解码器
                           pipeline.addLast(new HttpServerCodec());
                           // 添加HTTP请求内容聚合器(主要是将HTTP消息聚合成FullHttpRequest或FullHttpResponse)
                           pipeline.addLast(new HttpObjectAggregator(64 * 1024));
                           // 添加自定义的请求处理器
                           pipeline.addLast(new HttpServerHandler());
                       }
                   });
    ChannelFuture channelFuture = serverBootstrap.bind(port).sync();
    channelFuture.channel().closeFuture().sync();
} finally {
    workerGroup.shutdownGracefully();
    bossGroup.shutdownGracefully();
}
Salin selepas log masuk
  1. Pelayan WebSocket

WebSocket ialah protokol yang melaksanakan komunikasi dupleks penuh dan boleh digunakan terus antara pelayar dan berkomunikasi antara pelayan. Dalam Netty, anda juga boleh menggunakan protokol WebSocket untuk membina pelayan Contoh kod adalah seperti berikut:

EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
    ServerBootstrap serverBootstrap = new ServerBootstrap();
    serverBootstrap.group(bossGroup, workerGroup)
                   .channel(NioServerSocketChannel.class)
                   .childHandler(new ChannelInitializer<SocketChannel>() {
                       @Override
                       public void initChannel(SocketChannel ch) throws Exception {
                           ChannelPipeline pipeline = ch.pipeline();
                           // 添加HTTP请求解码器
                           pipeline.addLast(new HttpServerCodec());
                           // 添加HTTP请求内容聚合器
                           pipeline.addLast(new HttpObjectAggregator(64 * 1024));
                           // 添加WebSocket协议处理器
                           pipeline.addLast(new WebSocketServerProtocolHandler("/websocket"));
                           // 添加自定义的请求处理器
                           pipeline.addLast(new WebSocketServerHandler());
                       }
                   });
    ChannelFuture channelFuture = serverBootstrap.bind(port).sync();
    channelFuture.channel().closeFuture().sync();
} finally {
    workerGroup.shutdownGracefully();
    bossGroup.shutdownGracefully();
}
Salin selepas log masuk

3. Ciri lanjutan Netty

Sebagai tambahan kepada senario aplikasi asas di atas, Netty. juga menyediakan banyak ciri lanjutan , contohnya:

  1. Menyokong pelbagai protokol

Netty bukan sahaja menyokong protokol biasa seperti TCP, HTTP, WebSocket, tetapi juga menyokong pembangunan dan aplikasi pelbagai protokol tersuai;

  1. Codec sokongan

Codec yang disediakan oleh Netty boleh mengekod dan menyahkod data dengan mudah dalam format yang berbeza, seperti JSON, Protobuf, dsb.;

  1. Menyokong berbilang model IO

Netty menyokong pemilihan berbilang model IO, seperti NIO, Epoll, dsb.

  1. Sokongan pelbagai kaedah penghantaran

Netty menyokong pelbagai kaedah penghantaran, seperti menyekat, tidak menyekat, sambungan panjang, sambungan pendek, dll.

4. Aplikasi Netty dalam projek sebenar

Dalam projek sebenar, Netty sering digunakan untuk membina pelayan API konkurensi tinggi untuk mengendalikan sejumlah besar permintaan HTTP. Sebagai contoh, Netty boleh digunakan untuk membina pelayan berdasarkan gaya API RESTful untuk menyokong pendaftaran pengguna, log masuk, pertanyaan dan operasi lain Kod sampel adalah seperti berikut:

EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
    ServerBootstrap serverBootstrap = new ServerBootstrap();
    serverBootstrap.group(bossGroup, workerGroup)
                   .channel(NioServerSocketChannel.class)
                   .childHandler(new ChannelInitializer<SocketChannel>() {
                       @Override
                       public void initChannel(SocketChannel ch) throws Exception {
                           ChannelPipeline pipeline = ch.pipeline();
                           // 添加HTTP请求解码器
                           pipeline.addLast(new HttpServerCodec());
                           // 添加HTTP请求内容聚合器
                           pipeline.addLast(new HttpObjectAggregator(64 * 1024));
                           // 添加自定义的请求处理器
                           pipeline.addLast(new RestfulServerHandler());
                       }
                   });
    ChannelFuture channelFuture = serverBootstrap.bind(port).sync();
    channelFuture.channel().closeFuture().sync();
} finally {
    workerGroup.shutdownGracefully();
    bossGroup.shutdownGracefully();
}
Salin selepas log masuk

Pelaksanaan pelayan RestfulAPI memerlukan. takrifan pelbagai antara muka API, yang sepadan dengan Permintaan HTTP yang sepadan:

public class UserController {
    @GET("/user/{id}")
    public String getUserById(@PathParam("id") int id) {
        // 查询数据库并返回结果
    }

    @POST("/user")
    public String createUser(@RequestBody User user) {
        // 向数据库中插入新用户并返回结果
    }

    @PUT("/user/{id}")
    public String updateUser(@PathParam("id") int id, @RequestBody User user) {
        // 更新数据库中指定用户的信息并返回结果
    }

    @DELETE("/user/{id}")
    public String deleteUser(@PathParam("id") int id) {
        // 从数据库中删除指定用户并返回结果
    }
}
Salin selepas log masuk

Antaranya, @GET, @POST, @PUT, @DELETE dan anotasi lain digunakan untuk mengenal pasti kaedah permintaan yang sepadan, dan @ Anotasi PathParam dan @RequestBody digunakan untuk mewakili parameter laluan dan kandungan badan Minta.

Melalui fleksibiliti Netty dan mekanisme dipacu peristiwa yang berkuasa, pemprosesan yang sangat cekap boleh dicapai untuk memenuhi keperluan serentak yang tinggi.

5. Ringkasan

Netty ialah rangka kerja aplikasi rangkaian yang sangat baik dalam pembangunan back-end Java. Ia mempunyai kelebihan prestasi tinggi, berskala, fleksibiliti dan operasi yang mudah untuk membina aplikasi konkurensi tinggi dengan prestasi cemerlang dalam pelayan API. Melalui pengenalan artikel ini, anda boleh memahami konsep asas dan penggunaan Netty, dan juga memahami aplikasi Netty dalam projek sebenar. Saya berharap pembaca dapat menguasai kaedah pembangunan Netty, menggunakan rangka kerja ini dalam pembangunan sebenar, dan membuat lebih banyak sumbangan kepada pembangunan aplikasi rangkaian yang berprestasi tinggi dan cekap.

Atas ialah kandungan terperinci Pembangunan backend Java: Gunakan Netty untuk membina pelayan API konkurensi tinggi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!