Netty al final es lo que?

Hablando desde el HTTP

Con Netty, puede implementar su propio servidor HTTP, servidor FTP, servidor de UDP, servidor RPC, servidor de WebSocket, el servidor proxy de Redis, un servidor Proxy de MySQL, y así sucesivamente.

Recordamos los principios de servidor HTTP tradicional

1, crear un ServerSocket, y se unen a un puerto de escucha

2, una serie de cliente solicita a este puerto

3, el servidor utiliza el Aceptar, Socket objeto de conexión se obtiene de un cliente

4, iniciar un nuevo hilo para manejar las conexiones

4.1, el zócalo de lectura, el flujo de bytes para dar

4.2, la decodificación de protocolo, para dar la solicitud de objeto Http

4,3, el procesamiento de Http solicitud para obtener un resultado, encapsulado en un HttpResponse

4.4, la codificación de protocolo, la secuencia resultante de la corriente de bytes de escritura Socket, el flujo de bytes para el cliente

5, Etapa 3 continúa bucle

servidor HTTP se denomina servidor HTTP, ya que el protocolo es el protocolo HTTP codec, si el acuerdo es el protocolo Redis, luego se convirtió en un servidor Redis, si el acuerdo es WebSocket, luego se convirtió en un servidor de WebSocket, y así sucesivamente. Netty se puede utilizar una costumbre códec protocolos para lograr su protocolo de servidor específico.

NIO

Lo anterior es un servidor de proceso tradicional de http, pero en un entorno altamente concurrente, el número de hilos será más, carga del sistema será mayor, por lo que hay NIO.

Él no es un concepto único en Java, un representante del vocabulario gritó NIO IO multiplexación. Es un sistema proporcionado por las llamadas del sistema operativo, a principios de este nombre de la llamada al sistema operativo es seleccionar, pero los malos resultados, a continuación, se convirtió progresivamente en epoll y kqueue Mac Lane, bajo Linux. Generalmente decimos que son epoll, porque nadie tomó Apple para utilizar servicios externos como un servidor. Netty marco y se basa en un conjunto de envase de la técnica de Java NIO. ¿Por qué paquete, ya que el nativo de Java NIO no es tan fácil de usar, sino también el famoso fallo, después de que el paquete proporciona un Netty patrones e interfaces fáciles de usar, los usuarios utilizarán más conveniente.

Dijo Hablemos de antes NIO BIO (bloqueo IO), la manera de entender este bloqueo es?

Cuando se bloquea la escucha del cliente (Escuchar), Aceptar, las únicas nuevas conexiones, aceptan volverá al hilo principal para continuar

Lea y toma de escritura, lectura está bloqueado, sólo el mensaje de solicitud, de lectura para volver, el hilo hijo para continuar el procesamiento

Lea y toma de escritura, escritura está bloqueado, sólo el cliente recibió la noticia, Escribir al volver, el hilo hijo para continuar la lectura de la siguiente solicitud

BIO bajo el modelo tradicional, todos los hilos se bloquean de principio a fin, estos hilos esperando en seco, ocupa recursos del sistema, sin hacer nada.

Entonces, ¿cómo no bloqueante NIO es él. Se utiliza el mecanismo de eventos. Se puede utilizar para enhebrar la acepta, leer y operaciones de escritura, el conjunto solicitud de procesamiento lógica seco. Si no tiene que hacer nada, no va a ser un bucle infinito, que será el hilo a dormir hasta el próximo evento para continuar el trabajo, tal hilo llamado hilo NIO. Expresado en pseudo-código:

while true {
 events = takeEvents(fds) // 获取事件,如果没有事件,线程就休眠
 for event in events { if event.isAcceptable {
 doAccept() // 新链接来了
 } elif event.isReadable {
 request = doRead() // 读消息
 if request.isComplete() {
 doProcess()
 }
 } elif event.isWriteable {
 doWrite() // 写消息
 }
 }
}

modelo de hilos reactor

Reactor modelo single-roscado

NIO + un hilo aceptar un hilo:

clipboard.png

modelo roscado multi-Reactor

clipboard.png

