Files
full/module/base/sender/README.md

423 lines
8.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Sender 消息通知微服务
一个基于 Go 语言开发的高性能消息通知微服务,提供短信、邮件发送和验证码管理功能。采用 gRPC + HTTP Gateway 架构,支持多种服务商集成。
## ✨ 功能特性
### 📱 短信服务
- **多服务商支持**:阿里云短信、腾讯云短信
- **模板管理**:支持短信模板和参数替换
- **发送限制**:基于手机号的日发送量限制
- **黑名单过滤**:支持手机号黑名单机制
- **验证码生成**:自动生成和验证短信验证码
### 📧 邮件服务
- **SMTP支持**支持标准SMTP协议发送邮件
- **模板引擎**基于Go template的邮件模板系统
- **多服务商**支持QQ邮箱、Gmail等主流邮箱服务
- **TLS加密**支持TLS/SSL安全连接
### 🔐 验证码管理
- **自动生成**支持4-10位数字验证码
- **Redis缓存**:验证码存储和过期管理
- **限流控制**:防止验证码频繁发送
- **验证接口**:提供验证码校验功能
### 🏗️ 微服务架构
- **gRPC服务**高性能RPC通信
- **HTTP Gateway**RESTful API支持
- **服务发现**基于Etcd的服务注册发现
- **健康检查**:完整的健康检查机制
## 🚀 快速开始
### 环境要求
- Go 1.26.5
- Redis 6.0+
- PostgreSQL 12+
- Etcd 3.5+
### 安装依赖
```bash
# 克隆项目
git clone bsm/full/module/base/sender.git
cd sender
# 下载依赖
make deps
```
### 配置服务
1. **复制配置文件**
```bash
cp etc/sender_dev.yaml etc/sender_local.yaml
```
2. **修改配置**
```yaml
# etc/sender_local.yaml
Service:
Name: sender
Port: "12201"
BindIP: "0.0.0.0"
# 数据库配置
Databases:
Default:
Driver: postgres
Host: localhost
Port: 5432
Database: sender_db
Username: postgres
Password: your_password
# Redis配置
Cache:
Redis:
Host: localhost
Port: 6379
Password: your_redis_password
Database: 0
# 短信服务配置
SMS:
aliyun:
Endpoint: "dysmsapi.aliyuncs.com"
AccessKeyId: "your_access_key_id"
AccessKeySecret: "your_access_key_secret"
Region: "cn-hangzhou"
# 邮件服务配置
SMTP:
qq:
Endpoint: "smtp.qq.com"
Port: 587
Username: "your_email@qq.com"
Password: "your_smtp_password"
FromAddress: "your_email@qq.com"
FromName: "系统通知"
```
### 运行服务
#### 方式一:直接运行
```bash
# 开发模式
make dev
# 生产模式
make build
make run
```
#### 方式二Docker运行
```bash
# 构建镜像
make docker-build
# 使用docker-compose启动完整环境
make docker-compose-up
```
## 📖 API文档
### gRPC接口
#### 短信服务
```protobuf
service Sms {
rpc Send(SmsSendRequest) returns (SmsReply);
rpc Verify(SmsVerifyRequest) returns (SmsReply);
}
```
#### 邮件服务
```protobuf
service Mail {
rpc Send(SendMailRequest) returns (SendMailReply);
}
```
### HTTP接口
服务启动后,可通过以下地址访问:
- **gRPC服务**`localhost:12201`
- **HTTP Gateway**`localhost:12202`
- **Swagger文档**`http://localhost:12202/swagger/`
#### 发送短信示例
```bash
curl -X POST "http://localhost:12202/v1/sms/send" \
-H "Content-Type: application/json" \
-d '{
"provider": "aliyun",
"sign_name": "您的签名",
"template_code": "SMS_123456789",
"phone": "13800138000",
"paramters": {
"code": "123456"
}
}'
```
#### 发送邮件示例
```bash
curl -X POST "http://localhost:12202/v1/mail/send" \
-H "Content-Type: application/json" \
-d '{
"provider": "qq",
"template_key": "welcome",
"to": "user@example.com",
"paramters": {
"username": "张三",
"verification_code": "123456"
}
}'
```
## 🛠️ 开发指南
### 项目结构
```
sender/
├── cmd/ # 应用程序入口
│ ├── main/ # 主服务入口
│ └── cli/ # 命令行工具
├── internal/ # 内部包
│ ├── config/ # 配置管理
│ ├── excode/ # 错误码定义
│ ├── impl/ # 依赖实现
│ ├── logic/ # 业务逻辑
│ │ ├── mail/ # 邮件服务
│ │ └── sms/ # 短信服务
│ ├── models/ # 数据模型
│ └── server/ # 服务器实现
├── pb/ # protobuf生成代码
├── proto/ # protobuf定义文件
├── etc/ # 配置文件
├── test/ # 测试文件
├── scripts/ # 脚本文件
└── swagger/ # API文档
```
### 开发命令
```bash
# 查看所有可用命令
make help
# 生成protobuf代码
make proto
# 运行测试
make test
# 代码检查
make lint
# 格式化代码
make fmt
# 构建所有平台版本
make build-all
# 运行完整构建流程
make all
```
### 添加新的短信服务商
1. **在配置中添加服务商配置**
```yaml
SMS:
new_provider:
Endpoint: "api.newprovider.com"
AccessKeyId: "your_key"
AccessKeySecret: "your_secret"
Region: "us-east-1"
```
2. **在 `internal/logic/sms/send.go` 中添加处理逻辑**
```go
case "new_provider":
if impl.Provider.NewProvider == nil {
return nil, excode.ErrProviderIsNil
}
result, err = NewProviderSender(in, smsCode)
```
3. **实现具体的发送函数**
```go
func NewProviderSender(args *pb.SmsSendRequest, code string) (map[string]any, error) {
// 实现新服务商的发送逻辑
}
```
### 添加新的邮件服务商
1. **在配置中添加SMTP配置**
```yaml
SMTP:
gmail:
Endpoint: "smtp.gmail.com"
Port: 587
Username: "your_email@gmail.com"
Password: "your_app_password"
FromAddress: "your_email@gmail.com"
FromName: "系统通知"
```
2. **在 `internal/logic/mail/send.go` 中添加处理逻辑**
```go
case "gmail":
err = GmailSender(cfg, tmpl, in.GetTo(), tplRecord.Subjet, in.GetParamters())
```
3. **实现具体的发送函数**
```go
func GmailSender(cfg *config.SmtpConf, tmpl *template.Template, to string, subject string, args map[string]string) error {
// 实现Gmail的发送逻辑
}
```
## 🧪 测试
### 运行测试
```bash
# 运行所有测试
make test
# 运行邮件测试
make test-mail
# 运行短信测试
make test-sms
# 生成测试覆盖率报告
make test-coverage
```
### 测试环境
项目提供了完整的Docker测试环境
```bash
# 启动测试环境包含Mailhog用于邮件测试
docker-compose --profile development up -d
# 查看服务状态
docker-compose ps
# 查看日志
docker-compose logs -f sender-service
```
## 📦 部署
### Docker部署
```bash
# 构建生产镜像
make docker-build
# 使用docker-compose部署
make docker-compose-up
# 停止服务
make docker-compose-down
```
### 生产环境配置
1. **环境变量设置**
```bash
export SERVICE_ENV=prod
export POSTGRES_PASSWORD=your_strong_password
export REDIS_PASSWORD=your_redis_password
```
2. **配置文件**
使用 `etc/sender_prod.yaml` 作为生产环境配置
3. **健康检查**
```bash
# 检查服务健康状态
curl http://localhost:12202/health
```
## 🔧 配置说明
### 主要配置项
| 配置项 | 说明 | 默认值 |
|--------|------|--------|
| `Service.Port` | 服务端口 | 12201 |
| `Service.BindIP` | 绑定IP | 0.0.0.0 |
| `Code.Length` | 验证码长度 | 6 |
| `Code.Expire` | 验证码过期时间(秒) | 300 |
| `Code.MaxSentLimit` | 每日最大发送次数 | 10 |
### 环境变量
| 环境变量 | 说明 | 示例 |
|----------|------|------|
| `SERVICE_ENV` | 服务环境 | dev/test/prod |
| `POSTGRES_PASSWORD` | 数据库密码 | your_password |
| `REDIS_PASSWORD` | Redis密码 | your_redis_password |
## 📊 监控和日志
### 健康检查
- **HTTP健康检查**`GET /health`
- **gRPC健康检查**使用gRPC健康检查协议
### 日志管理
- 日志文件位置:`/app/logs/`
- 支持结构化日志输出
- 集成ELK日志收集可选
### 性能监控
- 支持APM监控集成
- 提供Prometheus指标导出
- 支持分布式链路追踪
## 🤝 贡献指南
1. Fork 本仓库
2. 创建特性分支:`git checkout -b feature/new-feature`
3. 提交更改:`git commit -am 'Add new feature'`
4. 推送分支:`git push origin feature/new-feature`
5. 提交Pull Request
### 代码规范
- 遵循Go官方代码规范
- 使用 `gofmt` 格式化代码
- 运行 `make lint` 进行代码检查
- 确保测试覆盖率 > 80%
## 📄 许可证
本项目采用 MIT 许可证 - 查看 [LICENSE](LICENSE) 文件了解详情。
## 📞 支持
如有问题或建议,请通过以下方式联系:
- 提交 [Issue](https://bsm/full/module/base/sender/issues)
- 发送邮件至david.yan@qq.com
- 查看 [Wiki](https://bsm/full/module/base/sender/wiki) 获取更多文档
---
**注意**:本项目为企业内部使用,请确保在生产环境中正确配置安全参数。