Lanzamiento del marco Java RPC Solon 1.3.7, que mejora el alcance de las capacidades de la interfaz en la nube

Solon es un pequeño marco de desarrollo de Java RPC. Desde que se lanzó el proyecto en 2018, se ha hecho referencia a una gran cantidad de trabajos anteriores; tomó dos años y más de 4.000 confirmaciones; el kernel mantiene una cifra de 0.1m, puntaje de ejecución súper alto y buena experiencia de usuario. Soporte: RPC, REST API, MVC y otros modos de desarrollo.

Solon enfatiza el principio de moderación + simplicidad + apertura; se esfuerza por una experiencia más pequeña, más rápida y más libre.

Los llamados más pequeños:

El kernel es de 0,1 my la unidad de desarrollo más pequeña es de 0,2 m (en comparación con los paquetes de proyectos Dubbo y Springboot, tan pequeño que puede descuidarse)

El llamado más rápido:

La prueba local de helloworld, Qps puede llegar a 120.000. Puede referirse a: " helloworld_wrk_test "

La llamada más libertad: (manipulación de código libre)

// 除了注解模式之外,还可以按需手动
//
//手动获取配置(Props 为 Properties 增强版)
Props db = Solon.cfg().getProp("db");

//手动获取容器里的Bean
UserService userService = Aop.get(UserService.class);

//手动监听http post请求
Solon.global().post("/user/update", x-> userService.updateById(x.paramMap()));

//手动添加个RPC服务
Solon.global().add("/rpc/", HelloService.class, true);

//手动获取一个RPC服务消费端
HelloService helloService = Nami.builder().create(HelloService.class);

Cambios importantes en esta versión:

1. Agregue soporte de registro de señal personalizado en la nube de Solon

(1) Gestión de registro de señales basada en local

Puede agregar directamente una fuente de señal en la instancia de SolonApp; es decir, se completa el registro automático. La IP local y la información de la señal se utilizarán internamente para registrarse con la interfaz de descubrimiento de CloudClient.

  • Ejemplo: agregar señal de registro de servicio http
app.signalAdd(new SignalSim("demoapi", 8080, "http", SignalType.HTTP));
  • Ejemplo: agregar señal de registro del servicio tcp
app.signalAdd(new SignalSim("demorpc", 28080, "tcp", SignalType.SOCKET));
  • Ejemplo: agregar señal de registro del servicio websocket
app.signalAdd(new SignalSim("demows", 18080, "ws", SignalType.WEBSOCKET));
  • Ejemplo: agregar señal de registro del servicio dubbo
app.signalAdd(new SignalSim("demodubbo", 20880, "dubbo", SignalType.SOCKET));

(2) Gestión de registro de señales basada en red

Esto se logra registrando instancias a través de la interfaz de descubrimiento de CloudClient. De esta forma, se puede agregar información más rica, como meta, etiqueta ...

Instance n1 = new Instance("demoapi", "127.0.0.1:1212");
n1.protocol("tcp");
n1.metaPut("athor","noear");
n1.tagAdd("solon");

CloudClient.discovery().register("demo", n1);

2. Aumente la función de parada de seguridad.

Principio interno: 1) ejecutar el método de parada previa del complemento; 2) esperar 10 segundos; 3) ejecutar el método de detención del complemento. Tomando el complemento de nube de Solon como ejemplo, el servicio actual no se registrará a través de la interfaz de descubrimiento durante la pre-parada, de modo que el sistema de descubrimiento tendrá 10 segundos para notificar a cada consumidor.

De esta manera, el proyecto basado en el servicio de descubrimiento puede lograr el efecto de actualización no perceptual.

  • Habilite la capacidad de detener los ojos de forma segura
//通过 enableSafeStop 特性,开启安全停止能力
Solon.start(TestApp.class, args, app -> app.enableSafeStop(true));
  • Configure la cantidad de segundos para esperar o retrasar
solon.stop.delay=10

3. Agregue componentes de interfaz de registro y conéctese a CloudLogService

