项目部署与发布

目前我们的k8s部署是通过金丝雀发布(灰度发布),

  1. 发布新版本时,当新版本的Pod全部启动成功后,依次替换旧版本的pod
  2. 旧版本的Pod继续运行10秒但不接受新的请求,方便旧pod的异步任务数据处理,10秒后再Kill掉旧版本的Pod。

部署流程:服务重启 => 10秒灰度发布,新旧pod共存 => 新pod依次替代旧pod,旧pod移除调度,等待10秒后发送kill -15信号量给程序 => 程序接受信号量并终止,删除旧pod

Go Zero

官方文档

点击前往

启动服务

1
2
// API 或 rpc 代码运行
cd project/service/user/cmd/api && go run user.go -f etc/user.yaml

rpc调用链建议

在设计系统时,尽量做到服务之间调用链是单向的,而非循环调用,例如:order服务调用了user服务,而user服务反过来也会调用order的服务, 当其中一个服务启动故障,就会相互影响,进入死循环,你order认为是user服务故障导致的,而user认为是order服务导致的,如果有大量服务存在相互调用链, 则需要考虑服务拆分是否合理。

面向故障编程

Bug与故障

Bug

Bug 是指在软件运行中因为程序本身有错误而造成的功能不正常、死机、数据丢失、非正常中断等现象。有些程序错误会造成计算机安全隐患,此时叫做漏洞。

CDN-内容分发网络

内容分发网络(Content Delivery Network,CDN)通过将站点内容发布至遍布全球的海量加速节点,使其用户可就近获取所需内容,避免因网络拥堵、跨运营商、跨地域、跨境等因素带来的网络不稳定、访问延迟高等问题,有效提升下载速度、降低响应时间,提供流畅的用户体验。

常见功能流程图汇总

登录流程

产品原型

产品原型

后端流程图

后端流程图

友盟一键登录文档

  1. 一键登录接口文档:点击前往
  2. 服务端签名机制:点击前往

微信授权登录 api 文档

点击前往

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
// 一个user对应多个wechat: 多个微信账号授权可以绑定到同一个手机号
CREATE TABLE `user_wechat` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT 'userId',
  `unionid` varchar(100) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户统一标识,针对一个微信开放平台帐号下的应用同一用户唯一',
  `openid` varchar(100) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '普通用户的标识,对当前开发者帐号唯一',
  `nickname` varchar(100) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '昵称',
  `gender` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '性别:1男 2女',
  `province` varchar(60) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '省份',
  `city` varchar(60) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '城市',
  `country` varchar(60) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '国家',
  `avatar` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '头像',
  `privilege` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户特权信息',
  `access_token` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
  `refresh_token` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uix_user_wechat_openid` (`openid`),
  KEY `idx_user_wechat_user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='微信账号信息表';

行存储模式和列存储模式

行存储和列存储,是数据库底层组织数据的方式。(和文档型、K-V 型,时序型等概念不在一个层次)

行存储

行存储系统以行的方式来组织数据。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
[
  {
    "title": "Oriented Column Store",
    "author": "Alex",
    "publish_time": 1508423456,
    "like_num": 1024
  },{
    "title": "Apache Druid",
    "author": "Bob",
    "publish_time": 1504423069,
    "like_num": 10
  },{
    "title": "Algorithm",
    "author": "Casey",
    "publish_time": 1512523069,
    "like_num": 16
  }
]

行存储方式

用 etcd 实现 API 网关

应用场景

etcd 是一个高可用强一致性的键值仓库,在很多分布式系统架构中得到了广泛的应用,其最经典的使用场景就是服务发现。

etcd 的场景默认处理的数据都是系统中的控制数据。所以etcd在系统中的角色不是其他NoSQL产品的替代品,更不能作为应用的主要数据存储。etcd中应该尽量只存储系统中服务的配置信息,对于应用数据只推荐把数据量很小,但是更新和访问频次都很高的数据存储在etcd中。

账号层级限流-抢白名单功能

功能说明

应用场景

数据库高负荷时,在员工账号层级进行限流,目的是让数据库尽早缓冲过来

特色功能

  1. 支持临时 追加/减少 白名单名额
  2. 支持重置白名单
  3. 直接配置化,不需要操作数据库

使用案例