Solon 1.2.13 釋出,開啟與 Springboot 的互通

劉之西東發表於2020-12-30

Solon 一個類似Springboot的微型開發框架。專案從2018年啟動以來,參考過大量前人作品;歷時兩年,3500多次的commit;核心保持0.1m的身材,超高的Web跑分,良好的使用體驗。

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

所謂更小:

核心0.1m,最小Web開發單位0.2m(相比Springboot專案包,小到可以乎略不計了)

所謂更快:

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

所謂更自由:(程式碼操控自由)

// 除了注入模式之外,還可以按需手動
//
//手動獲取配置
Map<String,String> db = Solon.cfg().getMap("db");

//手動獲取容器裡的Bean
UserService userService = Aop.get(UserService.class);

//手動監聽http post請求
Solon.global().post("/user/update", x-> userService.updateById(x.paramMap()));

本次版本重大變更:

1、增加外掛:springboot-solon-plugin(實現與Springboot互通)

  • 引入框架,約0.1m大小
<dependency>
    <groupId>org.noear</groupId>
    <artifactId>springboot-solon-plugin</artifactId>
    <version>1.2.13</version>
</dependency>

? 如果有需要可引入Solon的其它外掛,Solon適配的框架多較小巧 ?

  • 嵌入Springboot系統後,同時利用兩套框架的容器資源與特性;或者過度期臨時混合
  1. 啟動應用
@SpringBootLinkSolon
@SpringBootApplication
public class DemoApp {
    public static void main(String[] args) {
        //先
        Solon.start(DemoApp.class, args);
        //後
        SpringApplication.run(DemoApp.class, args);
    }
}

  1. 定義Springboog元件
public interface HelloService {
    String hello(String name);
}

//此處為Springboot的註解(Solon 也有同名的註解)
@Component
public class HelloServiceImp implements HelloService {
    @Override
    public String hello(String name) {
        return "hello: " + name;
    }
}
  1. 在Solon類裡使用Springboot容器內的元件
//此處為Solon的註解(Springboot 也有同名的註解)
@Controller
public class SolonController {
    //使用Solon註解,將Springboot bean注入到Solon的託管類中
    @Inject
    HelloService helloService;
    
    //注入配置
    @Inject("${user.name}")
    String name;

    @Mapping("/test")
    public String home(String msg) throws Exception {
        return "solon: " + helloService.hello();
    }
}
  1. 在Springboot類裡使用Solon的手寫特性
@RestController
public class Text2Controller {

    HelloService helloService;

    @RequestMapping("/test2")
    public String home(String msg) throws Exception {
        //使用Solon的手寫特性賦值,進行懶載入
        //
        if(helloService == null){
            helloService = Aop.get(HelloService.class);
        }

        //手動獲取配置
        //
        String name = Solon.cfg().get("user.name");
        
        //也可以動態增加一個請求監聽
        //
        //Solon.global().get("/hello",(c)->c.output("Hello world!"));

        return "springboot: " + helloService.hello(name);
    }
}

?以上僅為演示效果設計,不一定匹配真實場景?

2、適配第三方配置與註冊服務,consul 框架:consul-solon-plugin

  • 此框架由社群開發者貢獻,Solon的第一個社群貢獻。。。非常感謝
  1. 配置示例
solon.app.name=test-consul-api
solon.app.group=test

consul.host=localhost
#consul.port=8500
#consul.token=
#consul.discovery.enable=true
#consul.discovery.hostname=12.12.12:12
#consul.discovery.tags=dev

#consul.discovery.healthCheckInterval=10s
#consul.discovery.healthCheckPath=/run/check/
consul.discovery.healthDetector=jvm,cpu,memory,disk,qps,os

#consul.locator.enable=true
#consul.locator.interval=10000

#consul.config.enable=true
#consul.config.key=test
consul.config.watch=config/,gateway/
#consul.config.interval=10000
  1. 使用示例
@Controller
public class HelloController {

    //使用了consul的註冊與發現服務
    //
    @NamiClient("test-consul-api:/")
    HelloInterface helloInterface;

    @Mapping("/hello")
    public String sayHello() {
    
        //consul的配置內容整合到Solon的配置體系,可注入,可手動獲取
        //
        return "config:" + Solon.cfg().get("hello")+",rpc:"+helloInterface.hello0();
    }
}

附:Solon專案地址

相關文章