云厂商产品使用

简介

业务

短信

  • 短信服务(Short Message Service、SMS)是指通过调用短信发送API,将指定短信内容发送给指定手机用户

阿里云短信服务

  • 阿里云短信服务产品介绍:https://www.aliyun.com/product/sms
    • 支持API或在阿里云后台通过群发助手导入Excel批量发送短信(支持模板变量)
    • 短信字数含”签名+模版内容+变量内容”,短信70个字数含以内,按1条短信计费;超出70个字为长短信,按照67个字数记为1条短信费用(如果短信内容过长可能算作多条费用,具体参考阿里云对应计费规则)
  • 短信发送API帮助文档(Java):https://help.aliyun.com/document_detail/55284.html
  • 下载官方SDK:https://help.aliyun.com/document_detail/55359.html
  • 发送短信(发送验证码)需要以下配置
    • 在阿里云管理后台右上角,账号 - AccessKey管理中查看accessKeyIdaccessKeySecret
      • 或者新增子账号,并赋权(搜索SMS,赋权AliyunDysmsFullAccess)
    • 短信签名(类似短信前缀,如【阿里云】)
      • 一般要求网站可访问,且网站对应信息和备案/主体信息一致
    • 自己配置的短信模板ID(如:SMS_45680123)
    • 模板变量(如果模板中存在变量,如${code})
      • 变量值不支持QQ号、微信号、网址信息;1~35位字符,但电话号码支持5~11位
      • 通知短信非变量是支持微信号内容
  • 部分业务场景可配置短信发送状态回调接口实现状态接收
    • 进入系统设置 - 通用设置 - HTTP批量推送模式(开启) - 接收地址(需要上线后的地址,配置时会检测)
    • 也可接入短信发送详情主动查询接口查看短信发送与用户接收情况,或通过进入业务统计 - 发送记录查询界面查看
  • 使用maven
1
2
3
4
5
6
<!-- aliyun短信 -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.1</version>
</dependency>
  • 工具类示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
