js_RPC,sekiro框架,实现HTTPS通讯

1、sekiro服务端部署

项目地址:yint-tech/sekiro-open: SEKIRO是一个多语言的、分布式、网络拓扑无关的服务发布平台,通过书写各自语言的handler将功能发布到中心API市场,业务系统通过RPC的方式使用远端节点的能力 (github.com)icon-default.png?t=N176https://github.com/yint-tech/sekiro-open文档地址:

服务器部署 · Sekiro系统文档 (iinti.cn)icon-default.png?t=N176http://sekiro.iinti.cn/sekiro-doc/02_server/1.busniess_server.html所用环境是Ubuntu20

安装步骤:

1、安装docker

我参照的是这个文档

(48条消息) Ubuntu安装 Docker_胡八一 的博客-CSDN博客_ubuntu安装dockericon-default.png?t=N176https://blog.csdn.net/qq_44732146/article/details/121207737

2、安装docker-compose

sudo pip install docker-compose

3、安装sekiro

启动docker之后,执行如下命令,如果失败,可以直接执行下面的quickstart.sh文件

curl https://oss.iinti.cn/sekiro/quickstart.sh | bash

或者直接执行下面这个quickstart.sh

#!/usr/bin/env bash
now_dir=`pwd`

if [ ! -d sekiro_compose ]; then
   mkdir "sekiro_compose"
