创建VSOA的server端
创建工程
参考 hellovsoa 工程,创建 server 工程,工程源码修改如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "vsoa_platform.h"
#include "vsoa_server.h"
#define MY_SERVER_ADDR "0.0.0.0"
#define MY_SERVER_PORT (4001)
#define MY_SERVER_NAME "{\"name\":\"echo server\"}"
#define MY_SERVER_PASSWD "123456"
static void command_echo (void *arg, vsoa_server_t *server, vsoa_cli_id_t cid,
vsoa_header_t *vsoa_hdr, vsoa_url_t *url, vsoa_payload_t *payload)
{
struct sockaddr_in addr_in;
socklen_t namelen = sizeof(addr_in);
vsoa_server_cli_address(server, cid, (struct sockaddr *)&addr_in, &namelen);
printf("client %d addr is %s:%d\n", cid, inet_ntoa(addr_in.sin_addr), ntohs(addr_in.sin_port));
printf("message, url:%.*s, param:%.*s, data:%.*s\n",
(int)url->url_len, url->url,
(int)payload->param_len, payload->param,
(int)payload->data_len, (char *)payload->data);
vsoa_server_cli_reply(server, cid, 0, vsoa_parser_get_seqno(vsoa_hdr), 0, payload);
}
int main (int argc, char **argv)
{
vsoa_server_t *server;
/*
* 创建服务端
*/
server = vsoa_server_create(MY_SERVER_NAME);
if (!server) {
fprintf(stderr, "Can not create VSOA server!\n");
return (-1);
}
/*
* 设置密码,设置为NULL,表示密码为空,客户端可以不输入密码
*/
vsoa_server_passwd(server, MY_SERVER_PASSWD);
/*
* 创建RPC服务
*/
vsoa_url_t url;
url.url = "/echo";
url.url_len = strlen(url.url);
vsoa_server_add_listener(server, &url, command_echo, NULL);
/*
* 启动微服务
*/
struct sockaddr_in addr;
bzero(&addr, sizeof(struct sockaddr_in));
addr.sin_family = AF_INET;
addr.sin_port = htons(MY_SERVER_PORT);
addr.sin_addr.s_addr = inet_addr(MY_SERVER_ADDR);
addr.sin_len = sizeof(struct sockaddr_in);
if (!vsoa_server_start(server, (struct sockaddr *)&addr, sizeof(struct sockaddr_in))) {
vsoa_server_close(server);
fprintf(stderr, "Can not start VSOA server!\n");
return (-1);
}
/*
* 进入监听事件循环
*/
while (1) {
int cnt;
int max_fd;
fd_set fds;
struct timespec timeout = {1, 0 };
FD_ZERO(&fds);
max_fd = vsoa_server_fds(server, &fds);
cnt = pselect(max_fd + 1, &fds, NULL, NULL, &timeout, NULL);
if (cnt > 0) {
vsoa_server_input_fds(server, &fds);
}
}
return (0);
}
源码分析:
- VSOA 服务端 API 函数更详细说明可以查看博客https://blog.csdn.net/ScilogyHunter/article/details/140816123。
- server 端有一个固定框架:创建服务端,设置密码,创建RPC服务(可选),启动微服务和进入监听事件循环。所有服务端基本都按这个框架来写即可,只是配置参数和注册的服务依据实际需求而改动。
- 调用vsoa_server_create 函数里创建服务端对象,需要输入一个 json 字符串格式的参数,必须包含 name 字段的微服务名称。
- 密码必须设置,否则会认为设置了一个随机密码,影响正常通信,如果确实不想使用密码,输入参数可以设为 NULL。密码是一个没有任何安全加密的字符串,在当前版本中只是一个相对简单的安全管理。
- 创建RPC服务是可选项,也可以是发布订阅、数据流或数据报等,具体由业务需求决定。
- 启动微服务需要配置自身的 IP地址,支持 ipv4 和 ipv6,IP地址"0.0.0.0"表示任意或全部主机 IP,IP地址“127.0.0.1"表示自回环网卡 IP,只用于本机内部通信。如果开始时绑定的端口为
0
,系统将自动分配一个端口。 - VSOA 微服务在启动成功之后,它应当始终监听所有的 VSOA 输入事件。
- 本示例程序中注册了一个 url 为"/echo"的 RPC 服务,当有客户端调用该服务时,会自动回调注册的command_echo 函数。该函数中限打印客户端信息和 message 信息,然后将接收的message 信息原样”反射“给客户端。
- VSOA payload 同时带载 param 和 data,param 推荐格式为 JSON,data 可以是普通二进制数据、字符串、json、 protobuf 等其他格式的载荷。总之不同数据类型使用不同的带载方式可以提高数据吞吐效率。
执行程序
编译、部署、并运行 server 程序,命令行会进入阻塞状态,等待客户端请求。
安装 vMessenge
VSOA Messenger(简称 vMessenger)是翼辉信息专为 VSOA 微服务开发而设计的测试仿真工具,提供 VSOA 客户端请求、环境变量、模拟服务器和 Proxy 代理管理等功能,方便开发者以更简单直观的方式进行 VSOA 客户端和服务端的开发、调试及数据模拟,从而提升产品开发效率和便利性。
在开发 VSOA 服务端时,开发者可以使用 vMessenger 创建客户端请求,向正在开发的服务端发送请求数据,以验证服务端是否可以正常响应。同样地,在开发 VSOA 客户端时,开发者可以通过 vMessenger 创建一个模拟服务器来模拟服务端接收请求,并返回相应的数据结构,以验证客户端请求信息的准确性。
下载地址:获取 vMessenger 安装包
下载完成后,双击安装包,按照提示安装即可。
使用 vMessenge 工具辅助测试
-
新建 vClient 集合。
-
新建客户端请求,并配置名称。
-
配置服务端 URL 和密码。
-
配置请求参数和请求数据。
-
发送请求并查看结果。