@Slf4j
public class SmsU {
public static void main(String[] args) {
SmsU.sendMessage("15812345678");
}

/********************************************* 需要修改的部分start *************************************************/

/**
* 需要替换为自己的ACCESS_KEY_ID
*/
private static final String ACCESS_KEY_ID = "";

/**
* 需要替换为自己的ACCESS_KEY_SECRET
*/
private static final String ACCESS_KEY_SECRET = "";

/**
* 这里要修改为自己的短信签名
*/
private static final String SIGN_NAME = "";

/**
* 修改为自己的模板CODE
*/
private static final String TEMPLATE_CODE = "";

/**
* 模板中的变量名称,例如模板中为${code},此处就填写code
*/
private static final String TEMPLATE_PARAM = "code";

/********************************************* 需要修改的部分end *************************************************/

private static final Pattern PATTERN = Pattern.compile("^((13[0-9])|(15[^4,\\D])|(18[0-9]))\\d{8}$");
/**
* 下面是一些默认的配置,无需修改
* REGION_ID 服务器大区 不建议修改
* SYS_DOMAIN API地址 不可修改
* SYS_VERSION 系统版本 不可修改
* SYS_ACTION API接口名必须为SendSms 不可修改
*/
private static final String REGION_ID = "cn-hangzhou";
private static final String SYS_DOMAIN = "dysmsapi.aliyuncs.com";
private static final String SYS_VERSION = "2017-05-25";
private static final String SYS_ACTION = "SendSms";
private static IAcsClient client = null;
private static CommonRequest request = null;

static {
DefaultProfile profile = DefaultProfile.getProfile(REGION_ID, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
client = new DefaultAcsClient(profile);
request = new CommonRequest();
request.setSysMethod(MethodType.POST);
request.setSysDomain(SYS_DOMAIN);
request.setSysVersion(SYS_VERSION);
request.setSysAction(SYS_ACTION);
request.putQueryParameter("RegionId", REGION_ID);
request.putQueryParameter("SignName", SIGN_NAME);
request.putQueryParameter("TemplateCode", TEMPLATE_CODE);
}

private SmsU() {}

/**
* 发送短信
* @param phoneNumber 手机号码
* @return code
*/
public static Result sendMessage(String phoneNumber) {
if (!isPhoneNumber(phoneNumber)) {
return Result.failure("手机号格式不正确");
}

// 获取六位随机数. 基于Hutool
String code = RandomUtil.randomString("0123456789", 6);
// 初始化用户自定义参数
request.putQueryParameter("PhoneNumbers", phoneNumber);
// 在短信内容中嵌入随机数
request.putQueryParameter("TemplateParam", "{\"" + TEMPLATE_PARAM + "\":\"" + code + "\"}");

// 发送的业务逻辑
try {
// {"Message":"账户余额不足","RequestId":"415E9BF0-6904-5920-933A-F27B920E2644","Code":"isv.AMOUNT_NOT_ENOUGH"}
// {"Message":"触发分钟级流控Permits:1","RequestId":"9D7F3798-1CA1-5110-9056-1ECB14A91097","Code":"isv.BUSINESS_LIMIT_CONTROL"}
// {"Message":"OK","RequestId":"2E6BD8A4-D1A3-5A25-A237-2AB702893632","Code":"OK","BizId":"303700784907161870^0"}
CommonResponse response = client.getCommonResponse(request);
if(response.getHttpStatus() != 200 || !"OK".equals(JSONUtil.parseObj(response.getData()).get("Message"))) {
log.error("发送短信失败 {} {} {}", phoneNumber, response.getHttpStatus(), response.getData());
return Result.failure("发送短信失败");
}
} catch (Exception e) {
log.error("发送短信出错 {}", phoneNumber, e);
return Result.failure("发送短信出错");
}
return Result.success(code);
}

public static boolean isPhoneNumber(String phoneNumber) {
Matcher m = PATTERN.matcher(phoneNumber);
return m.matches();
}
}
  • 其中模板中的${code}即为随机生成的验证码,将此验证码发送到用户手机,并将此验证码和其过期时间一起保存到session中供业务验证

敏感词检测

ToolGood.Words

1
2
3
4
5
6
<!-- 敏感词校验: https://github.com/toolgood/ToolGood.Words/blob/master/java/toolgood.words/README.MD -->
<dependency>
<groupId>io.github.toolgood</groupId>
<artifactId>toolgood-words</artifactId>
<version>3.0.3.1</version>
</dependency>
  • 使用
1
2
3
StringSearch commonStringSearch = new StringSearch();
commonStringSearch.SetKeywords(MiscU.toList("敏感词1", "敏感词2"));
commonStringSearch.ContainsAny("我包含了敏感词1"); // true

阿里云

ECS云服务器

Windows

  • 新增磁盘

快照

  • 菜单位置:云服务器 ECS / 快照
  • 费用
    • 快照存储费用: 100G = 0.4元/天
    • 异地快照备份(可选): 网络传输费(0.5元/GB) + 异地存储费(同上)
  • 云盘快照
    • 创建快照:创建速度很快(如100G几秒钟就完成了) - 阿里云自动将快照上传到OSS(相对较慢, 如100G需要10分钟) - 恢复快照速度很快(几秒钟)
      • 如果非高并发等对性能要求很高的场景,对数据库备份基本无影响(如设置成每天0/10/12/15/18/22点进行快照)
    • 恢复快照(回滚云盘):先服务器停机 - 对某个快照执行回滚云盘;如果当前正在备份或上传快照则无法对服务器停机
    • 创建自定义镜像:将某个快照创建成自定义镜像
      • 可将此镜像创建新的ECS实例
      • 或复制到另外一台服务器上(停机后,更换操作系统): 目标服务器的磁盘必须大于等于镜像磁盘(否则需要补扩充磁盘的费用, 还是最低100G?)
      • 可复制到其他阿里云账号下(共享镜像)
  • 自动快照策略
    • 同一个磁盘只能设置一个自动快照策略,如需要设置多个时段创建快照,可设置成如:周一至周日的0,12,18点进行快照
    • 案例:如果100G的数据,每天创建一个快照,保留最近3天的快照,则每天存储的数据量为300G,相当于1.2元/天。(如果磁盘为100G,只使用了20G,则按照20G的数据计算)
  • 快照一致性组:如可以将某个服务器的系统盘和数据盘进行快照绑定,防止数据不一致的情况(类似整机快照);但是要求为ESSD类型云盘(高效云盘不支持)
  • ECS整机备份?

云服务器迁移流程

场景: 阿里云某个实例不再续费,重新购买实例,将老实例整体迁移到新实例

