servicecall_java_sdk - catyguan/sad GitHub Wiki

基于ServiceCall开发和使用服务 - JAVA SDK

SDK包说明

SDK采用Maven进行包管理

说明、版本及依赖

  • bma.servicecall-core-1.0.0 -- 业务核心代码包。无其他包的依赖
  • bma.servicecall-boot-1.0.0 -- 服务整合和启动的相关代码包
  • 依赖core
  • 依赖spring-context
  • bma.servicecall-httpclient-1.0.0 -- HTTP通信协议的客户端代码包
  • 依赖core
  • 依赖jackson
  • 依赖httpcomponents-httpclient
  • bma.servicecall-httpserver-1.0.0 -- HTTP通信协议的服务端代码包
  • 依赖core
  • 依赖boot
  • 依赖jackson
  • 依赖netty
  • bma.servicecall-sockclient-1.0.0 -- SOCKET通信协议的客户端代码包
  • 依赖core
  • 依赖sockcore
  • bma.servicecall-sockcore-1.0.0 -- SOCKET通信协议的编码代码包
  • 依赖core
  • bma.servicecall-sockserver-1.0.0 -- SOCKET通信协议的编码代码包
  • 依赖core
  • 依赖boot
  • 依赖sockcore
  • 依赖netty

场景说明

傻瓜式:可以直接使用bma.servicecall-all-1.0.0,包含全部包

纯开发:不需要考虑实际部署的话,只需要使用bma.servicecall-core-1.0.0

客户端:根据需要支持的不同通信协议,使用bma.servicecall-httpclient-1.0.0或bma.servicecall-sockclient-1.0.0

服务端:根据部署支持的不同通信协议,使用bma.servicecall-httpserver-1.0.0或bma.servicecall-sockserver-1.0.0

通用开发说明

调试信息

可采用以下初次化代码设置输出调试信息到JDK的Logger体系

Debuger.init(new JDKLogger("test"));

如果需要采用其他的调试信息输出方法,只需要实现bma.servicecall.core.ServiceCallLogger接口即可

客户端开发说明

构建Manager

Manager m = new Manager();

Manager可以采用Singleton模式

调用前新建Client对象

Client cl = manager.createClient();
try {
    ...
} finally {
    cl.close();
}

Client对象不建议重用

调用时候构建地址对象Address,请求对象Request和上下文对象Context,设置参数和设置

Address addr = new Address()
addr.setType("http");
addr.setApi("http://localhost:1080/test/hello");
Request req = new Request();
req.put("word", word);
...
Context ctx = new Context();
...

调用,获取应答和响应数据

Answer answer = cl.invoke(addr, req, ctx);
answer.checkError();
if (answer.isDone()) {
    ValueMap rs = answer.sureResult();
    String data = rs.getString("Data");
    ...
}

特殊场景的处理流程,请查阅相关范例。 事务, 异步

客户端单元测试

构造TestDriver并设置具体期望返回的Answer进行测试

TestDriver driver = new TestDriver();
driver.initDriver("http");
Answer answer = new Answer();
driver.addAnswer(answer);
...
cl.invoke(addr, req, ctx);

服务端开发说明

实现服务对象

public class SMHello implements ServiceMethod {

	@Override
	public void execute(ServicePeer peer, Request reqest, Context context) {
		...
	}
}

使用request和context获取参数和选项

String word = req.getString("word");
String who = context.getString("who");

构造Answer对象并使用peer进行响应

Answer a = new Answer();
a.setStatus(StatusConst.DONE);
a.sureResult().put("Data", r);
peer.writeAnswer(a, null);

特殊场景的处理流程,请查阅相关范例。 事务, 异步

服务端单元测试

构造TestServicePeer(空实现)进行测试

TestServicePeer peer = new TestServicePeer();
ServiceRequest request = new ServiceRequest();
request.put("word", "Hello Kitty");
Context context = new Context();
...

SMHello method = new SMHello();
method.execute(peer, request, context);

服务端部署说明

main方法启动

ServiceMux mux = new ServiceMux();
mux.setServiceMethod("test", "hello", new SMHello());
...

ServiceCallSocketServer server = new ServiceCallSocketServer();
server.setServiceMux(mux);
server.setPort(1080);
server.setExecutors(10);
server.startServer();
try {
	Thread.sleep(60 * 1000);
} finally {
	server.stopServer();
}

Spring方式启动

spring的配置xml

<bean id="serviceCallMux" class="bma.servicecall.core.ServiceMux">
	<property name="serviceMethods">
		<map>
			<entry key="test:hello" value-ref="SMHello" />
		</map>
	</property>
</bean>
...
<bean id="server" class="bma.servicecall.sockserver.ServiceCallSocketServer"
		destroy-method="close">
	<property name="port" value="1080" />
	<property name="executors" value="10" />
	<property name="serviceMux" ref="serviceCallMux" />
</bean>	
...
<bean id="booter" class="bma.servicecall.boot.SimpleServerBooter">
	<property name="main" ref="server"/>
</bean>

使用boot包的bma.servicecall.boot.ServerBoot对象启动

⚠️ **GitHub.com Fallback** ⚠️