micro-services
项目工程化、微服务相关介绍
项目工程化
开源规范
1
2
3
4
5
6
7
8
9
10
11
12# 开源协议
1. GPL - General Public License
> 衍生代码的分发需要开源并且也要遵守此协议
2. MPL
> 允许免费重发布、免费修改,但要求修改的代码版权归软件发起者,这种授权维护了商业软件的利益,要求基于这种软件的修改无偿贡献版权给该软件
3. LGPL
4. Apache
> Apache 2.0协议除了为用户提供版权许可之外,还有专利许可,适合设计专利内容的项目
5. BSD
>
6. MIT
> MIT 协议是所有开源许可中最宽松的一个,除了细笔包含许可声明之外,再无任何限制开源规范
1
2
3
4
5
6
7
81. 项目结构:
2. 严格遵循代码规范:
3. 代码质量:
4. 单元测试覆盖率:
5. 版本发布规范:
6. 向下兼容:
7. 详细的文档说明:
8. 安全:文档规范
1
2
3
4
5
61. README文档
介绍项目功能、安装、部署、使用
2. 项目文档
开发文档: 说明项目的开发流程
用户文档:
3. API接口文档版本规范
1
2
3
4
5
6
7
8
9
10
11语义化版本规范: SemVer: 主版本号.次版本号.修订号 (X.Y.Z), XYZ为非负的整数,禁止在数字前方补零
主版本号: MAJOR: 当做了不兼容API修改
次版本号: MINOR: 当做了向下兼容的功能新增及修改 -- 偶数为稳定版本,奇数为开发版本
修订号:PATCH: 向下兼容问题修正
X.Y.Z[-先行版本号][+版本编译元数据]
1. 实际开发的时候,使用0.1.0作为第一开发版本号
fix类型的commit 可以将修订号+1
feat类型的commit可以将次版本号+1
breaking change的commit将主版本号+1Commit 规范
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
31Commit Message包含三部分:
Header: <type>[optional scope]: <description>
type:
feat: 新增功能
fix: Bug修复
perf: 提高代码性能的变更
style: 代码格式类的变更
refactor: 其他代码类的变更,这些变更不属于feat,fix,perf和style. 简化代码,重命名变量、删除冗余代码
test: 新增测试用例或是更新现有测试用例
ci: 持续集成和部署想干改动,
docs: 文档类更新
chore: 其他类型,构建流程、依赖管理或者辅助工具的变动
scope:
description: 动词开头,使用现在时
Body:
Footer:
git rebase: 重写历史
git rebase -i <commit ID> 这里是需要合并commit中最旧commit的父commit ID
git reset HEAD~3A 撤销过去的commit,重新提交
git commit --amend: 修改最近一次commit 的 message
Commit Message是commit数据结构中的一个属性,如果Commit Message有变更,则commit ID一定会变,git commit --amend只会变更最后一次的commit ID, git rebase -i 会变更父commit ID之后的所有提交commit ID.
如果当前分之有未commit的代码,需要先执行git stash将工作状态进行暂存,当修改完成后在执行git stash pop恢复之前的工作状态目录结构设计
1
2
3
4
5
6# 结构化目录结构
/cmd -- 组件
/internal -- 私有应用和库代码,不希望在其他应用和库中被导入
/pkg -- 存放可以被外部应用使用的代码库
# 平铺式目录结构
> 这种方式在很多框架/库中存在,好处式引用路径长度短工作流设计
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20# 集中式工作流
> 适用于团队人数少、开发不频繁、不需要同时维护多个版本的小项目
# 功能分支工作流
> 不同功能在不同的分支进行开发,最后合并到master分支
Merge pull request:
1. Create a merge commit: git merge --no-ff. feature分支上所有的commit都会加到master分支上,并且会生成一个merge commit。
2. Squash and merge: git merge --squash. feature分支上所有的commit都合并成一个commit.然后加到master分支,原来的commit历史会丢失
3. Rebase and merge: git rebase. 将pull request上所有提交历史按照原有顺序依次添加到master分支的头部HEAD.
# Git Flow工作流
> 比较适合大型的项目或者迭代速度快的项目
master: 该分支最新代码是发布状态,不能直接在该分支上开发,master分支每合并一个hotfix/release分支,都会打一个版本标签
develop: 该分支是开发中的最新代码,该分支只做合并操作,不能直接在该分支上开发
feature: 功能开发,基于develop分支新建一个feature分支,feature分支合并之前先pull一下develop分支,
release: 在发布阶段作为版本发布的预发布分支,基于develop分支创建, 测试通过后,将release分支合并到master和develop,并在master分支上版本标签,最后删除release版本分支
hotfix: 在维护阶段做紧急Bug修复分支,hotfix分支合并到master和develop分支,并在master分支打上修复后的版本标签,最后删除hotfix分支
# Forking 工作流
项目远程仓库和开发者远程仓库完全独立,开发者通过Pull Request的方式给远程仓库贡献代码,项目维护者选择性地接收任何开发者的提交,通过这种方式,可以避免开发者项目远程仓库的权限,从而提高项目远程仓库的安全性研发流程
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# 需求阶段
1. 市场调研 - PDM(Product Manager) 产品经理
2. 需求分析 - PM(Project Manager) 项目经理
3. 需求文档 - 最终产物
4. 需求评审
# 设计阶段
1. 交互设计 - UX(User Experience) 交互设计师
2. 视觉设计 - UI(User Interface) 视觉设计师
3. 技术设计
4. 技术评审 - 最终产物
5. 需求排期
# 开发阶段
- 开发 - Makefile - RD(Research and Development engineer) 研发工程师
1. Git Flow工作流
2. 生成代码 -- 尽可能自动生成代码
3. 版权检查
4. 静态代码检查
5. 单元测试
6. 编译
7. 自测
8. Code Review
9. Merge
- 构建 - CI/CD
1. 代码扫描
2. 单元测试
3. 编译打包
4. 归档[镜像仓库]
# 测试阶段
> 测试阶段为了不阻塞测试,确保项目按时发布,研发人员应该优先解决测试同学的Bug,至少是阻塞类的Bug
1. 功能测试 - QA(Quality Assurance) 质量管理工程师
2. 性能测试 - QE(Quality Engineering) 质量工程师
3. 集成测试
4. 系统测试
# 发布阶段
- 代码发布
1. 合并到主干 - Master分支
2. 生成版本号
3. 打标签
4. 代码扫描
5. 单元测试
6. 编译
7. 发布构建产物
- 发布审批
1. 资源申请
2. 创建发布计划
3. 创建发布单
4. 发布单审批
- 服务发布
1. 预发部署
2. 预发验证
3. 现网部署
4. 现网验证
# 运营阶段
- 产品运营
1. 技术沙龙
2. 技术推文
- 运维运营 - OP(Operation) 运维工程师
1. 运维工具
2. 日志系统
3. 监控告警应用生命周期管理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24# 研发模式
- 瀑布模式
- 优点:
1. 严格按照研发阶段推进研发进度,流程清晰,适合按项目交付的应用
- 缺点:
1. 变更困难
2. 研发周期长
- 迭代模式
> 不要求每个阶段的任务做到最完美,而是先把主要功能搭建起来,然后通过客户的反馈信息不断完善
- 敏捷模式
> 敏捷模式把一个大的需求分成多个、可分阶段完成的小迭代,每个迭代交付的都是一个可使用的软件,开发过程中,软件要一致处于可使用状态
- Scrum开发模式
# CI/CD
CI: Continuous Integration, 持续集成
CD: Continous Delivery, 持续交付
CD: Continous Deployment, 持续部署
# DevOps: 研发运维一体化
- AIOps: 职能运维
- ChatOps: 通过聊天窗口的机器人Bot出发任务
- GitOps:
> 开发人员开发完代码后推送Git仓库,触发CI流程,CI流程通过编译构建出Docker镜像,并将镜像push到Docker镜像仓库,Push动作触发Push事件,通过webhook形式通知Config Updater服务,Config Updater服务从镜像仓库中下载镜像,并更新Git仓库中的kubernetes YAML文件
- NoOps:
介绍Web框架
- Gin
Go编写的web框架,是一个类似martini性能更好的API框架
1
2
3
4
5
6
7
81. Engine: 初始化gin对象实例,
日志
中间件
路由控制
handlercontext
2. Router: 定义各种路由规则和条件
3. Context: 允许在中间件中共享变量,管理整个流程,验证请求的json以及提供
4. Bind:
介绍微服务架构设计
服务化基础设施技术选型
- 服务间通信中间件
- 同步方式: RPC
- 异步方式: MQ
- 服务间通信中间件
客户端一致性
共享相同connection可以在同一个事务里
1
2
3
4
5
6
7
8
9
101. begin tx 开启本地事务
2. work 执行业务操作
3. 向同实例消息库插入消息
4. tx 事务提交
5. send 网络向server发送消息
6. response server 回应消息
7. 如果server回复成功则删除消息
8. scan 补偿任务扫描未发送消息
9. send 补偿任务补偿消息
10. 补偿任务删除补偿成功的消息服务端存储模型
1
2
3
4
5
6
7
8
9
10# Kafka RocketMQ基于partition存储模型
每个subject分为一个或多个partition,而Server收到消息后将其分发到某个partition上,而concumer消费的时候与partition对应。合理的分配策略是partition个数与consumer个数成倍数关系.
静态绑定关系导致consumer扩容缩容比较麻烦
顺序append文件,提供很好的性能
顺序消费文件,使用offset表示消费进度,不给给个消息记录消费状态,成本极低
将所有subject的消息合并在一起
# 业务使用消息 vs. 数据流处理区别
> 数据流中消息主题少,每个消息主题的吞吐量极大
> 业务中消息主题极多,很多主题量级很小
BFF - Backend For Frontend 服务于前端的后端
用户体验适配器
设计原则
- 计算中所有文件都可以通过添加一个中间层来解决,一个中间层解决不了就添加两个