zoukankan      html  css  js  c++  java
  • 对标 Spring Boot & Cloud ,轻量框架 Solon 1.4.8 发布

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

    Solon Cloud 是一系列的接口标准和配置规范,算是 Solon 的分布式开发套件方案。

    快速了解Solon的材料:

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

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

    《Solon 的想法与架构笔记》

    《Solon 生态插件清单》,目前已有100多个生态插件

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

    本次版本主要变化:

    1、增加 sa-token-solon-plugin 插件,适配 sa-token 认证框架

    应用样例

    @Controller
    @Mapping("/test/")
    public class TestController {
        @SaCheckLogin					
        @SaCheckRole("super-admin")		
        @SaCheckPermission("user-add")	
        @Mapping("atCheck")
        public AjaxJson atCheck() {
            System.out.println("只有通过注解鉴权,才能进入此方法");
            return AjaxJson.getSuccess();
        }
    	
        @Mapping("atJurOr")
        @SaCheckPermission(value = {"user-add", "user-all", "user-delete"}, mode = SaMode.OR)	
        public AjaxJson atJurOr() {
            return AjaxJson.getSuccessData("用户信息");
        }
    }
    

    2、增加 solon.extend.auth 插件,Solon 自扩展的认证框架

    适配样例

    @Configuration
    public class Config {
        @Bean
         public AuthAdapter init() {
            return new AuthAdapter()
                .loginUrl("/login")
                .authPathMatchers(new AuthPathMatchersImpl())
                .authInterceptor(new AuthInterceptorImpl())
                .authProcessor(new AuthProcessorImpl())
                .authOnFailure((ctx, rst) -> {
                    ctx.render(Result.failure(403,"没有权限:("));
                });
        }
    }
    

    应用样例

    @Controller
    @Mapping("/test/")
    public class TestController {
        @Mapping("/hello/")
        public String hello() {
            return "hello world!";
        }
        
        @AuthRoles("admin")
        @Mapping("/admin/")
        public String admin() {
            return "hello admin!";
        }
    }
    

    3、增加 solon-enjoy-web 快速开发套件(支持 enjob + activerecord 体验)

    jFinal 系列技术的爱好者,可以有不同的玩具了。solon-enjoy-web,支持 solon 完整的事务能力及缓存能力

    //配置默认数据源
    @Configuration
    public class Config {
        @Bean
        public DataSource db1(@Inject("${test.db1}") HikariDataSource dataSource) {
            return dataSource;
        }
    }
    
    //应用示列
    @Mapping("/demo/")
    @Controller
    public class DemoController {
        @Mapping("")
        public Object test(){
            return Db.template("appx_get").findFirst();
        }
    
        @Cache(tags = "test2")
        @Mapping("/test2")
        public Object test2(){
            AppxModel dao = new AppxModel().dao();
    
            return dao.findById(4);
        }
    }
    

    4、增加 异常订阅转换为正常输出的能力

    @Component
    public class GlobalException implements EventListener<Throwable> {
        @Override
        public void onEvent(Throwable e) {
            Context c = Context.current();
    
            if (c != null) {
                AjaxJson aj = null;
                if (e instanceof SaTokenException) {    
                    NotLoginException ee = (NotLoginException) e;
                    aj = AjaxJson.getNotLogin().setMsg(ee.getMessage());
                } else if (e instanceof NotRoleException) {     
                    NotRoleException ee = (NotRoleException) e;
                    aj = AjaxJson.getNotJur("无此角色:" + ee.getRole());
                } else if (e instanceof NotPermissionException) {  
                    NotPermissionException ee = (NotPermissionException) e;
                    aj = AjaxJson.getNotJur("无此权限:" + ee.getCode());
                } else if (e instanceof DisableLoginException) { 
                    DisableLoginException ee = (DisableLoginException) e;
                    aj = AjaxJson.getNotJur("账号被封禁:" + ee.getDisableTime() + "秒后解封");
                } else {
                    aj = AjaxJson.getError(e.getMessage());
                }
    
                c.result = aj;
            }
        }
    }
    

    附:项目地址

    附:入门示例

  • 相关阅读:
    【做题记录】区间排序—线段树
    【做题记录】CF1428E Carrots for Rabbits—堆的妙用
    线段树合并、分裂
    一、drf入门规范
    七、Django实战--图书管理系统搭建
    六、ORM模型层补充
    五、Django之模型层
    四、Django之模板层
    三、Django之视图层
    二、Django之路由层
  • 原文地址:https://www.cnblogs.com/noear/p/14836843.html
Copyright © 2011-2022 走看看