  • 先关闭老实例上应用程序
  • 基于自定义镜像创建
    • 再对老实例创建快照,然后创建自定义镜像。如果新实例再另外一个阿里云账户则可将实例共享给其他账户;如果新实例在另外一个厂商,可下载镜像到本地然后上传
    • 创建新实例,创建的时候镜像选择自定义镜像或共享镜像,密码可使用镜像中的密码(这样密码无需更换)
      • 新实例磁盘大小必须大于等于镜像磁盘大小,其他可进行减配
      • 新实例的安全组开放端口需设置成和老实例一致
      • 实例创建后自动启动
  • 克隆实例: 克隆时选择保留数据(会创建新的磁盘和公网IP),开始克隆钱需要保证账户中余额足够
  • 对于宝塔面板
    • 直接通过新的外网IP访问即可(访问后可将面板设置 - 服务器IP修改成新的IP)
    • 宝塔面板https如果基于IP则需要重新申请证书:要先关闭面板SSL,然后重新打开(需要保证认证域名为新的IP)再下载证书即可
    • 宝塔项目中配置的证书无需修改(证书是基于域名签署的)
  • 修改域名映射的外网IP地址
  • 最后回到老阿里云账户,解除镜像共享(才能删除镜像和快照),然后删除镜像和快照

CDN与ESA

  • 说明
    • 走了 CDN, 相当于源站前面有一层代理
  • CDN: https://cdn.console.aliyun.com/
  • 边缘安全加速 ESA: https://esa.console.aliyun.com/ 下一代 CDN
    • 基础版: 9.9/月, 包含50G(超过部分0.198元/GB), 100% CDN功能, DDoS, 拦截流量不计费
    • 站点管理: 添加域名 - 配置域名 DNS 服务器指向 ESA 指定的(不同于阿里云默认的云解析 DNS 服务器)
      • 用量封顶: 按照分钟/小时/天/月配置站点流量超过阈值则可停用站点, 防止被攻击时超量导致额外费用
      • DNS - 记录: 解析域名, 启动代理加速(这样可以隐藏源 IP, 防止 DDoS等攻击)
      • SSL/TLS
        • 边缘证书
          • 走了 CDN, 相当于源站前面有一层代理, 所以需要网站 HTTPS, 则必须配置边缘证书(源站证书可以不用配置)
          • 默认会生成 Let’s Encrypt 3 个月的免费证书, 会自动续签
          • 强制HTTPS 开启
          • HSTS 开启
      • 安全防护
        • 安全分析
        • WAF: 区域黑名单(如拦截国外, 支持放行,拦截,JS挑战等策略)
        • Bots: 绝对是Bot - 观察
      • 数据分析
        • 分析和日志 - 流量分析
        • 安全防护 - 安全分析
    • 流量计算
      • 请求(一般很小, 上传文件可能会大一些)和响应都计算在内
      • 只有浏览器显示from disk cache才不计算在流量内,尽管命中了 ESA 的缓存(只是不回源了,仍然消耗 ESA 流量)也计算流量
    • ESA 缓存命中判断,查询响应头的x-site-cache-status/x-cache等(类似 nginx $upstream_cache_status 取值), x-swift-cachetime 缓存时间
      • HIT 响应包含来自缓存的最新有效的内容
      • MISS 响应在缓存中找不到,所以需要在服务器中取得。这个响应之后可能会被缓存起来
      • BYPASS 响应来自原始服务器而不是缓存,因为请求匹配了一个proxy_cache_bypass。这个响应之后可能会被缓存起来
      • DYNAMIC 如调用 API 会走原始服务器
      • EXPIRED 缓存中的某一项过期了,来自原始服务器的响应包含最新的内容

云安全中心(sas)

