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);
public interface CloudFileService {
InputStream getStream(String bucket, String key) throws CloudFileException;
Result putStream(String bucket, String key, InputStream stream, String streamMime) throws CloudFileException;
InputStream getText(String bucket, String key) throws CloudFileException;
Result putText(String bucket, String key, String text) throws CloudFileException;
...
}
以 aliyun-oss-solon-plugin 使用为例:
solon.cloud.aliyun.oss: # 亚马逊则为:solon.cloud.aws.s3
file:
bucket: aaa
endpoint: bbb.xxx.xxx
accessKey: ccc
secretKey: ddd
#可以通过配置服务动态加载,以灵活切换不同的配置
#solon.cloud.water:
# server: water
# config:
# load: xxx_hdfs_cfg
public class DemoService {
public void test() {
String key = "test/" + Utils.guid();
String val = "Hello world!";
//写入数据
Result result = CloudClient.file().putText(key, val);
System.out.println(ONode.stringify(result));
assert result.getCode() == Result.SUCCEED_CODE;
//读取数据
String tmp = CloudClient.file().getText(key);
assert val.equals(tmp);
}
}
配置示例:
solon.app:
group: demo
name: consumer
solon.cloud.mqtt:
server: "tcp://localhost:41883" #mqtt服务地址
代码示例:
@Controller
public class TestController {
@Mapping("/test")
public Object test(String msg) {
if(Utils.isEmpty(msg)){
msg = "demo2";
}
Event event = new Event("hello.demo", msg).qos(1).retained(true);
return CloudClient.event().publish(event);
}
}
Solon 启动处理顺序:
//订阅示例(通过Solon事件总线提前订阅)
EventBus.subscribe(AppInitEndEvent.class, event->{
System.out.println("app init end...");
});
Solon.start(App.class, args);
//切换处理(让静态文件优先)
HandlerPipeline pipeline = new HandlerPipeline();
pipeline.next(new StaticResourceHandler()).next(app.handlerGet());
app.handlerSet(pipeline);
SolonServletFilter.onFilterEnd = new HandlerPipeline().next(new BaseLogHandler()).next(new BaseEndHandler());