久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

去中心化計(jì)算的未來(lái):通過(guò) RPC 從微服務(wù)過(guò)渡到 WASM

 supercodec 2021-05-06

在另外一篇文章《區(qū)塊鏈,、硬件與面向服務(wù)的架構(gòu),,WASM 即將迎來(lái)大爆發(fā)?》,,里面有絕佳的瀏覽器內(nèi)的 WASM 應(yīng)用程序示例,,并輔以了對(duì)WebAssembly(Wasm)的詳細(xì)解釋。

但正如我們前文所說(shuō),,Wasm 也正在從客戶端走向服務(wù)端,。

瀏覽器之外

Wasm 不僅僅是瀏覽器的字節(jié)碼。 Wasm 有著前所未有的強(qiáng)大的可移植性,、高效率和靈活性,。因此,我們現(xiàn)在可以做到,,以多種不同語(yǔ)言編寫(xiě)瀏覽器內(nèi) Wasm 應(yīng)用程序,,發(fā)展到在所有設(shè)備上分發(fā) Wasm 獨(dú)立功能單元,在這一點(diǎn)上取得飛躍,。

Wasm 執(zhí)行環(huán)境可以包括最少的 shell,、移動(dòng)設(shè)備、臺(tái)式機(jī)和物聯(lián)網(wǎng)設(shè)備,。Wasm 可能會(huì)推動(dòng)從微芯片乃至整個(gè)數(shù)據(jù)中心,,這所有一切的發(fā)展(Webassembly.org,2019),。

file

為什么跨越瀏覽器很重要,?

當(dāng)連接到現(xiàn)代 Web 服務(wù)時(shí),我們并非僅僅與一臺(tái)機(jī)器進(jìn)行交互,,而是持續(xù)和后臺(tái)可能數(shù)千臺(tái)機(jī)器進(jìn)行交互( Arpaci-Dusseau 和Arpaci-Dusseau,,2018 )。

網(wǎng)站越復(fù)雜,,運(yùn)營(yíng)成本就越高,。散布在分布式系統(tǒng)上的微服務(wù)需要盡最大可能做到簡(jiǎn)單、高效和可靠,。對(duì)于 Facebook,、Google 這種大公司來(lái)說(shuō),這些特性意味著可以節(jié)省大量能耗,,進(jìn)而節(jié)省成本,,促成積極成果,。

除了這些能輕易做到的,我們還應(yīng)該積極試驗(yàn),,以找到方法來(lái)改善 Wasm 最終用戶/消費(fèi)者體驗(yàn),。 eBay 就是一個(gè)很好的例子。

利用 Wasm,,eBay 最近很好地完善了其移動(dòng)條形碼掃描儀的實(shí)現(xiàn),,恰到好處地為客戶提供了最優(yōu)服務(wù)( Tech.,2019),。

為什么選 Wasm,?

首先我們需要了解下“抽象化”。

雖然操作系統(tǒng)抽象化對(duì)于構(gòu)建分布式系統(tǒng)來(lái)說(shuō)是一個(gè)糟糕的選擇,,但編程語(yǔ)言抽象化卻更具意義,。 (阿帕奇-杜索和阿帕奇-杜索,2018),。Wasm 作為從一開(kāi)始就使用形式語(yǔ)義設(shè)計(jì)的第一種主流編程語(yǔ)言,,進(jìn)一步地提供了對(duì)現(xiàn)代硬件的抽象化的支持(Rossberg等,2018),。

Wasm 允許在最大量的源代碼語(yǔ)言中編寫(xiě)和共享每個(gè)單個(gè)功能的邏輯,。Wasm符合我們熟知的最佳軟件原則和慣例(DRY 和 KISS),,并提供了必要時(shí)在所有設(shè)備之間轉(zhuǎn)換可執(zhí)行代碼的方法,。

為什么要進(jìn)行遠(yuǎn)程過(guò)程調(diào)用(Remote Procedure Call)?

從進(jìn)程間通信(IPC)角度來(lái)看,,最主要的抽象化是基于遠(yuǎn)程程序調(diào)用(Remote Procedure Call)的概念,,簡(jiǎn)稱 RPC。(Arpaci-Dusseau和Arpaci-Dusseau,,2018),。

要實(shí)現(xiàn)這種分布式機(jī)器之間普遍存在的互操作性,需要具備允許任何應(yīng)用程序(以任何語(yǔ)言編寫(xiě))直接從任何其他分布式機(jī)器調(diào)用服務(wù)的功能,,就好像它只是調(diào)用自己的本地對(duì)象一樣,。 這正是遠(yuǎn)程過(guò)程調(diào)用 (RPC) 技術(shù)所實(shí)現(xiàn)的。

