zoukankan      html  css  js  c++  java
  • 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;
        }
    }
    

    参考资料

    1. GitHub:sofa-bolt源码库
    2. 简书:SOFABolt 源码分析系列
    3. sofa-bolt中文文档
    4. 简书:sofa-bolt学习
  • 相关阅读:
    前端之CSS:属性操作2
    前端之CSS:属性操作1
    前端之CSS:CSS选择器
    前端之HTML:表单操作
    前端之HTML:HTML
    SQLAlchemy的使用(SQLAlchemy 是一种对象关系映射模型(Object Relational Mapper), 简称ORM。)
    IO多路复用
    协程
    线程的那些事儿
    并发编程的那些事儿(四)
  • 原文地址:https://www.cnblogs.com/YangGC/p/12397322.html
Copyright © 2011-2022 走看看