RabbitMQ in Sql Server CLR

sql CLR 程序集部署步骤比较多且复杂 这里自己记录一下

https://gitee.com/wilsonjw/RabbitMQ-SqlServer

项目主要参考引用下面这些博客

1 项目在nberglund 的开源项目上修改而来 https://github.com/nberglund/RabbitMQ-SqlServer

2 二进制dll 转换工具 https://github.com/SqlQuantumLeap/BinaryFormatter

3 关于sql server 安全程序及讨论及解决方案

部署的基本环境

  • 数据库服务器版本 MSSql Server 2014+
  • MQ .net 客户端版本  RabbitMq.Client 4.0(.net framework 4)

低于2014 版本的sql server 只能支持到 .net framework 3.5 在我的项目中没有去做支持,nberglund 的开源项目中有对应的 程序集

解决方案的结构

  • RabbitMQSqlClr4:最终要部署到clr 中的程序集 处理消息的发送
  • RabbitMQSqlClr.Consumer:是一个控制台mq 消费端 接收消息后处理消息的。
  • 算上 依赖的关联   RabbitMQ.Client    Microsoft.Diagnostics.Tracing.EventSource  实际注册到 CLR 中的程序及一共有3个dll

在安装脚本中已经通过BinaryFormatter工具将编译后的dll 转换成了二进制放在了脚本中了。

部署成功后在sql server 中看见这3个程序集

按数字顺序执行部署脚本 部署时会有涉及sql clr 安全性的问题 这个请参考引用博客中的讨论 这里的处理是关闭安全选项 部署不安全的程序集

部署完 程序集后 我们需要配置 脚本中创建的一些配置表 填入 服务器登陆信息等等配置

tb_RabbitEndpoint 表配置当前数据库连接例如:server=127.0.0.1,25835; database=RabbitMQTest; uid=sa; pwd=pw

tb_RabbitSetting 表配置Mq 服务器相关信息 :

最后 全部配置完成后 可以 调用 pr_SomeProcessingStuff 存储过程 发送mq 消息

如果修改mq和数据库连接配置后 感觉 没有生效的话 可以重启一下 sql server 数据库实例

iis url rewrite http to https

最近在配置微信小程序 开发环境

因为业务需要在已有的一个站点上 绑定一个新域名

新域名加入到小程序后台 开发配置中的业务域名(https)配置中

而老站点 保持 http 域名不变  新域名 启用 http to https url rewrite 配置

网上找了一些配置 通过 iis 中 urlwreite 模块实现 现在把 成功配置的 规则记录下来

<rewrite>
            <rules>
                <rule name="ssl" patternSyntax="Wildcard" stopProcessing="true">
                    <match url="*" />
                    <conditions>
                        <add input="{HTTPS}" pattern="off" />
                        <add input="{HTTP_HOST}" pattern="xxx.youdomain.com" />
                    </conditions>
                    <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Found" />
                </rule>
            </rules>
        </rewrite>

需要注意的是 Redirect Type   测试规则的时候建议 302 待规则测试完成后 改为301

conditions 中 {HTTP_HOST} 中填入的是不转发https 的域名 可以写正则表达式

debian update openssl 1.1.1 Nginx 1.15 开启 Tls 1.3

最近看见Tls 1.3 标准定稿发布了正式版本,就试着自己动手搞搞实验

环境是瓦工的 debian 9

网上google了一圈后下面搬砖记录一下升级过程

安装openssl

# tar -zxvf openssl-1.1.1-pre8.tar.gz
# cd openssl-1.1.1-pre8

#指定安装目录、配置文件目录
# ./config shared zlib --prefix=/usr/local/openssl-1.1.1-pre8 --openssldir=/usr/local/openssl-1.1.1-pre8/ssl

#显示安装信息
# perl configdata.pm --dump

# make
# make test 
# make install

备份并添加新的符号链接

# mv /usr/bin/openssl /usr/bin/openssl.20180814
# ln -s /usr/local/openssl-1.1.1-pre8/bin/openssl openssl

查看版本 时应该会有 libssl.so.1.1 => not found libcrypto.so.1.1 => not found 2个动态链接库 找不到

openssl version -a
  1. 关联新的库文件
# cd /etc/ld.so.conf.d/
# vi openssl-1.1.1-pre8.conf
/usr/local/openssl-1.1.1-pre8/lib