else
   rm -rf sekiro_compose/*
fi

cd sekiro_compose

curl -o "sekiro_compose.zip" "https://oss.iinti.cn/sekiro/sekiro-compose.zip"

(unzip --help) </dev/null >/dev/null 2>&1 || {
  echo
  echo "no unzip cmd , please install unzip first: yum install -y unzip"
  exit 4
}


unzip sekiro_compose.zip

sudo docker-compose down;

sudo docker pull registry.cn-beijing.aliyuncs.com/iinti/common:sekiro3server-latest

sudo docker-compose up -d

如下图:

 打开网址http://服务器的IP:5612

 注册账号,第一个注册账号是超级管理员

 

4、接下来,尝试过几种不同的方法让客户端和服务器连接上

下面的截图是官方的教程

 (1)构造子域名的方法

        在服务器的/etc/hosts文件里面配置如下

127.0.0.1   sekiro.licdn.com   (后面的这个域名是自己随便起的)

现在浏览器打开 http://sekiro.licdn.com:5612 看看是不是能正常打开进去网站,用刚刚注册的账号密码进行登录,这个带域名的网站和刚刚的网站是同一个网站。

      下一步安装CA证书,官网有提供证书,直接下载。我下载的是pem格式的证书。

SSL证书方案 · Sekiro系统文档http://sekiro.iinti.cn/sekiro-doc/01_user_manual/6.sslForWebsocket.htmlUbuntu命令行安装证书,直接搜索网上的,可以使用。

 过程图

现在浏览器打开 https://sekiro.licdn.com:5612 看看是不是能正常打开进去网站,注意http修改成了https,我到这一步的时候,还是会报不安全,截图如下:

安装证书还是提示Warning: Potential Security Risk Ahead,后来我在浏览器上调整了浏览器安全证书的容忍度,也是网上搜的,好像调整一下就好了,具体记不清楚了,大家可以试一下。

 接下来注入js代码,并建立wss连接,复制官方的代码:

如下并做局部修改,将下面的wss://www.linkedin.cn/business/register?group=ws-group&clientId=修改为wss://sekiro.licdn.com:5612/business/register?group=ws-group&clientId=

function SekiroClient(e){if(this.wsURL=e,this.handlers={},this.socket={},!e)throw new Error("wsURL can not be empty!!");this.webSocketFactory=this.resolveWebSocketFactory(),this.connect()}SekiroClient.prototype.resolveWebSocketFactory=function(){if("object"==typeof window){var e=window.WebSocket?window.WebSocket:window.MozWebSocket;return function(o){function t(o){this.mSocket=new e(o)}return t.prototype.close=function(){this.mSocket.close()},t.prototype.onmessage=function(e){this.mSocket.onmessage=e},t.prototype.onopen=function(e){this.mSocket.onopen=e},t.prototype.onclose=function(e){this.mSocket.onclose=e},t.prototype.send=function(e){this.mSocket.send(e)},new t(o)}}if("object"==typeof weex)try{console.log("test webSocket for weex");var o=weex.requireModule("webSocket");return console.log("find webSocket for weex:"+o),function(e){try{o.close()}catch(t){}return o.WebSocket(e,""),o}}catch(t){console.log(t)}if("object"==typeof WebSocket)return function(o){return new e(o)};throw new Error("the js environment do not support websocket")},SekiroClient.prototype.connect=function(){console.log("sekiro: begin of connect to wsURL: "+this.wsURL);var e=this;try{this.socket=this.webSocketFactory(this.wsURL)}catch(o){console.log("sekiro: create connection failed,reconnect after 2s"),setTimeout(function(){e.connect()},2e3)}this.socket.onmessage(function(o){e.handleSekiroRequest(o.data)}),this.socket.onopen(function(e){console.log("sekiro: open a sekiro client connection")}),this.socket.onclose(function(o){console.log("sekiro: disconnected ,reconnection after 2s"),setTimeout(function(){e.connect()},2e3)})},SekiroClient.prototype.handleSekiroRequest=function(e){console.log("receive sekiro request: "+e);var o=JSON.parse(e),t=o.__sekiro_seq__;if(!o.action)return void this.sendFailed(t,"need request param {action}");var n=o.action;if(!this.handlers[n])return void this.sendFailed(t,"no action handler: "+n+" defined");var s=this.handlers[n],i=this;try{s(o,function(e){try{i.sendSuccess(t,e)}catch(o){i.sendFailed(t,"e:"+o)}},function(e){i.sendFailed(t,e)})}catch(r){console.log("error: "+r),i.sendFailed(t,":"+r)}},SekiroClient.prototype.sendSuccess=function(e,o){var t;if("string"==typeof o)try{t=JSON.parse(o)}catch(n){t={},t.data=o}else"object"==typeof o?t=o:(t={},t.data=o);(Array.isArray(t)||"string"==typeof t)&&(t={data:t,code:0}),t.code?t.code=0:t.status?t.status=0:t.status=0,t.__sekiro_seq__=e;var s=JSON.stringify(t);console.log("response :"+s),this.socket.send(s)},SekiroClient.prototype.sendFailed=function(e,o){"string"!=typeof o&&(o=JSON.stringify(o));var t={};t.message=o,t.status=-1,t.__sekiro_seq__=e;var n=JSON.stringify(t);console.log("sekiro: response :"+n),this.socket.send(n)},SekiroClient.prototype.registerAction=function(e,o){if("string"!=typeof e)throw new Error("an action must be string");if("function"!=typeof o)throw new Error("a handler must be function");return console.log("sekiro: register action: "+e),this.handlers[e]=o,this};

var client = new SekiroClient("wss://www.linkedin.cn/business/register?group=ws-group&clientId=" + Math.random());
client.registerAction("testAction", function (request, resolve, reject) {
	  c = undefined;
      resolve(window.ja("d_incareer2_profile_homepage", c));
});

 回车如下:

 但是好景不长呀,后面没多久就出问题了,如下:

在其他HTTPS网站是可以用的,但是到这个网站就不行,可能是这个网站的安全等级比较高,可能是证书问题嘛?也不太清楚 , 后来我访问https://sekiro.licdn.com:5612/时,发现还是不安全的。

当天这个问题没有解决,第二天了,继续。

更新一下docker

 给浏览器设置代理到127.0.0.1 5612,这样浏览器访问就会经过sekiro服务器

重新将上面的wss连接进行修改如下:

var client = new SekiroClient("wss://www.linkedin.cn/business/register?group=ws-group&clientId=xxxxx");这样wss建立连接的时候,访问www.linkedin.cn就会走到sekiro服务器上

浏览器调用接口

 测试成功!!!!

(2)sekiro和浏览器不在同一台电脑

sekiro启动成功之后,wss从客户端和服务端建立连接的时候,连接可以写域名或者服务器的ip地址,如var client = new SekiroClient("wss://192.168.126.131:5612/business/register?group=ws-group&clientId=xxxxx");或者var client = new SekiroClient("wss://sekiro.licdn.com:5612//business/register?group=ws-group&clientId=xxxxx");要保证的是电脑得配置hosts

 这样就可以通过RPC远程调用JS函数,拿到数据,进行访问请求。

 初次接触,写的不对的地方,请大家见谅,部分图片来源网络,如有请权,立即删除。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
`spdk_rpc_register()` 和 `SPDK_RPC_REGISTER()` 都是用于注册 SPDK RPC 方法的函数,但是它们的使用方式略有不同。 `spdk_rpc_register()` 是 SPDK 中定义的一个函数,用于注册一个完整的 RPC 方法,需要手动构造一个 `struct spdk_rpc_method` 结构体,该结构体包含了 RPC 方法的名称、处理函数、参数个数等信息,然后将该结构体作为参数传递给 `spdk_rpc_register()` 函数。 例如,我们可以使用 `spdk_rpc_register()` 函数来注册一个名为 `example_rpc` 的 RPC 方法: ```c static void example_rpc_handler(struct spdk_jsonrpc_request *request, const struct spdk_json_val *params) { // 处理 RPC 请求的代码 } static struct spdk_rpc_method example_rpc_method = { .name = "example_rpc", .method = example_rpc_handler, .min_args = 0, .max_args = 0, }; static void example_rpc_init(void) { spdk_rpc_register(&example_rpc_method); } ``` `SPDK_RPC_REGISTER()` 是 SPDK 中定义的一个宏,使用起来比较简洁,可以直接将 RPC 方法的名称和处理函数作为参数传递给该宏,该宏会自动构造一个 `struct spdk_rpc_method` 结构体,并将其注册为 RPC 方法。 例如,我们可以使用 `SPDK_RPC_REGISTER()` 宏来注册一个名为 `example_rpc` 的 RPC 方法: ```c static void example_rpc_handler(struct spdk_jsonrpc_request *request, const struct spdk_json_val *params) { // 处理 RPC 请求的代码 } SPDK_RPC_REGISTER("example_rpc", example_rpc_handler); ``` 总的来说,`SPDK_RPC_REGISTER()` 更加简便,可以省去手动构造 `struct spdk_rpc_method` 结构体的步骤,但是对于一些特殊的 RPC 方法,可能需要使用 `spdk_rpc_register()` 函数来进行注册。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值