“三源合一”,是 Solon 应用开发框架早期的一个架构想法。是指 Http、Socket、WebSocket 几个不同的通讯信号,进行统一架构处理…并且小巧。 对于 Socket 和 WebSocket,在原 消息+监听 的模式之外增加了 Mvc 模式(即 Handler + Context 接口处理)。
现在看来包括消息中间件的消息处理等等,都是可以转换成 Mvc 模式。怎么实现?这个太长了,这里只讲应用效果。
public class DemoApp {
public static void main(String[] args) {
Solon.start(DemoApp.class, args);
}
}
@Controller
public class HelloController {
@Mapping("/mvc/hello")
public Result hello(long id, String name) { //{code:200,...}
return Result.succeed();
}
}
Http 怎么调用?就不细讲了。
Socket.D 通读协议,在设计之前就考虑了一个接口(sendAndRequest)用于兼容 Http 的请求模式,也称为应签模式。具体参考:《Socket.D 协议转为 Mvc 接口》
public class DemoApp {
public static void main(String[] args) {
Solon.start(DemoApp.class, args, app -> {
app.enableSocketD(true);
});
}
}
//ToHandlerListene 监听器,会把 Socket.D 消息包转换成 Handler + Context 接口
@ServerEndpoint("/mvc/")
public class SocketdAsMvc extends ToHandlerListener {
}
@Controller
public class HelloController {
@Mapping("/mvc/hello")
public Result hello(long id, String name) { //{code:200,...}
return Result.succeed();
}
}
假如我们服务端启用的是sd:ws
协议架构,客户端要怎么调用?三种方式:
let clientSession = SocketD.createClient("sd:ws://localhost:28082/mvc/?u=a").open();
let request = new StringEntity("{id:1,name:'noear'}").metaPut("Content-Type","text/json"),
let response = clientSession.sendAndRequest("/mvc/hello", entity).await();
HelloService rpc = SocketdProxy.create("sd:ws://localhost:28082/mvc/?u=a", HelloService.class);
System.out.println("MVC result:: " + mvc.hello("noear"));
const clientSession = await SocketD.createClient("sd:ws://127.0.0.1:28082/mvc/?u=a")
.open();
//添加用户(加个内容类型,方便与 Mvc 对接)
const entity = SocketD.newEntity("{id:1,name:'noear'}").metaPut("Content-Type","text/json"),
clientSession.sendAndRequest("/mvc/hello", entity, reply=>{
alert(reply.dataAsString());
})
看起来是简单的,用起来还是要费点功夫的。具体参考:《WebSocket 协议转换为 Socket.D》
public class DemoApp {
public static void main(String[] args) {
Solon.start(DemoApp.class, args, app -> {
app.enableWebSocket(true);
});
}
}
//ToSocketdWebSocketListener 监听器,会把 WebSocket 转换成 Socket.D 协议;
//ToHandlerListene 监听器,会把 Socket.D 消息包转换成 Handler + Context 接口;(一共做了两次转换)
@ServerEndpoint("/mvc/")
public class WebSocketdAsMvc extends ToSocketdWebSocketListener {
public WebSocketAsMvc() {
super(new ConfigDefault(false), new ToHandlerListener());
}
}
@Controller
public class HelloController {
@Mapping("/mvc/hello")
public Result hello(long id, String name) { //{code:200,...}
return Result.succeed();
}
}
WebSocket 转换为 Socket.D 协议,就可以使用 Socket.D 的接口去调用了:)