SofaBolt最简单Demo

简介: SofaBolt最简单Demo

简介

sofa-bolt是蚂蚁开源的一款基于Netty的网络通信框架。在Netty的基础上对网络编程常见问题进行了一层简单封装,让中间件开发者更关注于中间件产品本身。

Demo 关键代码

Pom依赖:

        <dependency>
            <groupId>com.alipay.sofa</groupId>
            <artifactId>bolt</artifactId>
            <version>1.6.0</version>
        </dependency>
        <dependency>
            <groupId>com.alipay.sofa</groupId>
            <artifactId>hessian</artifactId>
            <version>3.3.6</version>
        </dependency>

BoltServer端:

  • 测试入口类
public class MyServer {
    public static boolean start() {
        /**
         * 创建 RpcServer 实例,指定监听 port
         */
        RpcServer server = new RpcServer(8888);
        /**
         * 注册业务逻辑处理器 UserProcessor
         */
        server.registerUserProcessor(new MyServerUserProcessor());
        /**
         * 启动服务端:先做 netty 配置初始化操作,再做 bind 操作
         * 配置 netty 参数两种方式:[SOFABolt 源码分析11 - Config 配置管理的设计](https://www.jianshu.com/p/76b0be893745)
         */
        return server.start();
    }

    public static void main(String[] args) {
        if (MyServer.start()) {
            System.out.println("server start success!");
        } else {
            System.out.println("server start fail!");
        }
    }
}
  • 用户自定义处理器类
/**
 * 自定义的业务逻辑用户处理器
 * 注意:
 * 对于所有的请求数据的类型,都必须有 UserProcessor 可以处理(感兴趣),
 * 否则将抛出 RpcServerException 异常,类似于 "RpcServerException:No user processor found for request: java.lang.String"
 */
public class MyServerUserProcessor extends SyncUserProcessor<MyRequest> {

    @Override
    public Object handleRequest(BizContext bizCtx, MyRequest request) throws Exception {
        MyResponse response = new MyResponse();
        if (request != null) {
            System.out.println("recive request"+request);
            response.setResp("from server -> " + request.getReq());
        }
        return response;
    }

    /**
     * 指定感兴趣的请求数据类型,该 UserProcessor 只对感兴趣的请求类型的数据进行处理;
     * 假设 除了需要处理 MyRequest 类型的数据,还要处理 java.lang.String 类型,有两种方式:
     * 1、再提供一个 UserProcessor 实现类,其 interest() 返回 java.lang.String.class.getName()
     * 2、使用 MultiInterestUserProcessor 实现类,可以为一个 UserProcessor 指定 List<String> multiInterest()
     */
    @Override
    public String interest() {
        return MyRequest.class.getName();
    }
}
  • 响应统一封装类
/**
 * 响应统一封装类
 * 注意:必须实现 Serializable 接口,因为默认的编码器:ProtocolCodeBasedEncoder extends MessageToByteEncoder<Serializable>,
 * 只对 Serializable 实现类进行编码
 */
public class MyResponse implements Serializable {
    private static final long serialVersionUID = -6215194863976521002L;
    private String resp = "default resp from server";

    public String getResp() {
        return resp;
    }

    public void setResp(String resp) {
        this.resp = resp;
    }

    @Override
    public String toString() {
        return resp;
    }
}

BoltClient端:

  • 客户端入口类
/**
 * 客户端
 */
public class MyClient {
    private static RpcClient client;

    public static void start()  {
        // 创建 RpcClient 实例
        client = new RpcClient();
        // 初始化 netty 客户端:此时还没有真正的与 netty 服务端进行连接
        client.init();
    }

    public static void main(String[] args) throws RemotingException, InterruptedException {
        MyClient.start();
        // 构造请求体
        MyRequest request = new MyRequest();
        request.setReq("Hello, bolt-server");
        /**
         * 1、获取或者创建连接(与netty服务端进行连接),Bolt连接的创建是延迟到第一次调用进行的
         * 2、向服务端发起同步调用(四种调用方式中最常用的一种)
         */
        MyResponse response = (MyResponse) client.invokeSync("127.0.0.1:8888", request, 30 * 1000);
        System.out.println(response);
    }
}
  • 请求统一封装类