刷新上面的配置

ldconfig -v

这时 openssl version -a  已经能正常显示了

接着 升级 Nginx 并编译开启 tls1.3

$ wget http://nginx.org/download/nginx-1.15.2.tar.gz
$ tar zxvf nginx-1.15.2.tar.gz
$ cd nginx-1.15.2

OpenSSL 打补丁

cd openssl-1.1.1-pre8
wget https://raw.githubusercontent.com/hakasenyang/openssl-patch/master/openssl-equal-pre8_ciphers.patch

patch -p1 < openssl-equal-pre8_ciphers.patch

接着进入 nginx-1.15.2 目录 配置 编译参数

./configure --with-openssl=/root/openssl-1.1.1-pre8 --with-openssl-opt=enable-tls1_3 --with-http_v2_module --with-http_ssl_module

make 编译

先备份旧版Nginx。

$ mv /path/to/nginx/sbin/nginx /path/to/nginx/sbin/nginx.old

再把编译好的版本拷过去。

$cp objs/nginx /path/to/nginx/sbin/

然后编辑Nginx配置文件。在  nginx.conf 也可以加载站点的.conf上

ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers TLS13-AES-128-GCM-SHA256:TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256 :EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:!3DES:!MD5;


重启Nginx

/etc/init.d/nginx restart

/etc/init.d/nginx reload

最后chrome 开启TLS 1.3 draft28支持

chrome://flags/#tls13-variant

这里我的chrome 68 默认协商并匹配不到 TLS 1.3 draft28

开启 draft28 支持后访问 Nginx 网站已经走了TLS 1.3

Topshelf and Hangfire run .NetCore winservice

Hangfire use Topshelf at NetCore winservice

