天天看點

Spring Boot 輕量替代架構 Solon 1.3.29 釋出

Solon 是一個微型的Java開發架構。項目2018年啟動,參考過大量前人作品;核心0.1m的身材,超高的跑分,以及良好的使用體驗。支援:RPC、REST API、MVC、WebSocket、Socket 等多種開發模式。

Solon 強調:克制 + 簡潔 + 開放的原則;力求:更小、更快、更***的體驗。

替代?那有什麼異同之處?

《Solon 特性簡集,相較于 Springboot 有什麼差別?》

《Solon 的架構筆記》

所謂更小:

核心0.1m,最小的接口開發機關0.2m(相較于 Dubbo、Springboot 的依賴包,小到可以乎略不計)

所謂更快:

本機http helloworld測試,Qps可達12萬之多。可參考:《helloworld_wrk_test》

所謂更***:(代碼操控***)

// 除了注解模式之外,還可以按需手動
//
//手動擷取配置(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);

//手動為容器添加元件
Aop.wrapAndPut(DemoService.class);           

本次版本主要變化:

1、Solon cloud event 增加通道概念,以支援不同消息隊列産品共用

例如一個IoT項目的應用場景:業務消息用RabbitMQ,裝置消息用 MQTT。

配置

solon.app:
  group: demo       #配置服務使用的預設組
  name: helloproducer    #發現服務使用的應用名

solon.cloud.mqtt:
  server: "tcp://localhost:41883"   #mqtt服務位址(預設通道不用命名)

solon.cloud.rabbitmq:
  server: localhost:5672   #rabbitmq 服務位址
  username: root           #rabbitmq 連結賬号
  password: 123456         #rabbitmq 連結密碼
  event:
    channel: "biz"      #對事件服務進行通道命名
           

生産端代碼

@Controller
public class TestController {
    @Mapping("/test")
    public Object test(String msg) {
        //發送預設通道
        return CloudClient.event().publish(new Event("hello.demo", msg).qos(1).retained(true));
    }

    @Mapping("/test2")
    public Object test2(String msg) {
        //發送到biz通道(發送時,增加 channel 資訊即可)
        return CloudClient.event().publish(new Event("hello.demo2", msg).channel("biz"));
    }
}           

消費端代碼

//訂閱并消費預設通道的事件(為了示範把mqtt的消息訂閱過來了)
@CloudEvent("hello.demo")
public class EVENT_hello_demo implements CloudEventHandler {
    @Override
    public boolean handler(Event event) throws Throwable {
        System.out.println(LocalDateTime.now() + ONode.stringify(event));
        return true;
    }
}

//訂閱并消費biz通道的事件
@CloudEvent(value = "hello.demo2", channel = "biz")
public class EVENT_hello_demo2 implements CloudEventHandler {
    @Override
    public boolean handler(Event event) throws Throwable {
        System.out.println(LocalDateTime.now() + ONode.stringify(event));
        return true;
    }
}           

2、Solon cloud breaker 斷路器增加動态配置支援

配置

solon.cloud.local:
  breaker:
    hello: 1   #斷路器名稱與閥值           

示範代碼

@Controller
public class DemoController {

    //此處安排了個斷路器(即限流器),如果斷路時,會傳回HTTP 403狀态
    @CloudBreaker("hello")
    @Mapping("/hello")
    public String hello() {
        return "hello";
    }


    @Mapping("/reset")
    public void reset() {
        //重新設定斷路器的閥值(此配置,也可能過配置服務管理;動态更新)
        Solon.cfg().setProperty("solon.cloud.local.breaker.hello", "10");
    }
}
           

3、Solon logging 增加支援有格式化或無格式化的異常列印

Solon logging 是基于 slf4j 的個實作方案,内部對接 Solon cloud log service 接口,進而将日志寫到分布式日志服務。

//無格式化場景
log.error("Error: ", e);

//格式化場景
log.error("Error: {}", e);
           

4、增加路由元件切換支援

public class Demo10App {
    public static void main(String[] args) {
        Solon.start(Demo10App.class, args, app -> {
            Router router = new RouterCustom();

            //替換路由器
            app.routerSet(router);
        });
    }
}
           

5、@Init 增加延時處理機制,并預設為 true

@Component
public class Demo {
    @Init
    public void init(){
        //...
    }
}
           

6、優化session.jwt元件内部機制

附:入門示例

  • 項目位址:https://gitee.com/noear/solon
  • Solon 入門教程示例:https://gitee.com/noear/solon_demo
  • Solon Rpc 入門教程示例:https://gitee.com/noear/solon_rpc_demo
  • Solon Cloud 入門教程示例:https://gitee.com/noear/solon_cloud_demo
  • Solon 進階教程示例:https://gitee.com/noear/solon_advance_demo