Solon 1.6.10 重要发布,现在有官网喽!

关于官网

千呼万唤始出来: https://solon.noear.org 。整了一个月多了,总体样子有了。。。还得不断接着整!

关于 Solon

Solon 是一个轻量级应用开发框架。支持 Web、Data、Job、Remoting、Cloud 等任何开发场景。短小而精悍!

  • 强调,克制 + 简洁 + 开放的原则
  • 力求,更小、更快、更自由的体验

关于 Solon Cloud

Solon Cloud 定义了一系列分布式开发的接口标准和配置规范,相当于DDD模式里的防腐层概念。是 Solon 的微服务架构模式开发解决方案。

关于本次更新

1、增加了第三方日志框架的适配。以往是直接使用日志框架,亲合度差了一些

  • 新增 log4j2-solon-plugin 插件
  • 新增 logback-solon-plugin 插件

之前只适配了分布式日志服务。现在也有本地的了。且,统一的配置方式(默认可以0配置):

solon.app:
  name: demoapp

# 以下为默认值,可以都不加,或者想改哪行加哪行(支持"云端配置服务"进行配置,支持写到"云端日志服务")
solon.logging.appender:
  console:
    level: TRACE
    pattern: "%highlight(%-5level %d{yyyy-MM-dd HH:mm:ss.SSS} [-%t][*%X{traceId}]%tags[%logger{20}]:) %n%msg%n"
  file:
    name: "logs/${solon.app.name}"
    level: INFO
    pattern: "%-5level %d{yyyy-MM-dd HH:mm:ss.SSS} [-%t][*%X{traceId}]%tags[%logger{20}]: %n%msg%n"
  cloud:
    level: INFO
    
# 记录器级别的配置示例
solon.logging.logger:
  "features.*":
    level: WARN
  "org.jetty.demo.*":
    level: WARN    

并以 slf4j 做为统一的记录界面

@Slf4j
@Service
public class DemoService{
    public void hello(){
        log.info("Hello world!");
    }
}

2、增加了一些便利接口和使用方式

  • 增加 Context::sessionAsInt, Context::sessionAsLong, Context::sessionAsDouble 接口
  • 增加 Context::sessionRemove 接口
  • 修复 solon.extend.stop 用户ip获取错误
  • 增加 mybatisplus-solon-plugin 为 globalConfig 注入内容的入口
  • 集成包 solon-api 默认添加 solon.extend.cors 插件
  • 增加 主体流注入支持(@Body InputStream body)
  • 取消 solon.cache 插件,由 solon.data 插件集成相关功能,并提供工厂扩展机制
  • 增加 上下文特性,自动做为模板变量
  • 增加 JsonRenderFactory 的事件扩展支持
  • 增加 模板引擎配置 事件扩展机制

综合一些特性,做个简单的组合演示

public class DemoApp{
    public static void main(String[] args){
        Solon.start(DemoApp.class, args, app->{
            //增加默认的跨域支持(支持它的插件,现在默认集成到了 solon-api 集成包里)
            app.before(new CrossHandler().exposedHeaders("sign,token"));
        
            //定制渲染工厂(现在,不管哪个Json 框架都可基于 JsonRenderFactory 进行统一的定制)
            app.onEvent(JsonRenderFactory.class, f->{
                //json渲染时,将 long 型统一转为 string
                f.addConvertor(Long.class, v-> String.valueOf(v));
            });
            
            //定制ftl模板配置
            app.onEvent(freemarker.template.Configuration.class, c -> {
                //增加经典模式支持
                c.setSetting("classic_compatible", "true");
                c.setSetting("number_format", "0.##");
            });
        });
    }
}

@Configuration
public class DemoConfig {
    //通过供应商模式,自动构建不同的缓存服务类型(从原来的 solon.cache 转移到 solon.data 插件)
    @Bean
    public CacheService cache1(@Inject("cache1") CacheServiceSupplier supplier) {
        return supplier.get();
    }
}

@Controller
public class DemoController{
    @Mapping("/login")
    public void login(Context ctx){
        //到登录页时,把 user_id 删掉;确保用户重新登录
        ctx.sessionRemove("user_id");
    }
    
    @Mapping("/admin")
    public void admin(Context ctx){
        long userId = ctx.sessionAsLong("user_id");
        if(userId == 0){
            //如果用户id为0,则302跳转到登录面
            ctx.redirect("/login");
        }
    }
    
    @Mapping("/admin/group/edit.save")
    public void admin_group_edit_save(long groupId, String name, @Body String meta){
        //groupId, name 通过 queryString 传入;meta 是通过 body 传入的纯文本
    }
}

@Component
public class DemoFilter implements Filter{
    @Override
    public void doFilter(Context ctx, FilterChain chain) throws Throwable {
        //给所有模板增加全局变量(或公共变量)
        ctx.attrSet("js", "/_static/js");
        ctx.attrSet("css", "/_static/css");
        
        chain.doFilter(ctx);
    }
}

3、能力或兼容性增强

  • 增加 @Init 私有函数支持
  • 增加 @Bean 私有函数支持
  • 增加 @Inject("${xxx:}"),默认值为空的支持
  • 增加 StringSerializerRender 对 renderAndReturn 的支持
  • 增加 Context::renderAndReturn 支持非视图数据
  • 调整 EventListener 充许 onEvent 抛出异常
  • 调整 初始化失败时,自动停掉所有插件并结束进程
  • 增加 上下文特性,自动做为模板变量
  • 优化 配置注入"${xxx:def}"的兼容性,def有":"符也没关系了
  • 增加 Mvc 数组参数注入时,自动以,号分离为数组
  • 增加 @Init::index 属性
  • 增加 容器扫描去重去处
  • 取消 @Param::format 属性(自动处理增加17种格式)
@Configuration
public class DemoConfig {
    //以前必须要用 public
    @Bean
    private CacheService cache1(@Inject("cache1") CacheServiceSupplier supplier) {
        return supplier.get();
    }
    
    @Init
    private void init(){
        //...
    }
}

@Controller
public class DemoController{

    //以前是不能在默认值里出现:号的
    @Inject("${user.name:noear:org}")
    String userName;
    
    @Mapping("/test")
    public String test(Context ctx){
        UserModel user = userService.get(1);
        
        //现在可以借助上下文的渲染函数进行序列化(默认是json,也可指定渲染器)
        ctx.attrSet("@render","@json");
        String json = ctx.renderAndReturn(user);
        
        return Base64Utils.encode(json);
    }
}

快速了解 Solon 的材料:

《Solon 特性简集,相较于 Springboot 有什么区别?》

《Solon Cloud 分布式服务开发套件清单,感觉受与 Spring Cloud 的不同》

《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);

附:项目地址

附:入门示例

更多系统的学习内容,建议参考官网

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容