DMicro
Ideas de diseño del marco de desarrollo de microservicios Go
DMicro
Dirección de la fuente:
- casa rural:
- dmicro: dmicro es un marco de microservicios eficiente, escalable y fácil de usar. Incluyendo drpc, dserver, etc.
antecedentes
DMicro
El trasfondo del nacimiento es porque he escrito PHP durante los últimos 10 años y quiero promoverlo Go
dentro de la empresa.. Los componentes y protocolos rpc dentro de la empresa se swoole
desarrollan en base a la personalización. He investigado varios marcos en el mercado, incluidos beego
, goframe
, gin
, , go-micro
, go-zero
, erpc
etc. Puede ser que mis capacidades técnicas fueran limitadas en ese momento y estos marcos no pudieran adaptarse bien a nuestro negocio.
Hubo varios puntos débiles en el desarrollo de nuestro negocio, y golang
en ese momento no se podía encontrar un conjunto completo de soluciones en el ecosistema.
- Las aplicaciones de microservicio y las aplicaciones monolíticas se desarrollan al mismo tiempo.
- Comunicación de red de alto rendimiento y alta disponibilidad.
- Requiere un protocolo de capa de aplicación personalizado (énfasis).
- Se requiere un mecanismo de extensión de complemento flexible para facilitar la adaptación a los sistemas existentes (clave).
- Los conceptos de servidor y cliente son vagos y ambos pueden usar la misma API para llamarse entre sí.
- Los mensajes push son compatibles.
- Gestión de conexión/sesión.
- Desarrollo eficiente, generación de código de soporte a través de proto.
- Soporta múltiples protocolos de red,
tcp
,websocket
,quic
,unixsocket
. - Compatible con el protocolo http.
- Capaz de localizar problemas más rápidamente.
- Más fácil de agregar nuevas características.
Después de hacer una investigación simple sobre los marcos de código abierto de uso común, descubrí que no hay un marco adecuado que pueda satisfacer todas mis necesidades. Después de una cuidadosa consideración, descubrí que la combinación de erpc
los goframe
dos marcos puede satisfacer mis necesidades, por lo que nació la autoinvestigación DMicro
.
Visión general
DMicro
La idea de un drpc
componente en es una erpc
implementación de referencia, o incluso su sucesor.
drpc
Los componentes son DMicro
parte del marco. Para adaptarse al DMicro
marco, erpc
se ha realizado un desarrollo de extensión en profundidad sobre la base de .
Todo el componente en DMicro
uso goframe
, si la empresa usa el goframe
marco, se puede conectar sin problemas.
DRpc
Lista de características:
对等通信
,对等Api
高性能
,非阻塞异步IO
自定义Proto
,,兼容http协议
,自定义Codec
Hook点
,插件系统
,Push消息
,session管理
,Socket抽象
,断线重连
,过载保护
,负载均衡
,心跳机制
,平滑重启
...
DServer
Lista de características:
快速构建
,平滑重启
,多进程支持
,单/多进程一致
预定义命令行
,ctrl命令管理服务
可观测
,可控制
,应用沙盒
DMicro
Componentes ya integrados:
- [x]
Registry
Registro del servicio - [x]
Selector
Descubrimiento de servicios - [x]
Eventbus
autobús de eventos - [x]
Supervisor
Gestión de procesos - [ ]
Code gen
Generación de código - [ ]
Tracing
seguimiento de enlaces - [ ]
Metrics
Alarma estadística - [ ]
Broker
Fusible limitador de corriente - [ ]
OpenAPI
La documentación se genera automáticamente
Arquitectura
concepto de diseño
El diseño del DMicro
marco es la búsqueda de flexibilidad y adaptabilidad desde el principio del diseño. Bajo la premisa de asegurar la estabilidad de los microservicios, se persigue la eficiencia de desarrollo del proyecto.
- El diseño orientado a la interfaz garantiza la estabilidad del código y proporciona una personalización flexible.
- Abstraer la interfaz de cada componente, alta cohesión, bajo acoplamiento.
- El diseño en capas, la encapsulación de arriba a abajo, favorece la estabilidad y el mantenimiento.
- Alto rendimiento, alta disponibilidad y bajo consumo.
- Amigable con el desarrollo, complejidad del paquete.
- Proporcione componentes y funciones enriquecidos, lo que permite a los desarrolladores centrarse en el negocio.
Innumerables DMicro
días y noches de escritura, tengo presente los tres principios del desarrollo:
Clarity(清晰)
Simplicity(简单)
Productivity(生产力)
Ya sea que esté trabajando o realizando proyectos de código abierto, debe mantener estos tres principios y desarrollar buenos hábitos.
diseño orientado a la interfaz
DMicro
Siguiendo el principio de que todo es una interfaz, proporciona una extensibilidad incomparable del marco.
La siguiente figura muestra el flujo de envío de mensajes.Se puede ver que todos los puntos de función se abstraen en interfaces, y cada punto de función proporciona diferentes implementaciones.
Sesión Sesión
La mayoría de Rpc
los marcos no enfatizan session
el concepto de sesión ( ), porque sus escenarios de aplicación no necesitan usar sesión ( session
). Entonces, drpc
¿por qué necesita abstraer sesión ( session
)?
Endpoint
FusiónClient
yServer
necesidad de proporcionar lo mismoApi
.服务端
客户端
Necesidad de enviar mensajes activamente y obtener la respuesta del cliente.服务端
Soporte para多个客户端
enviar mensajes en lotes.- Sesión
一个
o desconexión activa asíncrona .多个
- Obtenga la capa inferior de la sesión
文件描述符
y realice ajustes de rendimiento en ella. - especial
数据/属性
_
Session
Abstraer la drpc
sesión de todo el marco , fusionar, Socket
juntos . Los desarrolladores solo necesitan operar en .Message
Context
session
- Obtener información de conexión
- Controlar la vida útil de la conexión (tiempo de espera)
- Controle el ciclo de vida (tiempo de espera) de una sola solicitud
- recibir mensaje
- Enviar un mensaje
- Crear el contexto del mensaje.
- Información sobre la sesión enlazada (como la información del usuario)
- Reconectar después de la desconexión
- Desconecte activamente la sesión.
- Examen de salud
- Obtener evento de cierre de conexión
- establecer una identificación separada para la sesión
Session
La interfaz se puede subdividir en 4 interface{}
, respectivamente EarlySession
, BaseSession
, CtxSession
, Session
. Correspondientes a los diferentes atributos de las diferentes sesiones de la etapa de vida de la aplicación ( Session
).
EarlySession
Indica la etapa donde se acaba de generar la sesión y no se ha iniciado la gorutina para leer los datos.BaseSession
Solo existe el método más básico, que se usa para los parámetros del complemento al cerrar la conexión.CtxSession
El objeto de sesión pasado en el contexto del controlador.Session
Un objeto de sesión con todas las funciones.
En circunstancias normales, los desarrolladores usan estas dos interfaces Session
y CtxSession
las otras dos interfaces se usan en complementos.
información Message
Un mensaje Message
contiene un encabezado de mensaje Header
, un cuerpo de mensaje Body
y es la entidad que se comunica entre el cliente y el servidor.
Message interface{}
Operaciones abstractas sobre entidades comunicantes.
Size
longitud del mensajeTransfer-Filter-Pipeline
Tubería de filtrado y procesamiento de paquetes de datosSeq
número de serieMType
Tipo de mensajeServiceMethod
identificador de recursosMeta
metadatos del mensajeBodyCodec
Formato de codificación del cuerpo del mensajeBody
Cuerpo del mensaje
Protocolo de protocolo
El protocolo es 消息Message
la serialización y deserialización de objetos, y el marco proporciona la Proto
interfaz. Solo al implementar esta interfaz, los desarrolladores pueden personalizar protocolos personalizados que satisfagan las necesidades comerciales, mejorando así la flexibilidad del marco.
La interfaz se define de la siguiente manera:
type Proto interface {
Version() (byte, string)
Pack(Message) error
Unpack(Message) error
}
Version()
Devuelve la identificación y el nombre del protocolo, que forman un número de versión único.Pack
Message
Serialice el objeto de mensaje .Unpack
Deserialice el flujo de bytes, produciendo unMessage
objeto de mensaje.
Actualmente , el marco admite Http
, Json
, Raw
, estos cinco protocolos.Protobuf
JsonRpc
RAW
El protocolo consta de lo siguiente:
Otros protocolos pueden hacer referencia al código.
códec
Como marco general, puede haber varios protocolos compatibles y tantos códecs como el cuerpo del mensaje. drpc
Utilice Codec
la interfaz para codificar y decodificar el cuerpo del mensaje.
La interfaz se define de la siguiente manera:
type Codec interface {
ID() byte
Name() string
Marshal(interface{}) ([]byte, error)
Unmarshal([]byte, interface{}) error
}
ID
Devuelve el id del códec.Name
Devuelve el nombre del códec, que es para que los desarrolladores lo identifiquen más fácilmente.Marshal
Codificar el contenido del mensajeUnmarshal
Decodificar el contenido del mensaje
Actualmente, el marco admite Form
, Json
, plain
, Protobuf
, XML
estos 5 códecs.
Enchufe de conexión
Socket
Se extiende net.Conn
y la interfaz se abstrae para facilitar la integración del marco con el protocolo de red subyacente.
Socket
La interfaz implementa algunas de Session
las funciones de la Session
interfaz, y algunos métodos llamados por la interfaz en realidad se reenvían para llamar a los métodos en la interfaz Socket
.
Tal implementación en capas permite Socket
la capacidad de integrar otros protocolos.
TCP V4
,TCP V6
Unix Socket
KCP
QUIC
Admite ajustes de rendimiento para conexiones.
SetKeepAlive
Habilitar enlace mantener vivoSetKeepAlivePeriod
enlace de intervalo de actividadSetReadBuffer
Establecer el tamaño del búfer de lectura del enlaceSetWriteBuffer
Obtener el tamaño del búfer de escritura del enlaceSetNoDelay
Activar y desactivar el algoritmo sin demoraControlFD
Manejadores sin procesar que admiten enlaces de operación
combinación orgánica
Como se mencionó anteriormente, DMicro
todo en el marco es una interfaz, y el diseño de la interfaz en capas permite DMicro
una composición flexible y la capacidad de ser eficiente y estar en línea con la situación real del negocio.
A continuación, hablaremos sobre las bases para realizar estas capacidades. sistema de complementos.
Enchufar
El sistema de complementos aporta una gran extensibilidad y flexibilidad al marco, y es un módulo del alma de todo el marco.Con él, el marco tiene infinitas posibilidades.
¿Qué tipo de sistema de complementos puede considerarse elegante? Las cosas que se me ocurren son las siguientes:
- Las ubicaciones razonables y abundantes
hook
pueden cubrir todo el ciclo de vida del marco y ejecutar todos los aspectos de la comunicación. - La entrada y salida de cada
hook
posición están cuidadosamente diseñadas. - Cada complemento puede usar múltiples
hook
ubicaciones, y cadahook
ubicación puede ser utilizada por múltiples complementos. - El diseño es bastante simple y elegante. Puede llevar a cabo fácilmente desarrollo secundario y personalización.
En drpc
China, el anzuelo recorre todo el Endpoint
ciclo de vida y es una parte indispensable e importante del mismo.
Error al volcar, volver a cargar, cancelar A través de estos 钩子 Hook
puntos, el complemento tiene posibilidades ilimitadas.
componentes
Con los complementos, puede escribir componentes con funciones completas a través de la combinación de complementos. En la actualidad, el marco proporciona algunos componentes integrados.
服务端 Rpc Server
客户端 Rpc Client
服务注册 Registry
服务发现 Selector
事件总线 EventBus
进程管理 Supervisor
Próximamente, en breve, pronto:
链路追踪 Tracing
统计告警 Metrics
限流熔断 Broker
.
Debido a limitaciones de espacio, la implementación de componentes específicos no se explicará en profundidad aquí, preste atención a los artículos de seguimiento.
perspectiva del futuro
Si lo compara DMicro
con la vida, la etapa de crecimiento aún se encuentra en la adolescencia, y solo se ha completado el diseño de la arquitectura básica y el desarrollo de algunos componentes.
La siguiente dirección es principalmente desarrollarse en la dirección de la facilidad de uso y la confiabilidad.
Facilidad de uso:
- Desarrollo de herramientas de rendimiento de proyectos
dmctl
, incluida la generación de código, la generación de estructuras de proyectos, el empaquetado, la compilación y otras funciones. - Desarrollo de componentes de documentación que se ajusten a la definición de openapi.
- Mejor documentación y ejemplos de uso.
fiabilidad:
- observabilidad
- seguimiento de enlaces
- Información del indicador
- flujo de registro
- producción disponible
- Perfección de casos de prueba
- cobertura de código
- la optimización del rendimiento
Espero DMicro
crecer y desarrollarme bajo el cuidado y aliento de todos.