Reactor modelo maestro-esclavo

De Reactor maestro multiproceso: medios para recibir una pluralidad de clientes conectados al grupo de subprocesos aceptor NIO

clipboard.png

configuración flexible Netty puede basarse en tres modelos descritos anteriormente.

resumen

Netty se construye sobre la base de NIO, Netty por encima de la NIO y proporciona un mayor nivel de abstracción.

En Netty interior, acepte conectado a una piscina hilo separado puede ser utilizado para operaciones de lectura de proceso y de escritura es otro grupo de subprocesos de manejar.

Aceptar y operaciones de escritura están conectados con un grupo de subprocesos se puede utilizar para el procesamiento. Y lógica de procesamiento de solicitud puede ser utilizada para procesar un solo grupo de subprocesos se puede tratar con un hilo de rosca para el lector. Cada hilo en el grupo de subprocesos es hilo NIO. Los usuarios pueden ser ensambladas de acuerdo a la situación real, modelo de concurrencia configurado para satisfacer las necesidades de alto rendimiento del sistema.

¿Por Netty

Si no lo hace Netty, utilizando el JDK nativa, a continuación, las siguientes preguntas:

1, complejo API

2, multi-hilo muy familiar: porque el modo NIO implica Reactor

3, si la alta disponibilidad: Outlet requiere la reconexión desconexión, media un lector de paquete, los problemas tales como fallo de la memoria caché

4, error de JDK NIO

Y Netty, sus API simple, de alto rendimiento y de la comunidad activistas (dubbo, rocketmq a fin de utilizarlo)

¿Qué es el paquete de palo de TCP / desembalaje

fenómeno

Vistazo a los siguientes datos de código, Netty este código se utiliza repitió 100 veces para escribir datos al servidor en el terminal del cliente, ByteBuf Netty el contenedor es un byte, se almacena dentro de la necesidad de enviar

public class FirstClientHandler extends ChannelInboundHandlerAdapter { 
 @Override 
 public void channelActive(ChannelHandlerContext ctx) { 
 for (int i = 0; i < 1000; i++) { 
 ByteBuf buffer = getByteBuf(ctx); 
 ctx.channel().writeAndFlush(buffer); 
 } 
 } 
 private ByteBuf getByteBuf(ChannelHandlerContext ctx) { 
 byte[] bytes = "需要更多资料加群:586446657".getBytes(Charset.forName("utf-8")); 
 ByteBuf buffer = ctx.alloc().buffer(); 
 buffer.writeBytes(bytes); 
 return buffer; 
 }
}

Leer de los datos en el lado del cliente:

clipboard.png

Como puede verse a partir de la salida de la consola del servidor, hay tres tipos de salida

Uno de ellos es la cadena de salida normal.

Se trata de una pluralidad de cuerdas "stick" juntos, que definimos como paquete de palo de ByteBuf.

Una de ellas es una cadena de caracteres es "dividir" aparte, formando una bolsa rota, definimos este medio paquete ByteBuf.

Analizar las causas a través del fenómeno

El nivel de aplicación utilizando Netty, pero para el sistema operativo, sólo reconocen el protocolo TCP, a pesar de nuestra capa de aplicación de acuerdo con ByteBuf como una unidad para enviar datos, servidor de lectura de acuerdo con Bytebuf, sino al sistema operativo subyacente es enviada en el flujo de bytes de datos, por lo que los datos en el servidor, de acuerdo con el byte de modo que se lee en la corriente, y después a nivel de aplicación Netty, re-ensambla en ByteBuf, y aquí ByteBuf cliente ByteBuf puede transmitirse secuencialmente desigual. Por lo tanto, necesitamos protocolos personalizados según el cliente para montar nuestro paquete de datos de capa de aplicación, el servidor de montar el paquete de datos de protocolo de acuerdo con nuestra capa de aplicación, este proceso se denomina generalmente descomprimirlo en el servidor, en el cliente extremo llamado paquete de palo.

Desembalaje y paquete de palo son opuestas, el extremo cohesivo del paquete, es necesario pegar el otro extremo a través del paquete abierto, el lado de la transmisión de paquetes de datos se pegan tres en dos paquetes TCP enviados al extremo receptor, la necesidad extremo receptor a dos paquetes de protocolo de aplicación vuelven a montar en tres paquetes.

