认证服务
我们的认证服务要给邮箱发送验证码,所以用nodejs较为合适,nodejs是一门IO效率很高而且生态完善的语言,用到发送邮件的库也方便。
nodejs可以去官网下载https://nodejs.org/en,一路安装就可以了
我们新建VarifyServer文件夹,在文件夹内部初始化server要用到的nodejs库的配置文件
1 | npm init |
根据提示同意会创建一个package.json文件
接下来安装grpc-js包,也可以安装grpc,grpc是C++版本,grpc-js是js版本,C++版本停止维护了。所以用grpc-js版本。
安装过程出现了错误,因为淘宝镜像地址过期了
清除之前npm镜像地址
1 | npm cache clean --force |
重新设置新的淘宝镜像
1 | npm config set registry https://registry.npmmirror.com |
接着下载grpc-js就成功了
接着安装proto-loader用来动态解析proto文件
1 | npm install @grpc/proto-loader |
我们再安装email处理的库
1 | npm install nodemailer |
我们将proto文件放入VarifyServer文件夹,并且新建一个proto.js用来解析proto文件
1 | const path = require('path') |
keepCase: 如果为 true,则保留字段名的原始大小写。如果为 false,则将所有字段名转换为驼峰命名法。
longs: 控制如何表示 Protocol Buffers 中的 long 类型。如果设置为 String,则长整数会被转换为字符串,以避免 JavaScript 中的整数溢出问题。
enums: 控制如何表示 Protocol Buffers 中的枚举类型。如果设置为 String,则枚举值会被转换为字符串。
defaults: 如果为 true,则为未明确设置的字段提供默认值。
oneofs: 如果为 true,则支持 Protocol Buffers 中的 oneof 特性。
在写代码发送邮件之前,我们先去邮箱开启smtp服务。我用的163邮箱,在邮箱设置中查找smtp服务器地址,需要开启smtp服务。这个是固定的,不需要修改。
网易163邮箱的 SMTP 服务器地址为: smtp.163.com
发送邮件,建议使用授权码(有的邮箱叫 独立密码),确保邮箱密码的安全性。授权码在邮箱设置中进行设置。如果开启了授权码,发送邮件的时候,必须使用授权码。
这里设置开启smtp服务和授权码。我这里已经是设置好的。
新增一个授权码用于发邮件
读取配置
因为我们要实现参数可配置,所以要读取配置,先在文件夹内创建一个config.json文件
1 | { |
user是我们得邮箱地址,pass是邮箱得授权码,只有有了授权码才能用代码发邮件。大家记得把授权码改为你们自己的,否则用我的无法发送成功。
另外我们也要用到一些常量和全局得变量,所以我们定义一个const.js
1 | let code_prefix = "code_"; |
新建config.js用来读取配置
1 | const fs = require('fs'); |
接下来封装发邮件的模块,新建一个email.js文件
1 | const nodemailer = require('nodemailer'); |
接下来实现发邮件函数
1 | /** |
因为transport.SendMail相当于一个异步函数,调用该函数后发送的结果是通过回调函数通知的,所以我们没办法同步使用,需要用Promise封装这个调用,抛出Promise给外部,那么外部就可以通过await或者then catch的方式处理了。
我们新建server.js,用来启动grpc server
1 | async function GetVarifyCode(call, callback) { |
GetVarifyCode声明为async是为了能在内部调用await。
提升GateServer并发
添加ASIO IOContext Pool 结构,让多个iocontext跑在不同的线程中
1 |
|
实现
1 |
|
修改CServer处Start逻辑, 改为每次从IOServicePool连接池中获取连接
1 | void CServer::Start() |
为了方便读取配置文件,将ConfigMgr改为单例, 将构造函数变成私有,添加Inst函数
1 | static ConfigMgr& Inst() { |
VerifyGrpcClient.cpp中添加
1 | class RPConPool { |
我们在VerifyGrpcClient类中添加成员
1 | std::unique_ptr<RPConPool> pool_; |
修改构造函数
1 | VerifyGrpcClient::VerifyGrpcClient() { |
当我们想连接grpc server端时,可以通过池子获取连接,用完之后再返回连接给池子
1 | GetVarifyRsp GetVarifyCode(std::string email) { |
总结
到本节为止我们完成nodejs搭建的grpc server, 修改package.json中的脚本
1 | "scripts": { |
接着命令行执行 npm run serve即可启动grpc 服务。