JavaAPI

大约 5 分钟

JavaAPI

对于java程序Sekiro提供javaSDK,由于Sekiro主要语言是Java,所以在javaSDK层面将会是最完善的功能支持

##handler

sekiroHandler是用于处理请求的处理器,他是一个抽象接口:

package cn.iinti.sekiro3.business.api.interfaze;

public interface RequestHandler {
    void handleRequest(SekiroRequest sekiroRequest, SekiroResponse sekiroResponse);
}

您只需要实现当前接口,即将代码handler注册到sekiro中。

设置action

每个handler都必须有action,目前我们提供两种设置action的方法:

实现ActionHandler

package cn.iinti.sekiro3.business.api.interfaze;

public interface ActionHandler extends RequestHandler {
    String action();
}

使用注解


@Action("theAction")
public class XXHandler implements RequestHandler {
    @Override
    public void handleRequest(SekiroRequest sekiroRequest, SekiroResponse sekiroResponse) {
        //to something
    }
}

获取参数

sekiro的所有参数都是打平包裹为json对象传递到handler中,你可以直接通过json对象API解析得到任何参数, 也可以使用我们的自动包装API或者注解。使用注解将会让代码非常优雅。

使用注解绑定

如下绑定param1参数到对应属性上

    @AutoBind
    private String param1;

如下手动确定参数实际名称

    @AutoBind("param1")
    private String param1;

如下确定本参数为必传参数:

    @AutoBind(value="param1",require=true)
    private String param1;

如下设置参数默认值(当用户没有传递改参数的时候):

    @AutoBind(value="param1",defaultValue="默认值")
    private String param1;

如下传递复杂对象(可以支持json,map,javabean等复杂对象,sekiro将会自动完成属性映射):

    @AutoBind
    private JSONObject param1;

使用sekiroRequest手动获取参数:

   @Override
    public void handleRequest(SekiroRequest sekiroRequest, SekiroResponse sekiroResponse) {
        String param1 = sekiroRequest.getString("param1");
        boolean sleep = sekiroRequest.getBooleanValue("sleep");
        double latitude = sekiroRequest.getDoubleValue("latitude");
    }

使用内置json对象

    @Override
    public void handleRequest(SekiroRequest sekiroRequest, SekiroResponse sekiroResponse) {
        JSONObject jsonModel = sekiroRequest.getJsonModel();
        String key = jsonModel.getString("key");
        Byte b = jsonModel.getByte("b");
    }

定制线程池

sekiro是一个异步框架,大部分情况sekiro的调用应该是不耗时,如果存在耗时,android客户端将会有自己的异步任务机制。 但是为了避免用户错误的使用sekiro导致任务卡顿,故Sekiro提供一个内置线城池。

 HandlerThreadPool.setMaxWorkSize(100);

你可以通过类似上面的代码设置线程池参数,请注意sekiro内置线程池非常简单,如果您的业务发生了线程池的深度定制需求,请自定将handler业务逻辑放到自己的线程池中执行即可。

sekiro生命周期监听

如果你对sekiro的创建,使用,销毁等生命周期感兴趣,可以通过监听器获得生命周期的回调。 如下:

package cn.iinti.sekiro3.business.api.bootstrap;

import cn.iinti.sekiro3.business.api.ClusterSekiroClient;
import cn.iinti.sekiro3.business.api.SekiroClient;
import cn.iinti.sekiro3.business.api.core.eventbus.event.client.SekiroClientConnectEvent;
import cn.iinti.sekiro3.business.api.core.eventbus.event.client.SekiroClientDestroyEvent;
import cn.iinti.sekiro3.business.api.core.eventbus.event.client.SekiroClientDisConnectedEvent;
import cn.iinti.sekiro3.business.api.core.eventbus.event.cluster.ClusterClientDestroyEvent;
import cn.iinti.sekiro3.business.api.interfaze.*;

class ClusterClientTest {

