华为云的go语言云原生实战经验

Agenda
• 展开一个云上应用来看他的设计与实现
• 如何提升研发效能,更快的交付新的云服务

总结

  1. 注册发现所承担的更多职责以及增强手段,对技术管理者反馈
  2. 如何在本地进行复杂分布式系统的测试,提升研发质量
  3. 实现云原生开发与治理的“通信协议”,无为而治
  4. 内置服务治理、安全、可观察等多种能力,以提供稳定的云上应用, 提升研发效率
展开查看详情

1.华为云的Go语⾔云原⽣实践 定义云应⽤开发的“通信协议”

2.个人介绍 • 11年研发经验,8年云计算领域开发经验 • DevOps,APM,PaaS,混合云等均有深入实践 • 曾在三星负责公司Svoice,AI服务的云化落地 • 现任华为云微服务首席架构师,负责微服务相关产品落地 2

3.Agenda • 展开一个云上应用来看他的设计与实现 • 如何提升研发效能,更快的交付新的云服务

4.团队的第一go程序:Service Center

5.然而不只是注册发现

6. 静态与动态信息定义 • 冗余度降低 这里存了什么 • 减少网络压力 1:n

7.契约管理

8. 为什么应用API first --- 效率低下的开发模式 Client A Client B SDK SDK Client A Client B 调用者团队 API 调用者团队 API SDK SDK mock mock API API 被调用团队 service 被调用团队 service 客户端总是在等待API 服务真正的发布,甚至是 通过注册到Service Center的API生成mock代码进行集成 部署 测试。等到服务发布后,再切换到真实服务进行测试

9.为什么应用API first --- 糟糕的API设计 • 不符合restful风格 • 字段风格不一致 • 扩展能力差 • 易用性差 • API能力相似

10.服务依赖管理 是否双向依赖 是否循环依赖 调用最长深度,调用API总个数 如下两种均属于循环调用,循环调用违背了服务设 如下两种均属于循环调用,循环调用违背了 服务调用形成链条依赖,深度过深即增 计时对层次的要求,应由上层服务调用下层服务, 服务设计时对层次的要求,应由上层服务调 加了服务间的耦合度,也使得数据丢失 同时循环调用也增加了服务间的耦合度,这是一种 用下层服务,同时循环调用也增加了服务间 的风险大大增加。 错误的设计。 的耦合度,这是一种错误的设计。 对这种类型的调用关系进行解耦,首先 循环依赖的情况,识别出形成循环依赖的服务后, 如下两种循环依赖的情况,识别出形成循环 考虑服务的层级关系,以上层服务向下 可以采用webhook的集成方式进行解耦 依赖的服务后,可以采用webhook的集成方 层服务调用的方式进行解耦 式进行解耦 服务 服务1 POS 服务 1 API2 改进 服务 1 API2 服务 2 POS 2 API1 T API1 T API1 服务 改进 服务 服务 服务 1 API2 2 1 2 回 API服务2 API服务3 改进 API服务4 API API API 回调 调 服务 1 API3 API3 服务 3 服务 3 服务2 服务3 服务4

11.缓存机制

12.注册发现增强的收益 • 为架构师提供一个审视视角,比如合理的API设计,依赖关系 • 规范化微服务元数据,防止滥用,减少冗余数据,降低网络开销

13.然而远远不止交付业务功能

14.冰山之下

15.Service Center的层叠架构 Service center 四个主要的模块: Rest API • 服务注册发现:通过注册发现完成 服务拓扑的感知 Middleware • 契约发现:每个服务具备一个契约 Rate limiting Body limiting CORS auth audit monitoring Open tracing 记录,支持多种格式如Open API, gRPC proto 业务能力 Plugins • RBAC:基于角色的访问控制,管 理员可以管理账号,将账号分发给 Contract Discovery RBAC ID gen cipher metrics 微服务或者不同人员 quota alarm log • 服务治理:针对微服务下发治理规 Service Discovery Governance 则,比如重试,限流,熔断,路由 Persistence 策略等。 mongodb etcd https://github.com/apache/servicecomb-service-center 15

16.不同交付局点,不同代码分支交付

17.停止服务

18.如何面对 • 可插拔:按需在编译期引入 • 异构服务:一个后台服务可能有多种具体实现。 • 不同的算法:解密工具,ID生成器,面对不同的交付场景或者是 安全要求,都要通过不同实现来替换算法。 • 分布系统难以治理:框架可以帮助满足云原生应用,如何实现这 样的框架

19.Go chassis云应用开发框架 https://github.com/go-chassis/go-chassis

20.手段1:将后端服务作为插件使用

21.常见的后端服务 • 配额管理 • 认证鉴权服务 • 对象存储服务

22.面向用户 Implement and Install Import package and Configure Call

23.如何实现插件机制 1. 定义后端接口 2. 定义插件集,提供安装API

24.模块初始化

25.手段2:沉淀需求基线

26.基线需求 • 请求体必须做大小限制 • API必须限流 • 密码不能明文存储 • 访问进行认证鉴权 • 无单点故障 • 访问审计 • 运维能力

27.标准化运行时模型 不同部门可能有私有协议诉求,那么服务治理就交给核心框架完成。协 议由业务部门决定自主研发或是集成现有协议。当你发现公司内部不同 部门都在开发自己的协议做自己的服务治理时,再向将业务统一一个架 构,一个工具链上,将非常困难。

28. Handler chain • 认证鉴权,监控,限流,调用链追踪等与流量相关的能力 28

29. 3. Clarify Policy 声明式使用 1. Import package 2. Configure handler chain