  • 价格案例
1
2
3
4
5
6
7
8
# 2024-09 购买2年 12348.00 元
保有服务器台数:2
应用防护授权数:8 # WEB漏洞分析与防护
防勒索:300G # 防勒索包含2层被动防御,和第3层备份机制(此处的空间就是用于备份的, 如数据库进行全量或增量备份, 无异地备份功能)
防勒索托管服务:否 # 指会有特定人员帮助到阿里云后台进行配置、之后有问题可协助数据恢复(仅快照恢复,如果需要数据解密需要找云市场的第三方机构)
恶意文件检测SDK:否
日志分析:50G
版本选择:企业版
  • 主机资产授权绑定解绑: 主机资产 - 服务器 - 剩余授权数 - 管理
  • 风险治理 - 漏洞管理
    • 如果修复系统漏洞(如windows漏洞), 需要保证系统盘有足够的存储空间用来下载补丁()
  • 防护配置 - 主机防护 - 防勒索
    • 数据库防勒索
      • 同一台服务器只能备份一个数据库实例(如备份了Oracle就不能再备份Mysql)
      • 如Oracle必须为归档模式(会产生归档日志, 开启后需要考虑定期清理归档日志)

域名与证书

  • 域名与网站 https://dc.console.aliyun.com/
    • 注册域名
    • 修改域名 DNS 服务器(NS记录), 修改后24H左右生效(一般新客户端1-2分钟就能生效; 老客户端可能得几分钟或几个小时不等, 可能网络的中间DNS服务器没有及时刷新)
  • 云解析 DNS https://dnsnext.console.aliyun.com/
    • 使用阿里云 DNS 服务器时, 进行域名解析
    • 支持区分国内和国外分别解析(如不解析国外线路,则国外 IP 无法访问)
  • 数字证书管理服务
    • SSL证书
      • 单个域名 - DV域名级SSL - 免费版
      • 一次只能申请一个二级域名,有效期1年,可申请多个,同一域名可重复申请
      • 生成成功后会自动解析到阿里云域名,如申请api.aezo.cn的证书,会生成一个_dnsauth.api的解析

DataV可视化大屏

  • 如果进入控制台通过https://datav.aliyuncs.com/进入,则生成的发布链接也是HTTPS,且调试和发布后的API都需要是HTTPS,图片也要是HTTPS;如果进入控制台通过http://datav.aliyuncs.com/进入,则HTTP即可

基础平面地图

  • 基于蓝图编辑器更新组件配置,可设置参数如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// 基础平面地图可更新配置项说明
{
// 无极缩放
"steplessZooming": true,
// 高清渲染
"highPerformance": false,
// 全局配置
"mapOptions": {
// 地图背景
"background": "rgba(0,0,0,0)",
// 地图缩放
"zoom": {
// 缩放范围
"zoomRange": [
0,
18
],
// 默认级别
"defaultZoom": 12.9
},
// 中心点坐标
"center": {
"lng": 121.6165,
"lat": 31.1593
},
// 比例尺控件
"scaleControl": {
// 是否展示
"show": false,
"fontColor": "#fff",
"borderColor": "#777"
}
},
// 弹框配置
"popupStyle": {
"textStyle": {
"fontFamily": "Microsoft Yahei",
"fontWeight": "normal",
"fontSize": 12,
"color": "#FFFFFF"
},
"lineHeight": 1.4,
"borderRadius": 5,
"margin": {
"top": 10,
"bottom": 10,
"left": 20,
"right": 20
},
"backgroundColor": "rgba(6, 75, 199, 0.8)",
"closeBtn": {
"color": "rgba(255, 255, 255, 0)",
"size": 16,
"top": 0,
"right": 0
}
},
// 交互配置
"interactive": {
"dragging": true,
"scrollWheelZoom": true,
"isInteractive": true
}
}

三维城市地图

