최근 인터넷 기술의 급속한 발전으로 인해 서버 측의 고성능, 높은 동시성 및 고가용성에 대한 요구 사항이 점점 더 높아지고 있습니다. 고성능, 비동기식 및 비차단 네트워크 통신 프레임워크인 Netty입니다. 개발자들 사이에서 점점 더 인기를 얻고 있습니다.
이 글에서는 Netty 프레임워크를 사용하여 고성능 API 서버를 구현하는 방법을 소개합니다.
1. Netty란
Netty는 클라이언트, 서버 등 고성능, 고신뢰성 네트워크 통신 프로그램을 빠르게 개발하는 데 사용되는 Java NIO 기반의 비동기 이벤트 중심 네트워크 응용 프로그램 프레임워크입니다.
핵심 구성 요소에는 버퍼, 채널, EventLoop, 코덱 등이 포함됩니다. Buffer는 Netty의 버퍼 구성 요소이고, Channel은 추상적인 네트워크 통신 인터페이스를 제공하며, EventLoop는 Netty의 이벤트 중심 모델이며, Codec은 코덱입니다. 이러한 구성 요소를 통해 Netty 프레임워크는 고성능, 높은 동시성 및 낮은 대기 시간의 네트워크 통신 기능을 제공할 수 있습니다.
2. Netty의 기본 사용
먼저 Netty 종속성을 도입해야 합니다.
<dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.42.Final</version> </dependency>
그런 다음 Bootstrap 개체를 만들고 이 개체를 사용하여 Netty 서버를 시작해야 합니다.
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(); }
위 코드에서 우리는 두 개의 EventLoopGroup 객체, 즉 클라이언트 요청을 수신하기 위한 bossGroup과 클라이언트 요청을 처리하기 위한 WorkerGroup을 생성했습니다. 통신 프로토콜(NioServerSocketChannel), 프로세서(Handler), 채널 초기화 및 기타 작업을 포함하여 ServerBootstrap 개체를 통해 Netty 서버의 매개변수를 구성합니다.
또한 위 코드에서 HTTP 요청 및 응답의 인코딩, 디코딩 및 집계를 구현하기 위해 HttpServerCodec 및 HttpObjectAggregator 구성 요소를 추가했음을 알 수 있습니다. 동시에 빅 데이터 스트림을 처리하기 위해 ChunkedWriteHandler도 추가했습니다.
마지막으로 bootstrap.bind 메소드를 통해 포트를 바인딩하고 Netty 서버를 시작하고 future.channel().closeFuture().sync() 메소드를 통해 메인 스레드를 차단하고 Netty 서버가 종료될 때까지 기다립니다. .
3. Netty를 사용하여 고성능 API 서버 구현
API 서버의 경우 일반적으로 시스템 가용성과 고성능 응답 시간을 보장하면서 많은 수의 요청과 응답을 처리해야 합니다.
여기에서는 Netty 프레임워크를 사용하여 고성능 API 서버를 구현하는 방법을 소개하기 위해 간단한 API 서버 구현을 예로 들어보겠습니다.
1. 인터페이스 정의
먼저 사용자 정보 획득 기능을 구현하는 데 사용되는 간단한 API 인터페이스를 정의하겠습니다.
GET /user/{id} HTTP/1.1 Host: localhost:8888
여기서 {id}는 사용자의 ID 번호이며 이 ID 번호를 기반으로 쿼리해야 합니다. 사용자 정보를 클라이언트에 반환합니다.
2. 비즈니스 처리
다음으로 비즈니스 로직 처리, 즉 클라이언트 요청의 ID 번호를 기반으로 사용자 정보를 쿼리하고 쿼리 결과를 클라이언트에 반환해야 합니다.
먼저 SimpleChannelInboundHandler를 상속하는 프로세서 HttpServerHandler를 만들어 보겠습니다. 이 프로세서에서 비즈니스 로직을 구현할 수 있습니다.
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); } }
위 코드에서 HttpServerRoute 개체를 통해 경로 일치를 구현하는 것을 볼 수 있습니다. 클라이언트 요청을 받으면 요청을 HttpServerRequest 개체로 변환하고 그 안에 응답 개체 HttpServerResponse를 래핑한 다음 HttpServerRoute 개체를 통해 라우팅 규칙을 일치시키고 요청을 해당 프로세서에 배포하여 처리합니다.
사용자 ID를 기반으로 사용자 정보를 쿼리하는 데 사용되는 GetUserHandler 프로세서를 구현해야 합니다.
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); } } }
위 코드에서는 요청의 ID 번호를 기반으로 사용자 정보를 쿼리하고 JSONObject String 데이터를 통해 응답을 요청하고 최종적으로 쿼리 결과를 클라이언트에 반환합니다.
사용자 정보 조회 기능을 제공하기 위해 UserService 클래스도 구현해야 합니다.
public class UserService { public static User getUserById(String id) { //查询数据库中的用户信息 } }
3. 성능 테스트
마지막으로 Netty 고성능 API 서버의 응답 시간과 QPS(동시성)를 테스트해 보겠습니다. 요청 수를 구현했습니다).
Apache ab 도구를 사용하면 여러 클라이언트 동시 요청을 시뮬레이션하고 응답 시간 및 QPS 정보에 대한 통계를 수집할 수 있습니다. 다음 명령을 사용하십시오.
ab -n 10000 -c 100 -k http://localhost:8888/user/1
매개변수 설명:
-n: 총 요청 수를 나타냅니다.
-c: 동시 요청 수를 나타냅니다.
-k: 연결 유지 연결 활성화를 나타냅니다.
테스트를 통해 우리는 응답 시간 및 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)
보시다시피, API 서버는 테스트에서 100개의 동시 요청에 대한 시뮬레이션을 효과적으로 처리할 수 있었고 평균 응답 시간은 초당 2647.65개 요청을 처리할 수 있었습니다. 37.771밀리초.
4. 요약
위의 소개와 단계를 통해 Netty를 네트워크 통신 프레임워크로 활용하는 방법과 이를 활용하여 고성능 API 서버를 개발하는 방법을 배웠습니다. Netty 프레임워크를 사용하면 서버 성능이 크게 향상되어 서버가 높은 동시성, 높은 안정성, 낮은 대기 시간 및 기타 특성을 갖게 됩니다. 동시에 Netty 프레임워크는 높은 확장성과 유연성을 갖추고 있어 모든 애플리케이션에 쉽게 통합될 수 있습니다.
Java 백엔드 개발 기술 스택의 일부로 Netty 프레임워크를 사용하는 것도 마스터해야 할 기술 중 하나입니다.
위 내용은 Java 백엔드 개발: Netty를 이용한 고성능 API 서버 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!