Solon & Solon Cloud 1.5.53 发布,轻量级 Java 基础开发框架

栏目: 软件资讯 · 发布时间: 4年前

内容简介:Solon 已有 120 个生态扩展插件,此次更新主要为细节打磨: 1、插件 mybatis-solon-plugin 增加 mappers、typeAliases 单行配置支持 之前的多行模式: mybatis.db1: typeAliases: #支持包名 或 类名(....

Solon 已有 120 个生态扩展插件,此次更新主要为细节打磨:

1、插件 mybatis-solon-plugin 增加 mappers、typeAliases 单行配置支持

之前的多行模式:

mybatis.db1:
    typeAliases:    #支持包名 或 类名(.class 结尾)
        - "webapp.model"
    mappers:        #支持包名 或 类名(.class 结尾)或 xml(.xml结尾)
        - "webapp.dso.mapper"

新增加的单行模式支持:

mybatis.db1.typeAliases:  "webapp.model" #如有多项逗号隔开
mybatis.db1.mappers: "webapp.dso.mapper"

2、添加 DownloadedFile 类,用于下载文件输出

@Controller
public class DownController {
    @Mapping("down1")
    public DownloadedFile down() {
        InputStream stream = new ByteArrayInputStream("{code:1}".getBytes(StandardCharsets.UTF_8));

        //之前复用了上传用的 UploadedFile 类,类名感觉不太对路
        DownloadedFile file = new DownloadedFile("text/json", stream, "test.json"); 

        return file;
    }

    @Mapping("down2")
    public File down2() {
        String filePath = Utils.getResource("static/debug.htm").getFile();

        File file = new File(filePath); //也可能用File直接输出

        return file;
    }
}

3、将不确定的插件移到_hatch下,之后会有孵化插件的概念

4、重新调整内核的异常处理链,进行让 Filter 可以统一获取异常处理

public class TestApp {
    public static void main(String[] args) {
        Solon.start(TestApp.class, args, app -> {
            app.filter((ctx, chain) -> {
                //1.开始计时(用于计算响应时长)
                long start = System.currentTimeMillis();
                try {
                    chain.doFilter(ctx);

                    //2.状态404与未处理
                    if (ctx.status() == 404 || ctx.getHandled() == false) {
                        ctx.setHandled(true);
                        ctx.output("没有:(");
                    }
                } catch (Throwable e) {
                    //3.异常捕促与控制
                    e.printStackTrace();

                    ctx.output("出错了:(");
                }

                //4.获得接口响应时长
                long times = System.currentTimeMillis() - start;
                System.out.println("用时:"+ times);
            });
        });
    }
}

//此处调整,解决控制器异常无法被过滤器获取的问题。

5、调整 solon.extend.cors 插件的 CrossHandler 接口,并增加 exposedHeaders(..)

public class TestApp {
    public static void main(String[] args) {
        Solon.start(App.class, args, app -> {
            //添加全局跨域控制
            app.before(new CrossHandler()
                    .allowCredentials(true)
                    .allowedMethods("*")
                    .allowedHeaders("*")
                    .allowedOrigins("*")
                    .exposedHeaders("sign,token"));
        });
    }
}

6、插件 sa-token-solon-plugin,升级 sa-token 到 1.27.0

7、插件 beetlsql-solon-plugin,升级 beetlsql 到 3.11.0-RELEASE

8、增加自动打印异常的全局控制 enableErrorAutoprint

@Slf4j
public static class DemoApp{
    public statis void main(String[] args){
        Lo LoggerFactory.getLogger(DemoApp.class);
        
        Solon.start(DemoApp.class, args, app->{
            //默认是true,转到日志框架后,关掉
            app.enableErrorAutoprint(false);  //控制进入EventBus的异常打印
           
            //订阅进入EventBus的异常
            app.onError(e->{
                Context ctx = Context.current();
                
                if(ctx){
                    //经常有人会疑问:为什么框架不把异常直接转到日志框架?
                    //下面就是好处:可以定制它,比如记录异常时的上下文参数,你排查时方便
                    MDC.put("tag0", ctx.path());
                    log.error(">Params: {}\r\nError: {}", ctx.paramMap(), e);
                }else{
                    log.error(e);
                }
            });
        });
    }
}

Solon 内核的原则是“零外部依赖”,未处理的异常是发送到EventBus的。需要用户订阅处理,例:app.onError(e->...)。现在,默认就能看到异常打印了。

关于 Solon

Solon 是一个轻量的 Java 基础开发框架。强调,克制 + 简洁 + 开放的原则;力求,更小、更快、更自由的体验。支持:RPC、REST API、MVC、Job、Micro service、WebSocket、Socket 等多种开发模式。短小而精悍!

关于 Solon Cloud

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

快速了解 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);

Hello world:

//Handler 模式:
public class App{
    public static void main(String[] args){
        SolonApp app = Solon.start(App.class,args);
        
        app.get("/",(c)->c.output("Hello world!"));
    }
}

//Controller 模式:(mvc or rest-api)
@Controller
public class App{
    public static void main(String[] args){
        Solon.start(App.class,args);
    }
  
    //限定 put & post 方法类型
    @Put
    @Post
    @Mapping("/")
    public String hello(String name){
        return "Hello " + name;
    }
}

//Remoting 模式:(rpc)
@Mapping("/")
@Remoting
public class App implements HelloService{
    public static void main(String[] args){
        Solon.start(App.class,args);
    }

    @Override
    public String hello(){
        return "Hello world!";
    }
}

 

附:入门示例


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Little MLer

The Little MLer

Matthias Felleisen、Daniel P. Friedman、Duane Bibby、Robin Milner / The MIT Press / 1998-2-19 / USD 34.00

The book, written in the style of The Little Schemer, introduces instructors, students, and practicioners to type-directed functional programming. It covers basic types, quickly moves into datatypes, ......一起来看看 《The Little MLer》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具