  • 三维城市只支持部分城市和城市的部分区域,且最大范围是9Km2。如果需要显示范围较大可多使用几个三维城市组件对地图区域进行切割,然后动态进行组件显示和隐藏。需要(独立)显卡和机器配置较好
  • 暂时不支持基于蓝图编辑器进行组件配置更新,如动态更新三维城市区域

Sealos

Cloudflare

  • CND服务

Workers

  • 可用于API代理,如OpenAI
  • 增加服务后,添加如下脚本,相当于基于nodejs增加了一层HTTP代理(客户端 -> cloudflare - 目标服务器)
    • 由于HTTP无法加密,安全组织很容易识别到传输内容,因此cloudflare默认域名一般无法访问,可绑定一个自定义域名(访问量大的话容易上白名单)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
addEventListener('fetch', event => {
event.respondWith(fetchAndApply(event.request));
})

async function fetchAndApply(request) {
let response = null;
let method = request.method;

let url = new URL(request.url);
let url_hostname = url.hostname;
url.protocol = 'https:';
url.host = 'api.openai.com';

let request_headers = request.headers;
let new_request_headers = new Headers(request_headers);
new_request_headers.set('Host', url.host);
new_request_headers.set('Referer', url.protocol + '//' + url_hostname);

let original_response = await fetch(url.href, {
method: method,
headers: new_request_headers,
body: request.body
})

let original_response_clone = original_response.clone();
let original_text = null;
let response_headers = original_response.headers;
let new_response_headers = new Headers(response_headers);
let status = original_response.status;

new_response_headers.set('Cache-Control', 'no-store');
new_response_headers.set('access-control-allow-origin', '*');
new_response_headers.set('access-control-allow-credentials', true);
new_response_headers.delete('content-security-policy');
new_response_headers.delete('content-security-policy-report-only');
new_response_headers.delete('clear-site-data');

original_text = original_response_clone.body
response = new Response(original_text, {
status,
headers: new_response_headers
})

return response
}

Github集成

github文件预览

  • 谷歌插件Octotree(目前github已支持文件预览)
  • github.com域名改成github1s.com,会将仓库通过在线VsCode打开(需要github授权)
  • github.com域名改成github.dev,或者按键,会将仓库通过在线VsCode打开
  • sourcegraph 支持代码笔记 (可安装对应谷歌插件)

Gitpod远程运行仓库代码

  • 参考文章 https://juejin.cn/post/7201383723236458551
  • Gitpod是一个在线集成开发环境(IDE),部署于Kubernetes集群,它为每个工作区创建一个独立的Pod容器
    • 它可以使开发人员能够轻松地在浏览器中编写、构建和测试他们的代码,使用Gitpod可以提高开发效率、减少环境配置时间和节省计算资源。免费使用
    • 支持本地编辑器打开(但是运行环境仍然是远程gitpod环境,代码也存储在远程)
  • 使用
    • github.com域名改成gitpod.io,或者使用谷歌插件
    • 然后Dashboard新建Workspace
    • 选择github对应仓库(可先将他人项目fork过来)
    • 选择编辑器(默认在线VsCode,之后可修改)
    • 配置好后,会自动创建一个gitpod空间,并初始化环境
    • 此时可切换项目分支(如stable等稳定分支)

Railway

  • railway
  • 2020 年成立的 PaaS 平台,无需信用卡的免费版可以提供 5 美元的额度,如果绑定信用卡则每个月可以使用 10 美元的额度
  • 它支持数据库和 Docker,所以比起 Vercel 或 Netlify,它更像是 Heroku 的替代品

ClawCloud

  • ClawCloud
  • 免费VPS,无需绑卡,赠送5美元额度,4C/8G/10G磁盘/10G流量

Zeabur

ChatGPT开源小程序