¿Cómo resolver

En ausencia del caso de Netty, el usuario si necesitan desembalaje, el principio básico es leer constantemente los datos del buffer TCP, cada lectura necesidades acabados para determinar si se trata de un paquete de datos completo si la lectura actual no es suficiente empalmado en un paquete de datos de servicio completo, entonces la retención de datos, continúe leyendo desde el búfer TCP, hasta que un paquete completo. Si los datos de lectura actuales que se ha leído los datos, además de lo suficientemente juntos en un paquete de datos, a continuación, los datos de registro de datos que se ha leído en esta forma de lectura un paquete de datos completo servicio se transmite a la lógica de servicio, el exceso los datos se conserva todavía el fin de leer los datos y la próxima costura intento.

En Netty se ha construido, muchos tipos de desembalar el dispositivo, se utiliza directamente como:

clipboard.png

Después de seleccionar desempaquetador, en el segmento de código de cliente y el servidor se añade al final de la unpacker en chanelPipeline como:

Como ejemplos:

cliente:

ch.pipeline().addLast(new FixedLengthFrameDecoder(31));

servidor:

ch.pipeline().addLast(new FixedLengthFrameDecoder(31));

clipboard.png

Netty copia cero

tradicionalmente copiar

Cuando se envían los datos, la aplicación tradicional es:

  1. File.read(bytes)
  2. Socket.send(bytes)

Esta realización requiere cuatro datos y cuatro copias de cambio de contexto:

  1. Los datos se leen desde el disco a la memoria intermedia de lectura del núcleo
  2. Los datos se copian desde el búfer del núcleo de la memoria intermedia del usuario
  3. Copiar datos desde la memoria intermedia del usuario en el buffer del socket del núcleo
  4. Los datos se copian de la memoria intermedia de tubo para una interfaz de red de núcleo tampón (hardware)

El concepto de copia cero

Significativamente por encima de los pasos segundo y tercero, no es necesario, por el método java FileChannel.transferTo evitarse la copia adicional de los dos anteriores (por supuesto, soportado por el sistema operativo subyacente)

  1. TransferTo llamada, la copia de los datos del archivo de la memoria intermedia de lectura al motor DMA kernel
  2. Lectura DMA búfer desde el núcleo a continuación, copia los datos a la memoria intermedia de interfaz de red

Las anteriores dos operaciones no requieren intervención de la CPU, que alcanzó copia cero.

Cero copia Netty

Principalmente en tres aspectos:

1, ByteBuffer

Netty utiliza principalmente para enviar y recibir mensajes ByteBuffer, ByteBuffer utilizando la memoria externa (DirectMemory) Socket leer y escribir directamente.

Motivo: Uso de memoria de almacenamiento dinámico tradicional de lectura y escritura para el zócalo, búfer de memoria de pila de JVM será una copia directa de la memoria y luego escribe zócalo, una pluralidad de copia de la memoria búfer. DirectMemory puede ser enviada directamente a la interfaz de red DMA

2, tampones de composite

ByteBuffer tradicional, si las necesidades de datos que se combinan entre sí en dos ByteBuffer, tenemos que crear un nuevo tamaño de la matriz = + size1 tamaño 2 tamaño, entonces los datos en los dos conjuntos de copia en la nueva matriz. Pero el uso de una combinación de ByteBuf Netty a condición, tales operaciones pueden ser evitados, ya que en realidad no CompositeByteBuf combinar múltiples Buffer, pero contiene una referencia a ellos, evitando así la copia de los datos, para lograr una copia cero.

3, para uso FileChannel.transferTo

Netty utiliza en el método TransferTo FileChannel, el método se basa en el sistema operativo para realizar la copia cero.

flujo de ejecución interna Netty

servidor:

clipboard.png

clipboard.png

1. Crear ejemplos ServerBootStrap

2, set y se unen grupo de subprocesos del reactor: EventLoopGroup, EventLoop se ha registrado para manejar toda la parte superior del selector de canal de este hilo

