Red de conocimiento informático - Material del sitio web - Cómo construir un servidor backend basado en netty

Cómo construir un servidor backend basado en netty

Vayamos directamente a las cosas prácticas. Este es un preludio para comparar la implementación de imitadores. Puedes echarle un vistazo tú mismo primero

/xiaotutiger/miyue-music-service. /tree/master/miyue-music- service

El siguiente es un análisis de un proyecto en cuestión. Las tecnologías utilizadas son completas y vale la pena aprenderlas. Por supuesto, primero daré una breve introducción. No hablemos del código comercial.

Todo el proyecto se gestiona mediante maven y la tecnología principal es spring jedis netty disruptor. Al observar esta combinación, el rendimiento del lado del servidor debería ser muy bueno.

Este proyecto desencadenó mi infinito amor por la tecnología, jaja.

Este proyecto

actualmente es principalmente para solicitudes basadas en formato json/xml/text y también admite solicitudes estándar de teléfonos móviles. Por supuesto, algunos otros formatos se pueden personalizar o PC. solicitudes secundarias, y para diferentes URI, se cuelgan diferentes controladores detrás de ellas. Estas pueden ser algunas ideas básicas del procesamiento web, pero están separadas del contenedor web convencional o del servidor de aplicaciones.

La herramienta xml utiliza xstram para el procesamiento, dos palabras, conveniente.

La herramienta json usa jackson\No sé en qué se diferencia del famoso fastjson\gson\sf.json.

La solicitud del cliente

hereda uniformemente ClientRequestModel, se convierte uniformemente en domainMessage después de la codificación y se entrega al disruptor para su procesamiento. De hecho, qué herencia se implementa en oop <. /p>

, encapsulando pensamientos, la mayoría de ellos giran en torno a una cosa, en una palabra, cómo transformar cosas que parecen tener diferentes aristas y rincones en una misma cosa, buscando puntos en común reservando las diferencias (por ejemplo, el agua). , piedra, aire, etc., como

Si en este nivel no podemos usar una característica unificada para representarlo, primero podemos convertirlo en una molécula. ¿Cómo lograr un alto nivel de abstracción y encapsulación en el arte de la puerta?

Mire cómo este proyecto maneja las solicitudes de los clientes paso a paso. El evento message-gt; request-gt; Antes de comprenderlos, debemos estudiar el disruptor en profundidad. Es un marco muy especial. La declaración es muy impresionante. El documento chino está aquí (/dissecting-disruptor-whats-so-special/). -alfabetización, muévase aquí. Vaya aquí (/2011/06/dissecting-disruptor-whats-so-special.html)

Antes de comprender el disruptor, primero aprenda cómo se implementa el ringbuffer.

1. Las características especiales de ringbuffer:

Solo hay un puntero, no hay puntero de cola, basado en matrices, y los elementos no se eliminarán, pero se sobrescribirán, lo que hace que uso completo de líneas de caché y reducción de basura.

2. Cómo leer datos del ringbuffer:

-------------------------- - --------------2013-9-9 Suplemento------------------------------- - -------------------------

A continuación se habla principalmente de cómo manejar esta arquitectura al realizar solicitudes. De hecho, la arquitectura es. Un asunto simple. Un punto es una implementación simple y escalable. Hasta cierto punto, no se preocupa demasiado por el rendimiento.

La comunicación subyacente se basa en netty, básicamente sin cambios

Código Java

la clase pública HttpServerPipelineFactory implementa ChannelPipelineFactory {

ChannelUpstreamHandler privado channelUpstreamHandler;

public ChannelPipeline getPipeline() lanza una excepción {

// Crea una implementación de canalización predeterminada

ChannelPipeline pipeline = pipeline();

// Descomente la siguiente línea si desea HTTPS

//SSLEngine Engine = SecureChatSslContextFactory.getServerContext().createSSLEngine()

//engine.setUseClientMode(false )

//pipeline.addLast("ssl", nuevo SslHandler(motor));

pipeline.addLast("decodificador", nuevo HttpRequestDecoder());

// Descomente la siguiente línea si no desea manejar HttpChunks.

pipeline.addLast("aggregator", new HttpChunkAggregator(1048576));

pipeline. addLast("encoder", new HttpResponseEncoder());

// Elimina la siguiente línea si no deseas la compresión automática de contenido

pipeline.addLast("deflater" , new HttpContentCompressor());

//pipeline.addLast("handler", new HttpRequestHandler());

pipeline.addLast("handler", channelUpstreamHandler

p>

canalización de retorno

}

public void setChannelUpstreamHandler(ChannelUpstream)

Controlador channelUpstreamHandler) {

this.channelUpstreamHandler = channelUpstreamHandler

}

}

Configuración de resorte relacionada

Código Java

lt; bean id=".yunchao.cm.network..yunchao.cm.network.SocketAddress remoteAddress = (InetSocketAddress) e.getRemoteAddress();

modelo. setProperty(model.IP_KEY, remoteAddress.getAddress().getHostAddress());

logger.info("modelo de solicitud de usuario: {}", modelo

model.fireSelf); ();

Código Java

@Override

public DomainMessage fireSelf() {

DomainMessage em = new DomainMessage(this);

EventUtils.fireEvent(em, "alipayNotifyState");

return em

}

Está básicamente claro cuando ves; esto Ahora, cómo empaquetar la solicitud del cliente en ClientRequestModel, y todos los objetos involucrados en el procesamiento la heredarán. En toda la arquitectura

, tiene a es mejor que

a. Para algunos objetos del cliente netty, también se almacenan en ClientRequestModel. El códec también utiliza xml/json/kv para realizar la conversión entre bytes y objetos. Además

De repente pensé en la primera empresa en la que vine a trabajar a Hangzhou. En base a esto, utilicé el servlet arquitecto para actuar como servidor, porque es un servidor interno de la empresa. No es una plataforma. El formato de datos utilizado es relativamente simple, es decir, xml. Sin embargo, la biblioteca de clases externa utilizada también es procesada por xstream, pero el volumen de llamadas diarias mantenido por todo el sistema también está en el nivel de millones. utiliza httpclient. Los controladores adjuntos a diferentes solicitudes se cargan en la memoria cuando se inicia el contenedor y el resto no es brillante.