SOFABolt 源码分析1 - 最简使用姿势

SOFABolt 是一个轻量级、高性能、易用的远程通信框架,基于netty4.1,由蚂蚁金服开源。

重要的四个学习资料:
github:https://github.com/alipay/sofa-bolt
使用手册:https://github.com/alipay/sofa-bolt/wiki/SOFA-Bolt-Handbook
蚂蚁通信框架实践:https://mp.weixin.qq.com/s/JRsbK1Un2av9GKmJ8DK7IQ
金融级分布式架构公众号:SOFABoltLab 组织的源码分析文章

本文会提供一个 SOFABolt 最简使用示例,之后的源码分析都会基于该示例及其扩展进行。

SOFABolt 坐标:

        
            com.alipay.sofa
            bolt
            1.5.1
        

一、请求封装类和响应封装类

所有的rpc框架都会提供这样两个类:统一封装请求和响应,例如 SOFARPC 中的 SofaRequest 和 SofaResponse。

1.1、请求统一封装类

/**
 * 请求统一封装类
 * 注意:必须实现 Serializable 接口,因为默认的编码器:ProtocolCodeBasedEncoder extends MessageToByteEncoder,
 * 只对 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;
    }
}

1.2、响应统一封装类

/**
 * 响应统一封装类
 * 注意:必须实现 Serializable 接口,因为默认的编码器:ProtocolCodeBasedEncoder extends MessageToByteEncoder,
 * 只对 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;
    }
}

二、用户自定义业务逻辑处理器

/**
 * 自定义的业务逻辑用户处理器
 * 注意:
 * 对于所有的请求数据的类型,都必须有 UserProcessor 可以处理(感兴趣),
 * 否则将抛出 RpcServerException 异常,类似于 "RpcServerException:No user processor found for request: java.lang.String"
 */
public class MyServerUserProcessor extends SyncUserProcessor {

    @Override
    public Object handleRequest(BizContext bizCtx, MyRequest request) throws Exception {
        MyResponse response = new MyResponse();
        if (request != null) {
            System.out.println(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 multiInterest()
     */
    @Override
    public String interest() {
        return MyRequest.class.getName();
    }
}

三、服务端

/**
 * 服务端
 */
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!");
        }
    }
}

四、客户端

/**
 * 客户端
 */
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);
    }
}

ok,完成!!!代码很简单,服务端启动用了三行代码,客户端启动用了两行代码,调用用了一行代码。
这个最简示例仅用于学习源码使用,SOFABolt 在生产中的最佳实践是 SOFARPC,后续在分析 SOFARPC 源码的时候,会分析 SOFARPC 对 SOFABolt 的使用姿势。

你可能感兴趣的:(SOFABolt 源码分析1 - 最简使用姿势)