/**
 * 请求统一封装类
 * 注意:必须实现 Serializable 接口,因为默认的编码器:ProtocolCodeBasedEncoder extends MessageToByteEncoder<Serializable>,
 * 只对 Serializable 实现类进行编码
 */
public class MyRequest implements Serializable {
    private static final long serialVersionUID = -7242884346498114969L;
    private String req;

    public String getReq() {
        return req;
    }

    public void setReq(String req) {
        this.req = req;
    }

    @Override
    public String toString() {
        return req;
    }
}

与远程服务对接后效果图:

在这里插入图片描述

在服务端SOFAJraft 崩溃情况下,确保客户端对其异常处理!

在这里插入图片描述

参考资料

  1. GitHub:sofa-bolt源码库
  2. 简书:SOFABolt 源码分析系列
  3. sofa-bolt中文文档
  4. 简书:sofa-bolt学习
目录
相关文章
|
监控 负载均衡 Java
深入理解Spring Cloud中的服务网关
深入理解Spring Cloud中的服务网关
|
前端开发 网络协议 Dubbo
超详细Netty入门,看这篇就够了!
本文主要讲述Netty框架的一些特性以及重要组件,希望看完之后能对Netty框架有一个比较直观的感受,希望能帮助读者快速入门Netty,减少一些弯路。
93153 32
超详细Netty入门,看这篇就够了!
npm 切换镜像后,npm i 安装依然卡,需要好久才完成
npm 切换镜像后,npm i 安装依然卡,需要好久才完成
1172 0
|
10月前
|
存储 前端开发 数据可视化
Grafana Loki,轻量级日志系统
本文介绍了基于Grafana、Loki和Alloy构建的轻量级日志系统。Loki是一个由Grafana Labs开发的日志聚合系统,具备高可用性和多租户支持,专注于日志而非指标,通过标签索引而非内容索引实现高效存储。Alloy则是用于收集和转发日志至Loki的强大工具。文章详细描述了系统的架构、组件及其工作流程,并提供了快速搭建指南,包括准备步骤、部署命令及验证方法。此外,还展示了如何使用Grafana查看日志,以及一些基本的LogQL查询示例。最后,作者探讨了Loki架构的独特之处,提出了“巨型单体模块化”的概念,即一个应用既可单体部署也可分布式部署,整体协同实现全部功能。
3494 70
Grafana Loki,轻量级日志系统
|
监控 Java 中间件
8 个线程池最佳实践和坑!使用不当直接生产事故!!
8 个线程池最佳实践和坑!使用不当直接生产事故!!
518 1
|
消息中间件 JSON Java
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
28364 0
|
Java 应用服务中间件 API
Vertx高并发理论原理以及对比SpringBoot
Vertx 是一个基于 Netty 的响应式工具包,不同于传统框架如 Spring,它的侵入性较小,甚至可在 Spring Boot 中使用。响应式编程(Reactive Programming)基于事件模式,通过事件流触发任务执行,其核心在于事件流 Stream。相比多线程异步,响应式编程能以更少线程完成更多任务,减少内存消耗与上下文切换开销,提高 CPU 利用率。Vertx 适用于高并发系统,如 IM 系统、高性能中间件及需要较少服务器支持大规模 WEB 应用的场景。随着 JDK 21 引入协程,未来 Tomcat 也将优化支持更高并发,降低响应式框架的必要性。
435 6
Vertx高并发理论原理以及对比SpringBoot
|
算法 Java C++
刷题两个月,从入门到字节跳动offer丨GitHub标星16k+,美团Java面试题
刷题两个月,从入门到字节跳动offer丨GitHub标星16k+,美团Java面试题
|
开发框架 Java 数据库连接
分享88个Java框架源码,总有一款适合您
分享88个Java框架源码,总有一款适合您
559 0