首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RSocket Net客户端请求流路由元数据到spring boot @MessageMapping路由

RSocket Net客户端请求流路由元数据到spring boot @MessageMapping路由
EN

Stack Overflow用户
提问于 2021-02-04 03:11:20
回答 2查看 305关注 0票数 1

rsocket routing metadata using RSocket-Java for Spring Rsocket Server类似,但对于RSocket Net客户端,我们对端口7000上的websocket端点路由使用了spring boot @MessageMapping,它根据路由返回webfluxes。例如:

代码语言:javascript
复制
@MessageMapping(value = "helloWorld")
public Flux<String> getFluxSocket() {
    log.traceEntry();
    log.info("In hello world");
    
    return Flux.just("{\"Hello\":\"World\"}");
}

当spring boot服务器在本地运行时,要获得这个流量,您可以使用rsc client

java -jar rsc.jar --debug --request --route helloWorld ws://localhost:7000

或者用于流

java -jar rsc.jar --debug --stream --route myStream ws://localhost:7000

为了在C# Net中以编程方式做到这一点,它说here在RSocket Net中还不支持请求路由,但可以使用元数据有效负载。有没有人拿到了这个的净等价物?

代码语言:javascript
复制
CompositeByteBuf metadata = ByteBufAllocator.DEFAULT.compositeBuffer();
RoutingMetadata routingMetadata = TaggingMetadataCodec.createRoutingMetadata(ByteBufAllocator.DEFAULT, List.of("/route"));
CompositeMetadataCodec.encodeAndAddMetadata(metadata,
        ByteBufAllocator.DEFAULT,
        WellKnownMimeType.MESSAGE_RSOCKET_ROUTING,
        routingMetadata.getContent());

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-12 23:38:32

要使RSocket网络路由为字符串客户机工作,请使用

代码语言:javascript
复制
var client = new RSocketClient(new WebSocketTransport("ws://127.0.0.1:7000/"));

Console.WriteLine("Connect Async");
await client.ConnectAsync(new RSocketOptions()
{
    MetadataMimeType = "message/x.rsocket.routing.v0",      
    DataMimeType = "application/json"
});

String json = "{\"Hello\":\"World\"}

byte[] intBytes = BitConverter.GetBytes(6);
string stringBytes = Encoding.Default.GetString(intBytes, 0, 1);
string metaData = stringBytes + route;

var stringclient = new RSocketClient.ForStrings(client);
await stringclient.RequestStream(json, metaData)
.ForEachAsync((result) =>
{
    Console.WriteLine($"Result ===> {result}");
});

要使RSocket网络路由为二进制客户端工作,请使用

代码语言:javascript
复制
var client = new RSocketClient(new WebSocketTransport("ws://localhost:8080/"));
await client.ConnectAsync(new RSocketOptions()
{
    MetadataMimeType = "message/x.rsocket.routing.v0",
    DataMimeType = "application/octet-stream"
});

Console.WriteLine("Requesting Raw Protobuf Stream...");

var route = new ReadOnlySequence<byte>(new byte[]
{
    (byte) Encoding.UTF8.GetByteCount("request.stream")
}.Concat(Encoding.UTF8.GetBytes("request.stream")).ToArray());

//Make a Raw binary call
var stream = client.RequestStream(
    resultmapper: result => 
(Data: Encoding.UTF8.GetString(result.data.ToArray()), 
Metadata: Encoding.UTF8.GetString(result.metadata.ToArray())),
data: new ReadOnlySequence<byte>(Encoding.UTF8.GetBytes("test")), 
metadata: route);

await stream.ForEachAsync(persons => 
Console.WriteLine($"RawDemo.OnNext===>[{persons.Metadata}]{persons.Data}"));
票数 0
EN

Stack Overflow用户

发布于 2021-02-04 12:31:30

在.NET库正式支持路由/复合站点元数据之前,您可以实现路由元数据。如果您不需要发送除路由元数据之外的任何元数据,则不需要创建复合元数据。只发送路由元数据非常简单。

正如您从规范中看到的,只需将路由名称的长度添加到第一个字节。https://github.com/rsocket/rsocket/blob/master/Extensions/Routing.md

我对.NET一无所知,所以我将向您展示如何用Java和JavaScript实现它。仅供参考。

https://github.com/making/demo-rsocket/blob/master/vanilla-rsocket-client/src/main/java/com/example/vanillarsocketclient/VanillaRsocketClientApplication.java

代码语言:javascript
复制
static ByteBuffer routingMetadata(String tag) {
    final byte[] bytes = tag.getBytes(StandardCharsets.UTF_8);
    final ByteBuffer buffer = ByteBuffer.allocate(1 + bytes.length);
    buffer.put((byte) bytes.length);
    buffer.put(bytes);
    buffer.flip();
    return buffer;
}

https://github.com/making/demo-rsocket-jsug/blob/master/frontend/vanilla/src/index.js

代码语言:javascript
复制
const routingMetadata = (route) => {
    return String.fromCharCode(route.length) + route;
};
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66034186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档