zoukankan      html  css  js  c++  java
  • 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);
    

    附:项目地址

    附:入门示例

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

  • 相关阅读:
    ASP.net 知识框架
    MD5验证用户登陆密码
    企业面试题汇总.net
    MD5 加密,AES加密,解密 方法
    我选择了学Python
    校内网的错误信息
    Gmail客户端详细架构之一
    UE
    Gmail客户端详细架构之二:象Gmail一样上传文件
    PATH OR FILE NOT FOUND 之 RTX51.LIB
  • 原文地址:https://www.cnblogs.com/noear/p/15726949.html
Copyright © 2011-2022 走看看