    public static void main(String[] args) throws InterruptedException {
        // https://sekiro.iinti.cn/business/invoke?group=test&action=test&sekiro_token=123
        ClusterSekiroClient sekiroClient = new ClusterSekiroClient("test")
                .setupSekiroRequestInitializer(new SekiroRequestInitializer() {
                    @Override
                    public void onSekiroRequest(SekiroRequest sekiroRequest, HandlerRegistry handlerRegistry) {
                        handlerRegistry.registerSekiroHandler(new ActionHandler() {

                            @Override
                            public String action() {
                                return "test";
                            }

                            @Override
                            public void handleRequest(SekiroRequest sekiroRequest, SekiroResponse sekiroResponse) {
                                sekiroResponse.success("param:" + sekiroRequest.getString("param"));
                            }
                        });
                    }
                })
                .addSekiroClientEventListener(new SekiroClientConnectEvent() {
                    @Override
                    public void onClientConnected(SekiroClient sekiroClient1) {
                        System.out.println(sekiroClient1.getClientKey() + ": 连接");
                    }
                })
                .addSekiroClientEventListener(new SekiroClientDisConnectedEvent() {
                    @Override
                    public void onClientDisConnected(SekiroClient sekiroClient12) {
                        System.out.println(sekiroClient12.getClientKey() + ": 断开");
                    }
                })
                .addSekiroClientEventListener(new SekiroClientDestroyEvent() {
                    @Override
                    public void onClientDestroy(SekiroClient sekiroClient13) {
                        System.out.println(sekiroClient13.getClientKey() + ": 销毁");
                    }
                })
                .addClusterClientEventListener(new ClusterClientDestroyEvent() {
                    @Override
                    public void onDestroy(ClusterSekiroClient clusterSekiroClient) {
                        System.out.println("集群client销毁");
                    }
                })
                .start();

        Thread.sleep(20000);

        sekiroClient.destroy(10);
    }

}

数据压缩

Sekiro支持对传输报文进行压缩,并且默认开启了gzip压缩,这会显著降低您服务器带宽消耗。 正常情况下,也不需要对压缩算法进行过多的调优,但是您依然可以设置压缩算法,以及决定何种数据需要进行何种压缩算法。

安装压缩处理器

 SekiroClient sekiroClient = new SekiroClient("test-xposed", UUID.randomUUID().toString());
                sekiroClient.getCompressorManager().registerCompressor(new Compressor() {
                    @Override
                    public String method() {
                        return "MY_COMPRESSOR";
                    }

                    @Override
                    public byte[] compress(byte[] input) throws IOException {
                        // to compress and change byte array
                        return input;
                    }

                    @Override
                    public byte[] decompress(byte[] input) throws IOException {
                        // to decompress and change byte array
                        return input;
                    }
                });
                sekiroClient
                        .setupSekiroRequestInitializer(new SekiroRequestInitializer() {
                            @Override
                            public void onSekiroRequest(SekiroRequest sekiroRequest, HandlerRegistry handlerRegistry) {
                                handlerRegistry.registerSekiroHandler(new ClientTimeHandler());
                            }
                        });

数据返回的时候指定压缩算法

    @Override
    public void handleRequest(SekiroRequest sekiroRequest, SekiroResponse sekiroResponse) {
        sekiroResponse.userCompressMethod("MY_COMPRESSOR");
        sekiroResponse.success("data");
    }

集群客户端

目前并没有发现任何业务场景单台sekiro服务器无法支撑业务,所以集群客户端在这里单独说明, 如果您的业务没有发生多台服务器节点性能瓶颈,那么不建议您查看本章节内容。

使用ClusterSekiroClient即可以走集群模式,集群模式会同时创建多台服务器的连接,并同时接受多台服务器的转发任务。 实现多个节点的load balance

ClusterSekiroClient sekiroClient = new ClusterSekiroClient("test")
                .setupSekiroRequestInitializer(new SekiroRequestInitializer() {
                    @Override
                    public void onSekiroRequest(SekiroRequest sekiroRequest, HandlerRegistry handlerRegistry) {
                        handlerRegistry.registerSekiroHandler(new ActionHandler() {

                            @Override
                            public String action() {
                                return "test";
                            }

                            @Override
                            public void handleRequest(SekiroRequest sekiroRequest, SekiroResponse sekiroResponse) {
                                sekiroResponse.success("param:" + sekiroRequest.getString("param"));
                            }
                        });
                    }
                }).start();

Invoker