3, ajuste el lado de servicio del canal y se unen

4, 5, y crear eventos de red mango manejador ChannelPipeline, hora de la red como una corriente en la que el flujo, la mayoría finalización manejador de la costumbre: como la certificación de seguridad SSI códec

6, fijaciones y empezar puerto de escucha

7, cuando la formación de giro para preparar el canal, por el hilo Reactor: NioEventLoop método de ejecución pipline en la programación y la ejecución final channelHandler

cliente

clipboard.png

clipboard.png

resumen

Es decir todo el conocimiento que Netty de la orden, si hay diferentes opiniones, dio la bienvenida a la discusión!

 

Más sencillamente, lo Netty hacer?

 

Como Java aprendizaje, si no se ha estudiado Netty, a continuación, utilizar y entender del lenguaje Java no es más que un nivel superficial, apuntará SSH, escribir unas pocas MVC, acceso a base de datos y almacenamiento en caché, estos son los programadores de Java simplemente hacer las cosas elementales . Si quieres avanzada, de alto orden quiere saber el profundo conocimiento de servidor Java, Netty es sin duda una necesidad de cruzar el umbral.

Con Netty, puede implementar su propio servidor HTTP, servidor FTP, servidor de UDP, servidor RPC, servidor de WebSocket, el servidor proxy de Redis, un servidor Proxy de MySQL, y así sucesivamente.

Si desea saber cómo escribir cabo Nginx es, si usted quiere saber cómo se logra Tomcat y el embarcadero, si también desea implementar un simple servidor Redis, que debe ser una buena comprensión de lo Netty, sus principios de funcionamiento son similares a.

Recordamos los principios de servidor HTTP tradicional

  1. Crear un ServerSocket, y enlazar un puerto de escucha
  2. Una serie de cliente solicita a este puerto
  3. Los usos de servidor Acepte, Socket objeto de conexión se obtiene de un cliente
  4. Iniciar un nuevo hilo para conexiones mango
    1. Leer zócalo, de bytes para dar
    2. Decodificación de protocolos, para dar la solicitud de objeto Http
    3. proceso de petición HTTP, para obtener un resultado, encapsulado en un HttpResponse
    4. Codificación de protocolo, de bytes serializado resultará
    5. Escritura de socket, una corriente de bytes que el cliente
  5. Paso 3 continúa el ciclo

servidor HTTP se denomina HTTP del servidor, ya que el protocolo es el protocolo HTTP codec, si el acuerdo es el protocolo Redis, luego se convirtió en un servidor Redis, si el acuerdo es WebSocket, luego se convirtió en un servidor de WebSocket, y así sucesivamente.

Netty se puede utilizar una costumbre códec protocolos para lograr su protocolo de servidor específico.

Hemos dicho anteriormente es un servidor tradicional multi-roscado, el Apache está procesando el modo de solicitud. En un entorno altamente concurrente, el número de hilos puede crear demasiado de la presión de la programación de tareas del sistema operativo, la carga del sistema será mayor. ¿Cómo hacerlo?

Así nació el NIO, Java NIO no es concepto único, una palabra en nombre de NIO llorado IO multiplexación. Es un sistema proporcionado por las llamadas del sistema operativo, a principios de este nombre de la llamada al sistema operativo es seleccionar, pero los malos resultados, a continuación, se convirtió progresivamente en epoll y kqueue Mac Lane, bajo Linux. Generalmente decimos que son epoll, porque nadie tomó Apple para utilizar servicios externos como un servidor. Netty marco y se basa en un conjunto de envase de la técnica de Java NIO. ¿Por qué paquete, ya que el nativo de Java NIO no es tan fácil de usar, sino también el famoso fallo, después de que el paquete proporciona un Netty patrones e interfaces fáciles de usar, los usuarios utilizarán más conveniente.

Eso NIO ¿Qué es exactamente?

