因为后端搭建起来的是grpc服务器,不能够直接使用http请求请求服务器,所以需要一个代理把前端的http请求变成grpc请求才行。因此便开始看看怎么去完成这个代理。看improbable-eng/grpc-web这个库的时候,发现它自己带了一个代理服务器grpcwebproxy。然后便照着它那边的安装方法去安装了。
安装
安装的话,就完全照着库那边的引导去安装了,但是首先要注意的是先安装go环境,并且在环境变量中把go的bin路径加入,加入路径的方式这位老哥说的很详细,链接。安装go环境的话,去官网下载就行了。装好之后,再安装dep。这个我是用homebrew安装的。或许也可以用其他方式安装。安装dep耗时非常久,只能慢慢等了。然后就是按照grpc-web的流程去安装了。如图1.1,每一行都是一个命令行语句。

它那边还有个使用现有的二进制文件的,但是我不会用这个二进制文件,所以就直接用building from source了。好了,安装好之后,在~/go/bin下面就会有个grpcwebproxy的可执行文件。这边建议把这个也加入环境变量中,这样就可以随时执行了。
使用
使用的话,很简单,在命令行敲入grpcwebproxy [options]就可以了。但是问题是按照grpc-web库中的使用方法,如图1.2,没有办法连上服务器。所以便看了一下源码。发现还有比较多的命令行选项没有列出来,所以这边说明一下选项(也没写全,不过够用了), 如表1.1。

表1.1 | ||
---|---|---|
选项 | 作用 | 默认 |
--server_tls_cert_file | 设置代理服务器的https证书, 开启https代理服务器的时候必填 | 空 |
--server_tls_cert_key | 设置代理服务器的https证书key,开启https代理服务器的时候必填 | ../misc/localhost.key |
--use_websockets | 设置是否使用websocket | false |
--server_bind_address | 代理服务器地址 | 0.0.0.0 |
--backend_max_call_recv_msg_size | 设置单次请求可接受后端的最大信息量, 默认4MB,单位字节 | 4MB |
--allow_all_origins | 设置cors,写了这个表示允许所有域名可以访问 | 空 |
--run_http_server | 设置是否启用http代理(表示启用接受http请求的代理服务器) | true |
--run_tls_server | 设置是否启用https代理(表示启用接受https请求的代理服务器) ,注意设置这个选项之后,必须要设置 --server_tls_cert_file 和 --server_tls_cert_key | true |
--server_http_debug_port | 设置启用的http代理服务器的端口号,默认8080 | 8080 |
--server_http_tls_port | 设置启用的https代理服务器的端口号,默认8443 | 8443 |
--backend_addr | 设置远端服务器的地址,包括主机名和端口 | 空 |
--backend_tls_noverify | 设置是否跳过证书检查,生产环境请勿使用 | false |
--backend_client_tls_cert_file | 设置远端服务器请求客户端证书的时候,客户端的证书位置 | 空 |
--backend_client_tls_key_file | 设置远端服务器请求客户端证书key的时候,客户端的证书key的位置 | 空 |
--backend_tls | 设置远端服务器是否开启了https服务 | false |
--allowed_headers | 设置代理服务器允许的http头部 | 空 |
--allowed_origins | 设置代理服务器允许的http域名 | 空 |
因为我用来作为本地开发,远端是https服务,需要使用websockets,所以如下配置,客户端证书用openssl生成,如何生成可以看看这位大佬的文章:
grpcwebproxy --backend_addr=远端服务器地址 --backend_tls=true --backend_client_tls_cert_file=客户端证书路径 --backend_client_tls_key_file=客户端证书key路径 --run_tls_server=false --allow_all_origins
输入之后代理成功启动(这边我已经把grpcwebproxy加入环境变量),项目的基础请求路径改成代理服务器地址之后,可以成功发起请求,完成代理。再写一条远端非https服务器,然后使用websocket的指令:
grpcwebproxy --backend_addr=远端服务器地址 --backend-tls=false --run_tls_server=false --use_websockets=true
OK,以上
网友评论