「SekiroInvokerClient」,使用方式类似于 OkHttp,如果在 Java 环境下调用建议使用该客户端。 对比 Http 调用方式有以下优势:

  • SekiroInvokerClient 启动后会和所有中央服务器保持长连接,这样如果Sekiro服务器部署了多台副本,则任意一台副本宕机不会导致调用失败
  • 业务使用方通道和业务提供方通道协议完全一致,Sekiro Nat 服务器不需要做协议转换工作
  • Sekiro Nat 服务器不需要做解压、压缩等工作,在两条通道直接进行透明转发

SekiroInvokerClient 鉴权

使用token鉴权,如果是开源版本,或者匿名group,则token填写空字符即可

package cn.iinti.sekiro3.business.samples;

import cn.iinti.sekiro3.business.api.SekiroInvoker;
import cn.iinti.sekiro3.business.api.invoker.Call;
import cn.iinti.sekiro3.business.api.invoker.Callback;
import cn.iinti.sekiro3.business.api.invoker.InvokerRequest;
import cn.iinti.sekiro3.business.api.invoker.InvokerResponse;

import java.io.IOException;


public class SekiroInvokerStart {
    public static void main(String[] args) {

        SekiroInvoker sekiroInvoker = new SekiroInvoker("7cd51507-cb3a-4a8a-aba2-4c6d66906e9d");

        InvokerRequest invokerRequest = new InvokerRequest.Builder()
                .group("test")
                .action("test")
                .field("param", "testParam")
                .build();

        sekiroInvoker.newCall(invokerRequest).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
            }

            @Override
            public void onResponse(Call call, InvokerResponse response) {
                System.out.println(response.string());
            }
        });

    }
}

自定义服务器

如果部署了自己的 Sekiro 集群服务器,那么调用时就需要指定自己的服务器。如下进行设定:

SekiroInvokerClient sekiroInvoker = new SekiroInvoker("7cd51507-cb3a-4a8a-aba2-4c6d66906e9d",new Stirng[]{"sekiro.iinti.cn:5612"});

请求方式

SekiroInvokerClient 支持同步请求和异步请求两种方式,sekiro天然支持异步,所以更建议使用异步方式调用

异步请求

package cn.iinti.sekiro3.business.samples;

import cn.iinti.sekiro3.business.api.SekiroInvoker;
import cn.iinti.sekiro3.business.api.invoker.Call;
import cn.iinti.sekiro3.business.api.invoker.Callback;
import cn.iinti.sekiro3.business.api.invoker.InvokerRequest;
import cn.iinti.sekiro3.business.api.invoker.InvokerResponse;

import java.io.IOException;


public class SekiroInvokerStart {
    public static void main(String[] args) {

        SekiroInvoker sekiroInvoker = new SekiroInvoker("7cd51507-cb3a-4a8a-aba2-4c6d66906e9d");


        InvokerRequest invokerRequest = new InvokerRequest.Builder()
                .group("test")
                .action("test")
                .field("param", "testParam")
                .build();

        sekiroInvoker.newCall(invokerRequest).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
            }

            @Override
            public void onResponse(Call call, InvokerResponse response) {
                System.out.println(response.string());
            }
        });


    }
}

同步请求

package cn.iinti.sekiro3.business.samples;

import cn.iinti.sekiro3.business.api.SekiroInvoker;
import cn.iinti.sekiro3.business.api.invoker.Call;
import cn.iinti.sekiro3.business.api.invoker.Callback;
import cn.iinti.sekiro3.business.api.invoker.InvokerRequest;
import cn.iinti.sekiro3.business.api.invoker.InvokerResponse;

import java.io.IOException;


public class SekiroInvokerStart {
    public static void main(String[] args) {

        SekiroInvoker sekiroInvoker = new SekiroInvoker("7cd51507-cb3a-4a8a-aba2-4c6d66906e9d");


        InvokerRequest invokerRequest = new InvokerRequest.Builder()
                .group("test")
                .action("test")
                .field("param", "testParam")
                .build();

        InvokerResponse execute = sekiroInvoker.newCall(invokerRequest).execute();
        System.out.println(execute.string());
    }
}
上次编辑于:
贡献者: liguobao