当前位置 博文首页 > 刘之西东:Java RPC 框架 Solon 1.3.1 发布,推出Cloud接口与配

    刘之西东:Java RPC 框架 Solon 1.3.1 发布,推出Cloud接口与配

    作者:刘之西东 时间:2021-01-30 11:35

    Solon 是一个微型的Java RPC开发框架。项目从2018年启动以来,参考过大量前人作品;历时两年,3500多次的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》

    所谓更自由:(代码操控自由)

    // 除了注入模式之外,还可以按需手动
    //
    //手动获取配置
    Map<String,String> db = Solon.cfg().getMap("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);
    

    本次版本重大变更:

    1、发布 Solon cloud 适配接口与配置规范

    此规范的设计目的:为第三方微服务组件适配提供统一的接口与配置规范。从而为第三方的微服务组件适配和使用更具标准性和统一性;同时可以让开发者无缝切换不同的第三方组件。

    本次发布的接口与配置规范主要包括:

    • 配置服务相关的接口与配置
    • 注册与发现服务相关的接口与配置
    • 事件总线相关的接口与配置
    • 日志总线相关的接口与配置

    2、发布配置服务适配组件

    组件 说明 备注
    consul-solon-plugin 对consul的适配 使用一级目录做为对应的配置组
    nacos-solon-plugin 对nacos的适配
    water-solon-plugin 对water的适配

    特性说明:

    • 1-支持配置启动时加载
    solon.app:
      group: demo       #应用组  //也是配置服务使用的默认组
      name: helloapp    #应用名  //发现服务使用的应用名
    
    solon.cloud.consul:      #consul,可以换成 nacos 或 water
      server: 127.0.0.1      #consul 服务地址
      config:
        loadKey: "test.properties"  #启动时加载的配置,并保持时实更新***(会成为Solon.cfg()的一部份)
    
    
    //
    //使用加载的 test.properties 里的配置
    //
    @Configuration
    public class DemoConfig {
        @Bean
        public DataSource ds(@Inject("${db1}") HikariDataSource ds){
            return ds;
        }
    }
    
    • 2-支付配置订阅
    /**
     * 配置订阅(获取配置的时实刷新)
     */
    @CloudConfig("demo_cache_header")
    public class DemotConfigHandler implements CloudConfigHandler {
    
        @Override
        public void handler(Config config) {
            System.out.println(config.value());
        }
    }
    
    • 3-支持云配置直接注入,及自动刷新机制(非单例不需要开启自动刷新机制)
    @Controller
    public class DemoController {
        @CloudConfig(value = "demo_header", autoRefreshed = true)
        String demo_header;
    }
    
    

    附演示源码:https://gitee.com/noear/solon_rpc_demo/tree/main/demo21.solon-cloud-consul

    3、发布注册与发现服务适配组件

    组件 说明
    consul-solon-plugin 对consul的适配
    nacos-solon-plugin 对nacos的适配
    water-solon-plugin 对water的适配

    应用示例:

    • 1-Solon rpc 服务注册
    solon.app:
      group: demo
      name: helloapi    #发现服务使用的应用名(在Demo,将被NimaClient引用)
    
    solon.cloud.consul:
      server: 127.0.0.1   #consul服务地址
    
    @Mapping("/rpc/")
    @Component(remoting = true)
    public class HelloServiceImp implements HelloService {
        @Override
        public String hello() {
            return "remote: hello";
        }
    }
    
    • 2-Solon rpc 服务发布
    solon.app:
      group: demo      
      name: helloapp    
    
    solon.cloud.consul:
      server: 127.0.0.1   
    
    
    @Controller
    public class DemoController {
        //
        // "helloapi" 对应注册的服务
        //
        @NamiClient(name = "helloapi")
        HelloService helloService;
    
        @Mapping("/test")
        public String home(String msg) throws Exception {
            return helloService.hello();
        }
    }
    

    附演示源码:https://gitee.com/noear/solon_rpc_demo/tree/main/demo21.solon-cloud-consul

    4、发布事件总线服务适配组件

    组件 说明 备注
    rabbitmq-solon-plugin 对rabbitmq消息队列的适配
    rocketmq-solon-plugin 对rocketmq消息队列的适配 定时事件不能超过2小时
    water-solon-plugin 对water消息中心的适配

    特性说明:

    1. 支持定时事件
    2. 只要订阅了主题,各消费组都能收到
    3. 当前处理失败后逐级延后重试,直到最终成功;但不影响别的消费组

    消费组由solon.app.group + solon.app.name 自动组合而成;或通过 solon.cloud.{组件}.event.queue 指定

    应用示例:

    solon.app:
      group: demo       #配置服务使用的默认组
      name: helloconsumer    #发现服务使用的应用名
    
    solon.cloud.rocketmq:
      server: localhost:5672   #rabbitmq 服务地址
      username: root           #rabbitmq 链接账号
      password: 123456         #rabbitmq 链接密码
    
    //
    //消费者:订阅事件
    //
    @CloudEvent("hello.demo")
    public class EVENT_hello_demo implements CloudEventHandler {
        @Override
        public boolean handler(Event event) throws Throwable {
            //业务处理
            System.out.println(LocalDateTime.now() + ONode.stringify(event));
            
            //如果成功返回true,否则为false(之后会延时再派送)
            return true;
        }
    }
    
    
    //
    // 发产者:发布事件
    //
    @Controller
    public class DemoController {
        @Mapping("/test")
        public Object test(String msg) {
            if(Utils.isEmpty(msg)){
                msg = "demo2";
            }
    
            //发布事件
            Event event = new Event("hello.demo", msg);
            return CloudClient.event().publish(event);
        }
    }
    

    附演示源码:https://gitee.com/noear/solon_rpc_demo/tree/main/demo30.solon-cloud-rabbitmq

    5、发布日志总线服务适配组件

    • water-solon-plugin(对water日志的适配)

    特性说明:

    1. 支持元信息描述(可语义操作)
    @Controller
    public class DemoController {
    
        CloudLogger logger = CloudLogger.get(TestController.class);
    
        @Mapping("/test")
        public void test(String msg) throws Exception {
            logger.info("我是好人:(");
            logger.info("我不是:{} \n\n {}", "坏人",12);
            logger.info(Tags.tag2("打卡"), "我是谁?");
        }
    }
    

    6、NamiClient 升级,与Solon cloud 规范更好的配合

    新属性 说明 示例
    url 完整的url地址 http://api.water.org/cfg/get/
    group 服务组 water
    name 服务名或负载均衡组件名(配合发现服务使用) waterapi
    path 路径 /cfg/get/

    注:旧的基于表达式的属性 uri,不再使用

    附1: 统一的服务适配接口

    服务接口 说明 已支持适配组件
    CloudConfigService 配置服务接口 consul-solon-plugin、nacos-solon-plugin、water-solon-plugin
    CloudDiscoveryService 发现服务接口 consul-solon-plugin、nacos-solon-plugin、water-solon-plugin
    CloudEventService 事件总线接口 water-solon-plugin、rabbitmq-solon-plugin、rocketmq-solon-plugin
    CloudLogService 日志总线接口 water-solon-plugin

    附2:统一的服务配置规范

    注:具体配置时,用框架名替代@@符

    属性说 说明 框架可使用情况
    solon.cloud.@@.server 服务地址(ip:port) nacos、consul、water
    solon.cloud.@@.token 链接令牌 consul
    solon.cloud.@@.username 链接用户名 nacos
    solon.cloud.@@.password 链接密码 nacos
    solon.cloud.@@.alarm 造警接收号 water
    solon.cloud.@@.config.enable 配置服务启用(默认:true) nacos、consul、water
    solon.cloud.@@.config.server 服务地址(ip:port) nacos、consul、water
    solon.cloud.@@.config.loadGroup 需要启动时加载的配置组 nacos、water
    solon.cloud.@@.config.loadKey 需要启动时加载的Key nacos、consul、wate
    solon.cloud.@@.config.refreshInterval 配置刷新间隔 consul
    solon.cloud.@@.discovery.enable 注册与发现服务启用(默认:true) nacos、consul、water
    solon.cloud.@@.discovery.server 服务地址(ip:port) nacos、consul、water
    solon.cloud.@@.discovery.tags 服务标签 consul
    solon.cloud.@@.discovery.healthCheckPath 服务健康检查路径 consul、water
    solon.cloud.@@.discovery.healthCheckInterval 服务健康检查间隔时间 consul
    solon.cloud.@@.discovery.healthDetector 服务健康上报指标 consul
    solon.cloud.@@.discovery.refreshInterval 服务发现刷新间隔 consul
    solon.cloud.@@.event.enable 事件总线服务(默认:true) water、rabbitmq、rocketmq
    solon.cloud.@@.event.server 服务地址(ip:port) water、rabbitmq、rocketmq
    solon.cloud.@@.event.exchange 交换机或关系组 rabbitmq、rocketmq
    solon.cloud.@@.event.queue 指定队列 rabbitmq、rocketmq
    solon.cloud.@@.event.hostname 指定接收域 water
    solon.cloud.@@.event.seal 事件签名 water
    solon.cloud.@@.log.enable 日志总线服务(默认:true) water
    solon.cloud.@@.log.server 服务地址(ip:port) water
    solon.cloud.@@.log.default 日志默认记录器 water