JavaAPI
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());
}
}