Los componentes de registro solon.logging y solon.logging.impl basados ​​en la interfaz Slf4j se agregan para proporcionar una interfaz unificada para los servicios de registro en la nube; al mismo tiempo, también es conveniente para los usuarios cambiar a componentes de servicios de registro de terceros. (Actualmente, water-solon-plugin se ha adaptado a CloudLogService para proporcionar servicios de consulta y registro en la nube)

  • Características: TagsMDC mejorados, propicios para la solidificación y almacenamiento de metainformación de registros y consultas posteriores
@Slf4j
public class LogDemo{
    public void test(){
        // 记录当前请求的输入输出日志,并带上用户ID与订单ID作为查询标签
        //
        TagsMDC.tag0("order_"+12);
        TagsMDC.tag1("user_"+1);
        
        Context ctx = Context.current();
        log.info("::{}\r\n{}", ctx.paramMap(), ctx.result);
    }
}

  • Ejemplo de salida de la consola de registro
[INFO] 2021-02-24T22:29:11.822 [*main][@tag0:order_12][@tag3:user_1] demo.LogDemo#console:
::{user:1, order:12}
::{code:1, description:"", data:{list:[...]}}
  • Ejemplo de sumador de registro personalizado

Escribir código

public class TestAppender extends LogAbstractAppender {
    @Override
    public String getName() {
        return "test";
    }

    @Override
    protected void appendDo(LogEvent logEvent) {
        //可以存为本地文件;
        //可以存到消息队列;
        //可以存到MongoDB;
        //可以存到HBase;
        //可以存到 RDB.....等
        System.out.println("[Test] " + logEvent.getContent());
    }
}

//
// 或者适配 CloudLogService 接口,成为 Solon cloud 家族的一员
//

Configurar y usar

solon.logging.appender:
  test: #添加器名字,与getName() 对应起来
    class: webapp.demox_mlog.TestAppender #添加器的实现类
    level: TRACE #添加器接收的日志级别(TRACE、DEBUG、INFO、WARN、ERROR)
    enable: true #默认为开启

En proyectos de tráfico pequeño y mediano, se puede almacenar en RDB (en comparación con HBase y ES, que es mucho más económico) Se recomienda usar la cola de memoria para transferir y escribir en RDB en lotes al escribir. La estructura puede referirse a:

CREATE TABLE `demoapi_log` (
 `log_id` bigint NOT NULL,
  `trace_id` varchar(40) DEFAULT NULL COMMENT '链路跟踪ID',
  `level` int NOT NULL DEFAULT '0',
  `tag0` varchar(100) NOT NULL COMMENT '标签',
  `tag1` varchar(100) NOT NULL DEFAULT '',
  `tag2` varchar(100) NOT NULL DEFAULT '',
  `tag3` varchar(100) NOT NULL DEFAULT '',
  `content` longtext COMMENT '内容',
  `from` varchar(200) DEFAULT NULL COMMENT '日志来源',
  `log_date` int NOT NULL DEFAULT '0' COMMENT '记录日期',
  `log_timestamp` bigint NOT NULL COMMENT '记录时间戳',
  PRIMARY KEY (`log_id`) USING BTREE,
  KEY `IX_tag0` (`tag0`) USING BTREE,
  KEY `IX_tag1` (`tag1`) USING BTREE,
  KEY `IX_tag2` (`tag2`) USING BTREE,
  KEY `IX_tag3` (`tag3`) USING BTREE,
  KEY `IX_trace_id` (`trace_id`) USING BTREE,
  KEY `IX_date` (`log_date`) USING BTREE,
  KEY `log_timestamp` (`log_timestamp`) USING BTREE,
  KEY `IX_level` (`level`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Para la implementación, consulte CloudLogServiceImp de water-solon-plugin

  • Situación del sumador de registros

Introduzca solon.logging.impl, agregue integrado de forma predeterminada: LogConsoleAppender (nivel predeterminado: TRACE)

Introduzca solon.cloud, agregue de forma predeterminada: CloudLogAppender (nivel predeterminado: INFO y reenvíe datos a CloudLogService)

El control de nivel y el estado de inicio se pueden realizar mediante la siguiente configuración:

solon.logging.appender:
  console: 
    level: TRACE
    enable: true
  cloud:
    level: INFO
    enable: true

Archivo adjunto: ejemplo de introducción

Supongo que te gusta

Origin www.oschina.net/news/131461/solon-rpc-1-3-7-released
Recomendado
Clasificación