zoukankan      html  css  js  c++  java
  • Java RPC 框架 Solon 1.3.9 发布,更便利的支持

    Solon 是一个微型的Java RPC开发框架。项目从2018年启动以来,参考过大量前人作品;历时两年,4000多次的commit;内核保持0.1m的身材,超高的跑分,良好的使用体验。支持:RPC、REST API、MVC 等多种开发模式。

    Solon 强调:克制 + 简洁 + 开放的原则;力求:更小、更快、更自由的体验。

    项目地址:

    https://gitee.com/noear/solon

    所谓更小:

    内核0.1m,最小开发单位0.2m(相比Dubbo、Springboot项目包,小到可以乎略不计)

    所谓更快:

    本机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);
    

    本次版本重大变更:

    1、增加 solon.extend.sessionstate.jwt 组件,以使用session state 的方式,使用 jwt.token

    此组件有两种应用场景:1)做管理后台的Session State,实现分布式Session的效果;2)做为接口的身份令牌

    • 通过Cookie方式,做为管理后台的Session State;从而让方便管理后台集群部署(用 solon.extend.sessionstate.redis 也能干这事儿)
    Set-Cookie: TOKEN=eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MTQ1NzEwNzAsImp0aSI6ImQ1Zjk5ZTk2MzA3NzRiNGZhNjRmNDJlMWIyNjQ0YjNkIiwiYmNmZG9ja19WYWxpZGF0aW9uX1N0cmluZyI6Ijl0MjIifQ._XY2p5IvItzL3xm3Iz6g2d1KpJG3y3cTn43uaM0dPS0;path=/;max-age=7200;domain=admin.demo.net;
    
    • 通过Header方式,做为接口的身份令牌(通过配置,将jwt转到header上)
    server.session:
      timeout: 7200
      state.jwt:
        requestUseHeader: true
        responseUseHeader: true
    

    使用demo

    @Component(tag = "api")
    public class API_login_test extends ApiBase {
        @Logined
        @Mapping("login.test")
        public Result exec(Context ctx){
            //获取会话状态(与常规session state一样操作)
            long user_id = ctx.session("user_id", 0);
    
            //设置会话状态
            ctx.sessionSet("user_id", 100);
    
            return Result.succeed();
        }
    }
    
    TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MTQ1NzEwNzAsImp0aSI6ImQ1Zjk5ZTk2MzA3NzRiNGZhNjRmNDJlMWIyNjQ0YjNkIiwiYmNmZG9ja19WYWxpZGF0aW9uX1N0cmluZyI6Ijl0MjIifQ._XY2p5IvItzL3xm3Iz6g2d1KpJG3y3cTn43uaM0dPS0;path=/;max-age=7200;domain=admin.demo.net;
    

    2、增加便利的文件下载支持(是下载,不是上传)

    @Controller
    public class Demo{
        @Mapping("/file/down1")
        public void down1(Context ctx, String fileName){
            File file = new File(fileName);
            
            //通过上下文接口,输出下载文件
            ctx.outputAsFile(file);
        }
        
        @Mapping("/file/down2")
        public File down1(String fileName){
            File file = new File(fileName);
            //通过MVC返回File,输出下载文件
            return file;
        }
    }
    

    3、增加 @Logined 登录验证注解

    //
    // 如果未登录,则会提示出错(登录时,将用户id写入session state记录中)
    //
    @Controller
    public class Demo{
        @Logined
        @Mapping("/file/api1")
        public Result api1(){
            return Result.succeed();
        }
    }
    

    4、增加 solon.app.title 常态配置,便于管理后台的标题显示

    //通过 Solon.cfg().appTitle() 接口获取
    

    5、调整 Result 的默认成功码为200,默认失败码为400(借用http的状态码)

    使用 Result 做为简单接口开发的统一格式输出,是非常友好的选择。类似:

    @Controller
    public class Demo{
        @Mapping("/file/api1")
        public Result api1(){
            //直接返回成功结果:{cpde:200, description:"succeed"}
            return Result.succeed();
        }
        
        @Mapping("/file/api2")
        public Result<UserModel> api2(){
            UserModel user = DbUserApi.getUser(12);
      
            //返回成功结果:{cpde:200, description:"succeed", data:{user_id:1, name:"noear"}}
            return Result.succeed(user);
        }
        
        @Mapping("/file/api3")
        public Result api3(String mobile){
            //返回错误结果:{cpde:4002001, description:"没有手机号"}
            return Result.failure(4002001, "没有手机号");
        }
    }
    

    如有需要,还可在启动时调整默认的成功与失败码

    public class DemoApp{
        public static void main(String[] args){
            Solon.start(DemoApp.class, args, app->{
                Result.SUCCEED_CODE = 1;
                Result.FAILURE_CODE = 0;
            });
        }
    }
    

    附:入门示例

  • 相关阅读:
    Huffman
    如何实现伪双击事件
    关于DevExpress的XtraTreeList使用方法总结
    总结DevExpress10个使用技巧
    浅谈WebService返回数据效率对比
    用于RichTextBox控件记录日志信息
    .Net(C#)自定义WinForm控件之小结篇(强力推荐)
    webbrowser自动实现登录博客园
    Win7系统应用程序不能拖放文件原来又是UAC是惹的祸
    winfrom 树形控件如何实现鼠标经过节点时光标颜色改变效果
  • 原文地址:https://www.cnblogs.com/noear/p/14469213.html
Copyright © 2011-2022 走看看