本文的目標(biāo)是使用 Wasm 和 RPC 在 web 上執(zhí)行與語(yǔ)言無(wú)關(guān)的通用代碼,。

在下一節(jié)中,,會(huì)講解如何:

  1. 編寫(xiě)自定義的 Rust 代碼并編譯為 Wasm
  2. 設(shè)置 RPC 服務(wù)器
  3. 在 RPC 服務(wù)器上定義自定義服務(wù)
  4. 安裝 Wasm 虛擬機(jī)(WAVM)
  5. 通過(guò) HTTP Post(即Curl,Python等)遠(yuǎn)程執(zhí)行自定義 WebAssembly(Wasm)代碼file

1.編寫(xiě)自定義的 Rust 代碼并編譯為 Wasm

安裝 Rust

curl --proto '=https' --tlsv1.2 -sSf https://sh. (https://sh./) | shsource $HOME/.cargo/env復(fù)制代碼

創(chuàng)建新的 Rust 項(xiàng)目

cd ~
cargo new --lib add_numbers_via_wavm
cd add_numbers_via_wavm復(fù)制代碼

編輯 Cargo.toml 文件; 添加 lib 部分 ,,同時(shí)也添加依賴項(xiàng),,如下所示

[lib]
name = "adding_lib"
path = "src/adding.rs"
crate-type =["cdylib"][dependencies]
serde_json = "1.0"復(fù)制代碼

在命令行中添加必要的 Wasm 軟件和配置

rustup target add wasm32-wasi
rustup override set nightly復(fù)制代碼

創(chuàng)建一個(gè)名為 ~/.cargo/config 的新文件。并將以下構(gòu)建文本放入這個(gè)新創(chuàng)建的配置文件中,。

[build]
target = "wasm32-wasi"復(fù)制代碼

編寫(xiě)一個(gè)我們可以調(diào)用的有不同的功能的定制的 Rust 程序,。在下面的例子中,,函數(shù)“ double”和“ triple” 會(huì)分別取一個(gè)整數(shù)并分別乘以 2 和 3。

use serde_json::json;
pub extern fn print(answer: i32){
let the_answer = json!({
"Result": answer});
println!("{}", the_answer.to_string());
}
#[no_mangle]
pub extern fn double(x: i32){
let z = x * 2;
print(z);
}
#[no_mangle]
pub extern fn triple(x: i32){
let z = x * 3;
print(z);
}復(fù)制代碼

可以使用以下命令編譯上面的代碼

cargo build --release復(fù)制代碼

2. 設(shè)置 RPC 服務(wù)器