NIO destaca NoneBlocking IO, sin bloqueo IO, la diferencia entre BIO, BIO significa bloqueo IO, el bloqueo de IO. Y que esta obstrucción es lo que quiere decir eso?

  1. Acepta está bloqueado, las únicas nuevas conexiones, aceptar volverá al hilo principal para continuar
  2. Read está bloqueado, sólo el mensaje de solicitud, para volver lectura, el hilo hijo a continuar procesando
  3. Escritura está bloqueado, sólo el cliente recibió la noticia, escribir a volver, el hilo hijo para continuar la lectura de la siguiente solicitud

Por lo tanto, el servidor tradicional multi-roscado es el modo BlockingIO, de principio a fin todas las discusiones están bloqueadas. Estos y otro hilo seco, donde los recursos de ocupación de programación del sistema operativo, se desperdicia sin hacer nada.

Entonces, ¿cómo no bloqueante NIO es él. Se utiliza el mecanismo de eventos. Se puede utilizar para enhebrar la acepta, leer y operaciones de escritura, el conjunto solicitud de procesamiento lógica seco. Si no tiene que hacer nada, no va a ser un bucle infinito, que será el hilo a dormir hasta el próximo evento para continuar el trabajo, tal hilo llamado hilo NIO.

while true {
    events = takeEvents(fds)  // 获取事件,如果没有事件,线程就休眠
    for event in events {
        if event.isAcceptable {
            doAccept() // 新链接来了
        } elif event.isReadable {
            request = doRead() // 读消息
            if request.isComplete() {
                doProcess()
            }
        } elif event.isWriteable {
            doWrite()  // 写消息
        }
    }
}

NIO proceso general es el proceso descrito anteriormente pseudo-código, hay muchas diferencias reales con el código real, pero para los principiantes, este entendimiento es suficiente.

Netty se construye sobre la base de NIO, Netty por encima de la NIO y proporciona un mayor nivel de abstracción.

En Netty interior, acepte conectado a una piscina hilo separado puede ser utilizado para operaciones de lectura de proceso y de escritura es otro grupo de subprocesos de manejar.

Aceptar y operaciones de escritura están conectados con un grupo de subprocesos se puede utilizar para el procesamiento. Y lógica de procesamiento de solicitud puede ser utilizada para procesar un solo grupo de subprocesos se puede tratar con un hilo de rosca para el lector. Cada hilo en el grupo de subprocesos es hilo NIO. Los usuarios pueden ser ensambladas de acuerdo a la situación real, se reúnen los requisitos del sistema modelo de concurrencia configurados.

Netty proporciona códec integrado común, el codec incluye una fila [a línea de petición], [longitud de bytes de la primera N bytes definen solicitud] codec longitud de prefijo puede reproducir el descodificador [medio paquete de mensaje grabado Estado], HTTP codec, WebSocket codec mensaje, etc.

Netty proporciona una interfaz de devolución de llamada serie del ciclo de vida cuando una solicitud completa llega, cuando se cierra una conexión cuando se establece una conexión, el usuario recibirá una devolución de llamada, y entonces el procesamiento de la lógica.

Netty puede gestionar varios puertos, puede utilizar modelo cliente NIO, para estos servicios RPC son necesarios.

Además Netty puede manejar Socket TCP, UDP también puede manejar zócalo.

En el mensaje de la lectura y el proceso de escritura, requiere una gran cantidad de uso ByteBuffer, ByteBuffer Netty de rendimiento y facilidad de uso son optimizados y abstracto.

En resumen, Netty es la magia esencial de los programadores avanzados de Java. Si conoces a estos, me gustaría saber por qué, debemos analizar cuidadosamente Netty. Si se siente aburrido sentido de Java, Netty es la clave para volver a abrir la puerta interés de Java.

Adjunto basa en dos proyectos de código abierto hacerlo Netty

Qian producto: un pequeño chef de pescado - Netty sí mismo para alcanzar marco RPC basado zhuanlan.zhihu.comicono

Qian producto: un pequeño chef de pescado - Netty mismo Aplicación del marco basado en Web zhuanlan.zhihu.comicono

 

 

Publicado 37 artículos originales · ganado elogios 124 · Vistas de 140.000 +

Supongo que te gusta

Origin blog.csdn.net/zam183/article/details/103885300
Recomendado
Clasificación