项目模板描述:
项目通过 [Topshelf 官方示例](https://github.com/Topshelf/Topshelf/tree/develop/src/SampleTopshelfService) 代码 加入并集成了 Hangfire.AspNetCore 任务系统。最后通过 toeshelf 把 netcore App(Hangfire)安装在windows 环境下 作为win服务运行。

Demo template

整体结构

Hangfire –使用 sqlserver 作为存储job 引擎
ASP.NET CORE WEB APP OR API –项目中 集成 Hangfire Client
WinServices(Core runtime) — 运行 Hangfire 任务和 Hangfire 仪表板 (上面的模板项目就是这个服务)

环境运行时

  • NetCore Console– NetCore 2.1
  • TopShelf –4.1.0.180-develop
  • Hangfire.AspNetCore (1.6.21)
  • Hangfire.SqlServer 1.6.21
  • Microsoft.AspNetCore.App 2.1.6
  • Serilog
  • Topshelf.Serilog

Debian9 搭建ngrok服务器

Debian9 搭建ngrok服务器

准备工作

  • 一台vps 这里使用了 gcp debian9
  • 一个泛解析的域名(在阿里上买了个 .xyz 6-9数字域名 65rmb 10年)

安装 GO环境 和 Git

网上 很多 这里先省略配置记录了

安装Ngrok

下载源码

mkdir ~/go/src/github.com/inconshreveable
cd ~/go/src/github.com/inconshreveable
git clone https://github.com/inconshreveable/ngrok.git
export GOPATH=~/go/src/github.com/inconshreveable/ngrok
cd ngrok

编译ngrokd

  • 编译服务器端

$ make release-server

  • 编译客户端
$ GOOS=linux GOARCH=amd64 make release-client
$ GOOS=windows GOARCH=amd64 make release-client
$ GOOS=linux GOARCH=arm make release-client

使用 Systemd 编写启动服务

在 /lib/systemd/system 目录下新建 ngrokd.service 文件

/lib/systemd/system/ngrokd.service

文件内容

[Unit]
Description=ngrok
After=network.target

[Service]
ExecStart=/usr/local/src/ngrok/bin/ngrokd  
-tlsKey=/usr/local/src/ngrok/assets/server/tls/*.123456.xyz.key 
-tlsCrt=/usr/local/src/ngrok/assets/server/tls/*.123456.xyz.crt 
-domain="ngrok.123456.xyz"
-httpAddr=":80" 
-httpsAddr=":443" 
-tunnelAddr=":4000"

[Install]
WantedBy=multi-user.target

主要是 ExecStart 命令中的启动 参数
tlsKey tlsCrt 分别是 下面使用 Let’s Encrypt 申请的 泛域名证书
domain 服务主域名
httpAddr httpsAddr tunnelAddr 服务端口 和 传输端口

获得单元文件后,即可测试该服务:

sudo systemctl start ngrokd
检查服务的状态:

sudo systemctl status ngrokd

win客户端

复制 服务器上 编译的 ngrok.exe 到客户端文件夹中,新建一个客户端配置ngrok.cfg

server_addr: ngrok.123456.xyz:4000
trust_host_root_certs: true

在 cmd 中 输入命令 启动 客户端

http
ngrok.exe -subdomain demo -config=ngrok.cfg -log=log.txt   -proto=http 8080

https
ngrok.exe -subdomain demo -config=ngrok.cfg -log=log.txt   -proto=https 8080

tcp
ngrok.exe -subdomain demo -config=ngrok.cfg -log=log.txt   -proto=tcp 8080

然后会在黑屏中 显示相关连接信息

如果 我们本地内网 有一个 8080 端口的web 服务
当我们输入 https://demo.ngrok.123456.xyz 这个网址就会穿透到我们 本地 8080 服务上

在阿里云配置域名解析

我们这里
* ngrok.123456.xyz 配置了条a 记录 对应 gcp vps ip
* *.ngrok.123456.xyz 配置了条CNAME 指向上面的 ngrok.123456.xyz 域名

为 ngrok 申请一个 泛解析域名

  • 使用 acme.sh 申请 Let’s Encrypt 免费泛域名证书
  • 配置 acme dns 插件 ali dns api 接口方式 申请证书

在阿里云 后台 配置一个 有完全dns解析 接口权限的 用户并获取
1. export Ali_Key=”xxxxxxxxx”
2. export Ali_Secret=”xxxxxxxxxxx”

wget -O – https://get.acme.sh | sh

更新脚本

acme.sh –upgrade –auto-upgrade

申请证书

./acme.sh –issue –dns dns_ali -d *.123456.xyz -d *.ngrok.123456.xyz

脚本里面的 阿里dns 插件会 通过api 在阿里dns 解析记录里面天机2条 TXT 的记录
等待 120秒 等待 解析记录生效后 会签发类似 下面4条证书记录

-----END CERTIFICATE-----
[Tue Jan 22 03:26:59 UTC 2019] Your cert is in  /root/.acme.sh/*.123456.xyz/*.123456.xyz.cer 
[Tue Jan 22 03:26:59 UTC 2019] Your cert key is in  /root/.acme.sh/*.123456.xyz/*.123456.xyz.key 
[Tue Jan 22 03:26:59 UTC 2019] The intermediate CA cert is in  /root/.acme.sh/*.123456.xyz/ca.cer 
[Tue Jan 22 03:26:59 UTC 2019] And the full chain certs is there:  /root/.acme.sh/*.123456.xyz/fullchain.cer

安装证书 到 ngrok 目录

./acme.sh --install-cert -d *.123456.xyz  /
--cert-file /usr/local/src/ngrok/assets/server/tls/*.123456.xyz.crt /
--key-file  /usr/local/src/ngrok/assets/server/tls/*.123456.xyz.key /
--fullchain-file /usr/local/src/ngrok/assets/client/tls/*.123456.xyz.crt \

参考文章

VPS自搭建Ngrok内网穿透服务

CentOS7搭建ngrok服务器

acme.sh

Linux 下使用 acme.sh 配置 Let’s Encrypt 免费 SSL 证书 + 通配符证书

使用systemd在Boot上启动Linux服务

内网穿透 ngrok 服务器和客户端配置

GLiNet MT300N-V2 安装 SSR plus 插件

GLiNet MT300N-V2 安装 SSR plus 插件

GLiNet 是一家 生产 便携路由的国内厂商 好像外销为主。
最主要的是他家 路由系统采用的是开源 OpenWrt 系统 并在github 上开源 并提供sdk 和 很多插件
但是国内政策的关系 国内买到的路由器固件内 并没有提供直接安装 SS SSR V2ray 的方法。

经过在 恩三论坛 学习了下(www.right.com.cn) 已经成功把lean 开源的(https://github.com/coolsnowwolf/lede.git) SSR plus 插件 成功的安装到了 MT300N-V2 固件中,下面记录一些安装步骤。

ps: 这台路由用的MT7628nn 方案 你也可以用 网上一些 已经编译好的固件 比如 老毛子Pavavan Lean大佬的Lede等等 GLiNet 有自家刷不死的 uboot 可玩性很高。这里没有直接去刷第三方固件是因为喜欢他们家定制的UI 可以 比较方便的启用ap 模式加入网络。所以就想着 自建编译ipk 插件在 开源的openwrt 固件内安装 大雕的 SSR Plus 插件。

1af591f222e7f1e9bc5c5f1ea8b22fdb.png

需要准备的环境和工具

  • 一台 全局翻墙的 Linux(我这里用了ubuntu18.04 Lts)
  • 大雕老大 开源的插件 Git-Lede
  • GLiNet 官方 ramips-SDK
  • 还有一台 MT300N-v2
  • SSH客户端 这里用了 Xshell 和 Xftp 6

ipk 编译过程

  • make menuconfig 配置中
  • base System 中 取消 dnsmasq 选用 dnsmasq-full
  • Target System (MediaTek Ralink MIPS)
  • Subtarget (MT76x8 based boards)
  • Target Profile (GL-iNet GL-MT300N-V2)
  • 其他默认 lede 编译其他文章很多了 这里跳过了。

更新:

上面提到的 用sdk 编译 方法 已经在 新版本的 coolsnowwolf/lede 中失效了,
但是我们找到了 https://github.com/sitsh/openwrt 的源码 然后复制 ssrplus 插件目录到packages里面
修改官方 feeds.conf 加入 coolsnowwolf/lede 中的 feeds 连接 然后 就可以车工编译了。

SSR Plus 默认包含 ss ssr v2ray 但是 v2ray 编译后的ipk 安装文件偏大8M多 这个便携路由 cpu 和flash 都比较弱 感觉也不适合 v2ray 所有就放弃 v2ray 安装包了。网上好像说是可以压缩ipk 进入固件的这里没怎么去找这类方法了。

20190809 更新 所有 ipk 包 所有编译后的ipk 包

新编译的ipk 包 传送门

密码:www.yycaf.xyz

安装

  • 首先先卸载 官方固件中的 dnsmasq 模块
  • 使用 包中的 dhcp 配置文件覆盖 /etc/config/dhcp 覆盖重启路由 reboot
  • okpg update 更新官方 源。
  • packages 下 ipk 到 /tmp 目录下
  • opkg install /tmp/xxx.ipk

芝麻开门

SSR-PLLUS被隐藏了,编译好后装好机,输入以下命令即可出来

echo 0xDEADBEEF > /etc/config/google_fu_mode

最终效果

1af591f222e7f1e9bc5c5f1ea8b22fdb.png

引用 感谢 大雕 大佬 开源的 插件 和官方源码

  1. https://github.com/coolsnowwolf/lede
  2. gl-inet MT300N-V2 SDK

Caddy Server

Caddy Server

Caddy 使用简介
官网 https://caddyserver.com/

功能模块介绍

  • Caddy 是用Go 写的一个webServer
  • 集成 Let’s Encrypt 自动签发证书
  • 内置 支持Http/2
  • 内置 支持 TLS 1.3
  • 配置简单容易上手
    还有其他的看功能看 文档把

Caddy 的授权模式

在 github 作者源码上编译版本是 免费的

https://github.com/mholt/caddy

在下面 官网 通过在线自动编译 出来的 caddy 版本 个人使用免费 商用需要订阅收费

https://caddyserver.com/download

下面示例 使用 Caddy 1.0 windows 版本 反向代理 .net core 2.2 kestrel webapps

先从 caddy-releases 下载windows 编译版本二进制文件

解压缩到 本地目录

新建一个 website目录 存放 Caddyfile 配置文件
这里 比如 是这样的目录结构

E:\website\hangfire.18080\Caddyfile

E:\caddy_v1.0.0_windows_amd64\caddy.exe

运行 CMD

E:\caddy_v1.0.0_windows_amd64\caddy.exe -conf E:\website\hangfire.18080\Caddyfile

示例 Caddyfile 配置文件 具体更详细的看官方 文档

yourdomain:18080  //主机地址
tls off  //关闭 证书 自动申请 自动申请需要 80 443 端口开放
basicauth /hangfire user pwd  //配置 简单登陆验证
proxy / localhost:5100  //反代 本地 kestrel webapps

这样 一个 Caddy 网站示例 已经能正常运行了。

配置守护进程

因为 Caddy 并没有提供 windows下的服务启动方案 这里 我们通过 nssm 这个工具 实现服务的安装

首先到官网下载 nssm-2.24-101-g897c7ad.zip
把对应版本的 nssm.exe 复制到随意一个目录(我这里把他放到 Caddy.exe 同一目录下)

运行 CMD
切换到 nssm.exe 目录

nssm install [<servicename>]
nssm edit <servicename>


运行上面的目录 会弹出 ui 配置界面 把 caddy 的运行参数 配置添入后就能在 windows 服务中 看见你安装的服务了 然后我们配置 延迟启动 这样 如果机器重启 或者服务崩溃 就有守护进程帮你自动重启服务了。

Caddy proxy asp.net core 3 kestrel grpc webapp

Caddy proxy asp.net core 3 kestrel grpc webapp

开发环境

Caddy Server

caddy_v1.0.0_windows_amd64

.net core 3

dotnet-sdk-3.0.100-preview4-011223-win-x64

openssl

Win64OpenSSL-1_1_0j.exe

system win 10 pro

结构流程

  • grpc on kestrel server https://localhost:50051
  • grpc client request call grpc on caddy proxy https://localhost:8080
  • CaddyServer //https://localhost:8080

grpc client(H2-TLS 协议) 访问 –> CaddyServer –> 反向代理(H2-TLS 协议) –> grpc on kestrel server

这里主要记录 部署过程 grpc 项目 使用 标准 模板 helloworld

grpc on kestrel server 配置

运行 vs2019 pre 2 内置的模板创建 一个 .net core grpc 项目
项目创建完成后 你就有一个 跑在 kestrel 上的 grpc server了

CaddyServer Http/2 反代协议 需要 kestrel 跑在 TLS https 下 如果kestrel 跑在http 下 Caddy会自动降级 http1 处理反代协议,所以 我们需要先把 本地 dotnet dev cert 证书 导入kestrel 我们先把

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
//webBuilder.UseUrls("https://localhost:50051")
webBuilder.ConfigureKestrel(options =>
{
options.Limits.MinRequestBodyDataRate = null;
options.Listen(IPAddress.Any, 50051, listenOptions =>
{
listenOptions.Protocols = Microsoft.AspNetCore.Server.Kestrel.Core.HttpProtocols.Http2;

//我们使用ASP.NET核心开发证书
listenOptions.UseHttps();

//或者我们可以使用.pfx格式的自己的证书 X509Certificate2
//listenOptions.UseHttps(cert);
});
});
webBuilder.UseSerilog();
webBuilder.UseStartup<startup>();</startup>

});

这里 grpc kestrel server 已经配置完成 可以通过 vs 拉起 黑屏运行了

CaddyServer 配置

Caddyfile 配置
主要就是加载 pem 证书 配置比较简单 直接贴 Caddyfile 了

https://localhost:8080

tls  ../localhostpubliccert.pem ../localhostprivatekey.pem

proxy / https://localhost:50051 {

}

grpc client 实现

grpc client 需要修改的是 默认Channel 使用了 非 TLS 安全传输访问通道 我们需要 修改成 加载证书的版本

//Channel channel = new Channel(“localhost:50051”, ChannelCredentials.Insecure);

string rootpath = AppDomain.CurrentDomain.BaseDirectory;
var filepath = Path.Combine(rootpath, "localhostdevcert.pem");
string pem = File.ReadAllText(filepath);

SslCredentials secureCredentials = new SslCredentials(pem);
Channel secureChannel = new Channel("localhost", 8080, secureCredentials);

var client = new Greeter.GreeterClient(secureChannel);

openssl 转换 localhsot 开发证书 格式

  • 开发证书安装
    dotnet dev-certs https –trust
  • 通过 MMC 导出 开发证书 保存成 .pfx 二进制的证书文件  
  • .pfx 转换 成 pem 格式的证书

安装 openssl 工具 转换 证书的格式 CaddyServer 需要 pem 格式的证书

证书和私钥

openssl pkcs12 -in d:\localhostdevcert.pfx -out d:\localhostdevcert.pem -nodes

私钥

openssl pkcs12 -in d:\localhostdevcert.pfx -nocerts -out d:\localhostprivatekey.pem -nodes

证书

openssl pkcs12 -in d:\localhostdevcert.pfx -nokeys -out d:\localhostpubliccert.pem -nodes

demo 源码

github rep

ps 引用参考

开发证书

Protocols in ASP .NET Core: HTTPS and HTTP/2

grpc-web Envoy .net core3 grpcServer

grpc-web Envoy .net core3 grpcServer

记录 前端 js 通过 Envoy 反代服务器 调用 .net core3 grpcServer 实验过程

整体流程图

实验通过参考 grpc-web 把后端 grpcServer由官网 node.js 实现 改写成 .net core 3 grpc 实现
加入 grpc ServerSteam 模式 hello world 例子

更新

  • 更新docker-compose 文件
  1. 弃用dockerfile 构建image 直接使用 volumes 挂载 yml 和证书 配置文件
  2. 加入Envoy-TLS 节点测试 https端点配置
  3. 自定义networks 配置
  4. https://github.com/11os/grpc-mp 编译小程序需要的 pb 生成工具[for linux]

环境

  • nodejs npm 主要前端编译库的需要
  • .net core 3 sdk pv3
  • vs2019 pv
  • docker ubuntu18.04
  • caddyServer 1.0
  • chrome74

实验预期效果

  • grpc-web clinet 一次请求 一次响应调用
  • grpc-web clinet ServerSteam 一次请求 Server 流式输出响应
  • demo地址

端点配置 部署环境

端点url描述
grpc-weblocalhost:8081web 前端页面
EnvoyServerloclhost:8080反代-docker 部署
grpcServer netcore3loclhost:9090rpc接口 docker 部署
Envoy-TLS-Server netcore3domain:443反代-docker 部署

grpcServer 端点构建

通过 vs2019 grpc模板 创建一个grpcServer项目
这个模板 已经自带了个简单 helloworld rpc方法了 我们这里 简单修改下 .proto 缓冲层定义 加入ServerSteam rpc 方法定义


syntax = "proto3";

package helloworld;

service Greeter {
// unary call
rpc SayHello(HelloRequest) returns (HelloReply);
// server streaming call
rpc SayRepeatHello(HelloRequest) returns (stream HelloReply);
// unary call - response after a length delay
rpc SayHelloAfterDelay(HelloRequest) returns (HelloReply);
}

message HelloRequest {
string name = 1;
}

message RepeatHelloRequest {
string name = 1;
int32 count = 2;
}

message HelloReply {
string message = 1;
}

2个rpc 端点实现代码

public class GreeterService : Greeter.GreeterBase
{
public override Task<helloreply> SayHello(HelloRequest request, ServerCallContext context)
{
return Task.FromResult(new HelloReply
{
Message = " grpcServer9090say: Hello  " + request.Name
});
}
public override async Task SayRepeatHello(HelloRequest request, IServerStreamWriter<helloreply> responseStream, ServerCallContext context)
{</helloreply></helloreply>

for (int i = 0; i <= 10; i++)
            {
                await responseStream.WriteAsync(new HelloReply { Message = " grpcServer9090say: Hello  "+i+"--" + request.Name });

                await Task.Delay(1000);
            }

            //return Task.FromResult(new HelloReply { Message = "Hello " + request.Name });
        }
    }

因为是简单演示 没有上 tls 证书 和 https
项目最后会以 docker形式 发布 所以这里我们修改了下默认 Kestrel 端口 改为了 9090

vs 中添加项目的 docker 支持 选 linux 平台后 vs 会帮你生成 项目部署的 dockerfile
ps: 我这里vs默认生成 dockerfile build 的时候报错 提示路径不对。没有深入研究 简单修改 dockerfile 里面的 路径 后 就可以编译了

FROM mcr.microsoft.com/dotnet/core/aspnet:3.0-buster-slim AS base
WORKDIR /app
EXPOSE 9090

FROM mcr.microsoft.com/dotnet/core/sdk:3.0-buster AS build
WORKDIR /src/grpcWebDemo
COPY ["grpcWebDemo.csproj", "/src/grpcNetCoreServer"]
RUN dotnet restore "/src/grpcNetCoreServer/grpcWebDemo.csproj"
COPY . .
WORKDIR "/src/grpcNetCoreServer"
RUN dotnet build "grpcWebDemo.csproj" -c Release -o /app

FROM build AS publish
RUN dotnet publish "grpcWebDemo.csproj" -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "grpcWebDemo.dll"]

可以用命令 试着编译下一下 刚刚生成的 dockerfile 如果没有报错 就可以了先放着 等会会用
docker-compose 把 Envoy 和 netcore grpc 部署在一个 docker 网段内

docker build -t helloworld/grpcnetcoredemo -f Dockerfile .

Envoy 部署

因为 Envoy 官方没有提供 二进制的 安装包 我们通过 grpc-web 官网的部署指引 把Envoy部署在 docker中

其中 envoy.yaml 是 Envoy Server 的配置文件 这里我们需要 调整一下的是 上游(netcore grpc api) 服务器地址这行的配置 需要按你自己的环境来修改-下面的这行配置按你 环境的区别 填写

hosts: [{ socket_address: { address: netcore-server, port_value: 9090 }}]

我们这里使用 ‘netcore-server’ 下面要说到的 docker-compose 中的 容器名称来替代实际地址

docker-compose.yml 配置如下

version: '3'
services:

netcore-server:
build:
context: ./
dockerfile: ./Dockerfile
image: helloworld/grpcnetcoredemo:0.0.1
ports:
- "9090:9090"
envoy:
build:
context: ./
dockerfile: ./envoy/Dockerfile
depends_on:
- netcore-server
image: helloworld/envoy
ports:
- "8080:8080"
links:
- netcore-server

如果上面的 配置 都没错通过 执行

docker-compose up -d netcore-server envoy

就能把 2 个 容器 拉起来了。 端口 分别是 8080 和 9090 2个docker 容器
到这里 服务端的 envoy 反代 和 grpc netcore-server 已经分别部署好了

在进行 前端grpc-web 之前 建议先测试下 2个容器

envoy 反代 就需要关注 上游端点 ip 地址配置这一行。
grpc netcore-server 我们拉起 9090 这个容器后 可以用c#的 grpc Clinet 代码直接调用下刚才写的 2个grpc 接口
看看是否成功。

Envoy-TLS 部署

使用 acme.sh 通过 letsencrypt 申请证书 这里略过具体细节。

需要更新的 envoy.yml 配置段落

tls_context:
common_tls_context:
tls_certificates:
- certificate_chain:
filename: "/etc/letsencrypt/grpc.xxx.com.crt"
private_key:
filename: "/etc/letsencrypt/grpc.xxx.com.key"

证书文件目录是通过 之前 docker-compose 文件 挂载的目录

envoy-tls:

container_name: envoy-tls
hostname: envoy-tls
image: envoyproxy/envoy:latest
volumes:
- evnoy/envoy-tls.yaml:/etc/envoy/envoy.yaml
- evnoy/letsencrypt:/etc/letsencrypt
ports:
- "443:443"
networks:
main:
aliases:
- envoy-tls

运行发布 docker 端点

docker-compose up -d netcore-server envoy envoy-tls

docker-compose down --remove-orphans

grpc-web

grpcWebClient 前端项目文件夹

miniprogram 微信小程序

细节参考 https://github.com/11os/grpc-mp

因为库的作者就提供了 mac 环境的 protoc 和 protoc-gen-grpc-web 二进制文件
我这里没有mac 环境。所以自己在作者源码上编译了 linux 环境下的二进制文件
测试pb 生成 可用。

二进制文件[linux]

.proto 自动生成 js文件

首先需要把 netcore-server 端点中的 .proto 缓冲层协议文件 通过工具生成 xx-pb.js 文件

分别解压 上面这2个工具,我这里选择把他们放在同一目录中 方面shell脚本执行 并发必须,你可以按自己的目录结构自行调整命令,

protoc.exe helloworld.proto –plugin=protoc-gen-grpc-web=protoc-gen-grpc-web-1.0.4-windows-x86_64.exe –js_out=import_style=commonjs:. –grpc-web_out=import_style=commonjs,mode=grpcwebtext:.

通过执行上面的命令后 得到 这2个js

  1. helloworld_pb.js
  2. helloworld_grpc_web_pb.js

编译 前端项目

$ npm install
$ npx webpack client.js

编译后得到 输出的

dist/main.js

使用 caddy webserver

有很多 webserver 可用。看重caddy 简单这里使用 caddy 来跑前端

Caddyfile 配置

localhost:8081 {
root ../../src/grpcWebClient

}

最后

当然是放上源码 github