這里給大家推薦一個(gè)簡(jiǎn)潔的 C++ RPC 服務(wù)器,,叫做 [rpcsrv] (https://github.com/jgarzik/rpcsrv),。 我們要使用這個(gè) C++ RPC 服務(wù)器來(lái)接受 HTTP POST 并通過(guò) C++ 將它們轉(zhuǎn)換為系統(tǒng)調(diào)用。

sudo apt-get update
sudo apt-get -y upgrade
sudo apt-get install autoconf
sudo apt install libevent-2.1-6
sudo apt-get install libevent-dev
sudo apt-get install libtool
cd ~
git clone https://github.com/jgarzik/rpcsrv.git
cd ~/rpcsrv
git submodule update --init
./autogen.sh
./configure
make
sudo make install復(fù)制代碼

使用以下命令開(kāi)啟 RPC 服務(wù)

sudo ./rpcsrvd --listen-port 8080復(fù)制代碼

3. 在 RPC 服務(wù)器上定義自定義服務(wù)

在我們進(jìn)一步討論之前,,我想簡(jiǎn)單地討論一下 JSON 的使用,。 我簡(jiǎn)要地探索了一個(gè)關(guān)于單值的絕妙概念。 Univalue 是一個(gè)高性能的 RAII C++ JSON 庫(kù)和通用值對(duì)象類,。我之后會(huì)找時(shí)間針對(duì)這個(gè)做徹底的研究,。

方便起見(jiàn),我結(jié)合使用了 UniValue 和 rapidjson,。 同樣,,我也需要更多的時(shí)間來(lái)研究,來(lái)找到數(shù)據(jù)交換和互操作性的最佳方法,,我們之后再進(jìn)行討論,。

下面的代碼用于安裝 rapidjson

cd ~
https://github.com/Tencent/rapidjson.git
cd ~/rapidjson
git submodule update --init
mkdir build
cd ~/rapidjson/build/
cmake ..
sudo cp -rp ~/rapidjson/include/rapidjson /usr/include/復(fù)制代碼

在安裝 rapidjson 之后,,我修改了原始 C++ API 文件,,以便在 rpcsrvcodebase 中包含 rapidjson 功能。

#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
#include <iostream>
using namespace rapidjson;復(fù)制代碼

在這個(gè)階段,,我們可以繼續(xù)在 C++ 代碼中使用 rapidjson 功能,。 下面是一個(gè)示例,演示如何修改原始 echo 函數(shù)

//
// RPC "echo"
//
static UniValue myapi_1_echo(const UniValue & jreq,
  const UniValue & params) {
  // Receive and parse incoming parameters
  string s = params.write();
  const char * theJson = s.c_str();
  Document d;
  d.Parse(theJson);
  // Assign parameters to C++ variables and print to console
  Value & theService = d["Service Name"];
  Value & theType = d["Type"];
  Value & theFunctionName = d["Execution"]["FunctionName"];
  Value & theArgument = d["Execution"]["Argument"];
  cout << endl;
  cout << "Received a new request to execute a service on Wasm Virtual
  Machine..." << endl;
  cout << s.c_str() << endl;
  cout << endl;
  cout << "Service Name is: " << theService.GetString() << endl;
  cout << "Service Type is: " << theType.GetString() << endl;
  cout << "Wasm function is: " << theFunctionName.GetString() << endl;
  cout << "Wasm function argument: " << theArgument.GetString() <<
    endl;
  
  // Construct and execute the call to Wasm Virtual Machine
  string commandString = "wavm run --abi=wasi --function=";
  commandString += theFunctionName.GetString();
  commandString += " ";
  commandString += "~/add_numbers_via_wavm/target/wasm32
  wasi / release / adding_lib.wasm ";
  commandString += " ";
  commandString += theArgument.GetString();
  cout << "\n";
  cout << "Executing command ... " << endl;
  string theWasmResults =
    execute_function_and_return_output(commandString);
  
  // Print the result to console
  cout << "Results are as follows ...: " << endl;
  cout << theWasmResults << endl;
  UniValue result(theWasmResults);
  cout << "Finished." << endl;
  // Return the results back to the caller of the RPC
  return jrpcOk(jreq, result);
}復(fù)制代碼

4. 安裝Wasm 虛擬機(jī)(WAVM)

WAVM 使用 LLVM將 WebAssembly 代碼編譯成機(jī)器代碼,,其性能接近原生性能,。

下面是安裝 WAVM的說(shuō)明

sudo apt-get install gcc
sudo apt-get install clang 
wget https://github.com/WAVM/WAVM/releases/download/nightly%2F2019-11-04/wavm-0.0.0-prerelease-linux.deb
sudo apt install ./wavm-0.0.0-prerelease-linux.deb復(fù)制代碼

5. 通過(guò) HTTP Post (即 Curl、 Python 等)遠(yuǎn)程執(zhí)行自定義 WebAssembly (Wasm) 代碼

執(zhí)行可以由任何能夠生成 HTTP POST 的機(jī)制執(zhí)行,。 例如,,從 Postman這樣的 GUI 到 Linux curl 命令,當(dāng)然還有像 PythonJava 這樣的解釋和編譯代碼庫(kù),。

下面是在 linux 命令行中使用 Curl 的調(diào)用代碼示例

Curl - 傳入一段有效的JSON代碼

tpmccallum$ curl --header "Content-Type: application/json" --request POST --data '{"jsonrpc":"2.0","method":"echo","params":{"Service Name": "Double the digits","Type": "Execution","Execution": {"FunctionName": "double","Argument": "10"}}, "id":1}' [http://123.456.78.9:8080/rpc/1](http://localhost:8080/rpc/1)復(fù)制代碼

當(dāng)查看這個(gè)調(diào)用代碼時(shí),,請(qǐng)記住 Rust 程序( Wasm 最早緣起于 Rust) 有兩個(gè)函數(shù): “ double”和“ triple”。 增加的 RPC 層意味著這些原始函數(shù)現(xiàn)在被定義為兩個(gè)單獨(dú)的服務(wù),。

正如上面所看到的,,我們不僅要指定想調(diào)用的服務(wù),還要指定所需的單個(gè)參數(shù),。 當(dāng)這個(gè) POST 在 web 上執(zhí)行時(shí),,RPC 服務(wù)器直接調(diào)用 WAVM,然后返回一個(gè) JSON 結(jié)果對(duì)象給調(diào)用代碼,。

返回有效的 JSON

{
 "jsonrpc": "2.0",
 "result": {
  "Result": 20
 },
 "id": 1
}復(fù)制代碼

返回對(duì)象是完全可配置的,,這只是一個(gè)返回計(jì)算結(jié)果的簡(jiǎn)單示例,。

RPC 服務(wù)器輸出

RPC 服務(wù)器輸出是可選的,這里只是為了演示而創(chuàng)建的,。 這里演示了 RPC 服務(wù)器可以來(lái)回傳遞 JSON,。其他格式也有機(jī)會(huì)內(nèi)置到 RPC 層(位于 Rust 和 Wasm 代碼之上)。

Received a new request to execute a service on Wasm Virtual Machine... {"Service Name":"Double the digits","Type":"Execution","Execution":{"FunctionName":"double","Argument":"10"}}Service Name is: Double the digits
Service Type is: Execution
Wasm function is: double
Wasm function argument: 10Executing command ...Results are as follows ...:
{"Result":20}Finished.復(fù)制代碼

Python - 傳入一段有效的JSON代碼

系統(tǒng)設(shè)置

sudo apt-get install python-pip
pip install json-rpc
pip install requests復(fù)制代碼

我們將 Python 傳入一段有效的JSON代碼,,描述我們需要哪種服務(wù),。 在這個(gè)例子中,我們希望將數(shù)字10翻一倍,,即調(diào)用“ FunctionName” : “ double”和“ Argument” : “10”,。

>>>import requests
>>>import json

>>>url = "http://123.456.78.9:8080/rpc/1"
>>>payload = {
    "jsonrpc":"2.0","method":"echo","params":{"Service Name":"Double the digits","Type": "Execution","Execution": {"FunctionName": "double","Argument": "10"}}, "id":1
}
>>>response = requests.post(url, json=payload).json()復(fù)制代碼

現(xiàn)在我們可以看到,響應(yīng)返回執(zhí)行 Wasm 的結(jié)果,,即“ Result” : 20,。

>>> print response{u'jsonrpc': u'2.0', u'result': u'{"Result":20}, u'id': 1}復(fù)制代碼

我們可以通過(guò)調(diào)用另一個(gè)服務(wù)(即“ FunctionName” : “ triple” ,“ Argument” : “10”)再次嘗試這個(gè)方法

>>>url = "http://123.456.78.9:8080/rpc/1"
>>>payload = {
    "jsonrpc":"2.0","method":"echo","params":{"Service Name":"Triple the digits","Type": "Execution","Execution": {"FunctionName": "triple","Argument": "10"}}, "id":1
}
>>>response = requests.post(url, json=payload).json()復(fù)制代碼

同樣,,我們可以看到這個(gè)響應(yīng)是所選服務(wù)的正確結(jié)果,。

>>> print response
{u'jsonrpc': u'2.0', u'result': u'{"Result":30}', u'id': 1}復(fù)制代碼

本文通過(guò) RPC 演示了如何使用 Wasm 。我是一名熱情的開(kāi)源區(qū)塊鏈軟件研究人員,,也是 SecondState 公司(在達(dá)拉斯,、奧斯汀、北京和臺(tái)北設(shè)有辦公室)的核心開(kāi)發(fā) https://www.SecondState.io/ ,。 如果你想了解更多關(guān)于 Wasm 和其他可以提升業(yè)務(wù)的技術(shù),,請(qǐng)通過(guò)電子郵件GitHub 與我們聯(lián)系。

參考文獻(xiàn)

  1. Arpaci-Dusseau, R.H. 和 Arpaci-Dusseau, A.C.,,2018,, 《操作系統(tǒng):三個(gè)簡(jiǎn)單的部分》, Arpaci-Dusseau Books LLC.
  2. Rossberg, A., Titzer, B., Haas, A., Schuff, D., Gohman, D., Wagner, L., Zakai, A., Bastien, J. 以及 Holman, M. (2018),, 《使用 WebAssembly 加速網(wǎng)絡(luò)發(fā)展》, ACM通訊,,107-115頁(yè).
  3. Tech.. (2019),, eBay 上的 WebAssembly : 一個(gè)真實(shí)世界的案例, [在線資源] 可訪問(wèn): https://tech./engineering/webassembly-at-ebay-a-real-world-use-case/ [2019年11月20日訪問(wèn)].

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買(mǎi)等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多