Gopher China作为国内最权威和最实力干货的Go大会,致力于为广大的Gopher提供一线分享交流机会,也为众多一线互联网公司大咖深入探讨Go语言的应用发展提供契机。

在近日于上海召开的第六届Gopher China大会上,华为云微服务首席架构师田晓亮就受邀分享了《华为云的Go语言云原生实战经验》,讲述如何构建韧性、高可靠、安全的云原生应用系统,并孵化云原生应用开发框架Go chassis,以提升团队开发效能。

自华为在2016年成立Cloud BU以来,就引入了Go语言编写的Kubernetes,Prometheus等CNCF项目,华为云的研发团队也开始用Go语言来构建云服务。不过,当时Go的生态并不完善,所以要自己从头到尾编写基础能力模块。

那么,如何用Go构建云服务并将基础能力慢慢建立起来,且听我们慢慢道来。

从一个简单云应用看我们如何构筑一个云服务

和Eureka一样,一个简单的注册发现服务Service Center可以通过多种手段来增强。

1、静态与动态信息定义

减少数据信息量,抽出公共部分统一管理,通过静态信息来划分实例组。这样微服务与微服务实例为1对n的映射,将微服务名、版本、数据中心等信息都抽到了公共部分,通过降低冗余度,来减少网络的开销,同时也规范化了微服务模型。

2、契约化微服务

上一张图我们看到微服务静态信息里面包含了多个Schemas,里面关联了微服务所关联的契约文档,同样是1对n的映射关系。通过手动上传或者代码自动生成文档上传,可以在注册中心中查看微服务文档,且文档与微服务版本绑定,不允许更改。

对比客户端开发团队等待后端的服务编写完成后,才开始进行集成开发的方式。高效方式是以文档为基准,客户端与服务端同时开发,客户端通过Mock去除对服务端的依赖。

为何要保证文档先行?如果文档不及时审视,那么将会出现非常糟糕的情况。比如不一致的命名规范,定义相似的API,扩展能力差,任何一点都会大大增加研发成本。及早审视并规避十分重要,这就是为何注册中心加入文档上传与查询能力。

3、服务间依赖管理

调用层级过高将引起定位困难、性能下降的问题,合理的层级是3个服务:a->b->c的调用就可以完成一次调用。彼此互相依赖的两个服务在功能升级或者变更时要花费更多时间来分析影响,比如ab互相依赖,一个新功能涉及2个都要更改,那怎么一起上线?

简单的依赖有助于系统测试和分析,这给架构师一个很好的审视方式,可以及时看到微服务间的依赖关系,以及时对架构调整。

4、缓存机制

由于Service Center内部本身是不存数据的,一旦etcd出现网络故障的时候,就会导致Service Center不可用。所以Service Center引入了异步缓存机制,启动之初,Service Center会与etcd建立一个长连接,也就是watch。为了防止建立watch时间窗发生变化,又做了一层保护,在watch之前做全量的查询。运行过程中查询所得到的资源变化会缓存到Service Center本地,然后进行异步的循环。

总的来说,我们通过了多种手段来提升微服务研发效率,减少网络开销,并通过异步缓存提升性能。这是华为云积累的能力,但交付一个云服务远远不止交付业务功能这么简单,还要考虑微服务的安全、韧性、隐私、可运维等能力。

我们刚才看到的只是水面之上的冰山,水面之下还隐藏着大量的基础能力需要编写。真的要达成微服务架构模式的愿景,需要繁重的工作量。就像冰山那样,我们要将通用能力沉淀下去,能够复用。如果让各个业务团队同时照顾冰山上下,各自开发各自的,那结果将是灾难性的,企业用人成本极高,下面让我们展开Service Center的架构看看。

立足Service Center架构,“冰山下”的基础能力库编写很重要

下面这个组件主要负责微服务的注册发现,提供Restful API。

它有四个主要的模块:

l 服务注册发现:通过注册发现完成服务拓扑的感知;

l 契约发现:每个服务具备一个契约记录,支持多种格式如Open API,gRPC proto;

l RBAC:基于角色的访问控制,管理员可以管理账号,将账号分发给微服务或者不同人员;

l 服务治理:针对微服务下发治理规则,比如重试,限流,熔断,路由策略等。

交付一个云服务远远不止交付业务功能,而是要去全方面的考虑安全,韧性,隐私,可运维等能力,当然我们将部分的能力可以交给一些中间件来完成,比如网关。然而仍有大量功能需要自己编写,且可以复用在每个微服务中,这就是基础能力库编写的初衷。

l 配额管理:云资源按照租户进行配额管理,租户所能使用的资源受到严格限制

l 告警:当微服务发生关键问题时要直接上报告警系统,而非通过云服务设置阈值等告警策略

l 安全:加解密证书,密码

l ID生成:ID的生成算法,用于生成微服务ID,实例ID等

l 多种中间件:调用过程需要被审计,调用链追踪,生成指标监控等

该项目已经开源并捐献给Apache,项目地址https://github.com/apache/servicecomb-service-center

对于这些能力,抽取普通的库函数也是完全不够用的,所以要做到如下能力:

可插拔:也就是按需在编译期引入(受限于Go语言能力),例如配额系统的具体实现在社区是不需要的。

异构系统:也就是一个功能要有多种具体实现,比如审计,公有云存在一套审计系统需要对接,而社区则是本地日志打印。

不同的算法:解密工具、ID生成器……面对不同的交付场景或安全要求,都要通过不同实现来替换算法。比如ID生成可以是snowflake、UUID;加解密算法使用AES或者其他公开算法。

如何通过Go Chassis加速云服务开发?

为了满足上面提到的需求多样性,并且让所有新规划的组件受益、快速进行开发,我们需要统一的框架和标准来加速开发,这就是华为云用Go语言编写的开发框架Go Chassis诞生的原因。所以大家看可以看到go chassis的源码和设计有着service center代码的影子。

更多干货,敬请期待下一期揭秘。

点击了解基于GoChassis开发的微服务:应用管理与运维平台_ServiceStage_运维管理平台_应用运维平台_应用管理平台_应用服务_微服务应用-华为云

go gorm 密码隐藏_掀开华为云的Go语言编程底座!有深度、有点难、需细品(上)...相关推荐

  1. 怎么修改服务器密码忘了怎么办啊,华为云怎么修改服务器密码忘记

    华为云怎么修改服务器密码忘记 内容精选 换一换 主动修改密码如果您的华为云帐号暂未升级成华为帐号,且您记得当前密码,需要主动修改密码,可以在"基本信息"中修改自己的密码.如果您的华 ...

  2. syslog 华为 服务器_删除华为云服务器自带的探针

    不喜欢服务器上跑着不明的进程,年初入了几个华为云耀云服务器,这一篇记录如何卸载华为云服务器自带的系统探针,系统为Debian 10. 首先我们来看一下服务器有哪些进程: pstree -a 可以查到与 ...

  3. 华为python有必要学吗_【华为云技术分享】这个 Python 库有必要好好学学

    这里看一个最基本的例子,这里给到一个 User 的 Class 定义,再给到一个 data 数据,像这样: 1 class User(object):2 def __init__(self, name ...

  4. 华为过程可信cib是指_【华为云技术分享】如何做一个优秀软件-可扩展的架构,良好的编码,可信的过程...

    1.可信软件的基础是软件优秀 可信突破是阶段性工作,可信只是优秀软件的一部分,单独追求可信是缘木求鱼. 2.什么是优秀软件 要系统的考虑如何开发优秀软件 对外:功能多,性能好,用户体验好,生态丰富 内 ...

  5. 【文末有奖】华为云“网红”语言Python课程来啦!

    摘要:来华为云社区学Python,瓜分40万码豆还有HUAWEI GT手表拿! 本篇文章有惊喜,说不定幸运儿就是你(直白说吧,文章末尾有抽奖!!!). 现代职场大量重复性的工作.日报周报月报无穷无尽. ...

  6. 【华为云技术分享】Spark如何与深度学习框架协作,处理非结构化数据

    随着大数据和AI业务的不断融合,大数据分析和处理过程中,通过深度学习技术对非结构化数据(如图片.音频.文本)进行大数据处理的业务场景越来越多.本文会介绍Spark如何与深度学习框架进行协同工作,在大数 ...

  7. 【华为云技术分享】如何度量前端项目研发效率与质量(上)

    DevUI是一支兼具设计视角和工程视角的团队,服务于华为云DevCloud平台和华为内部数个中后台系统,服务于设计师和前端工程师.欢迎来这里和我们一起打造优雅高效的人机设计/研发体系. 官方网站:de ...

  8. HDC.Cloud2021|华为云ModelArts Pro,让行业AI开发不再难

    去年,在华为开发者大会2020(Cloud)期间, 华为云发布了ModelArts Pro AI 应用开发套件,包括了视觉套件,文字识别套件,自然语言处理套件等. 经过一年的发展,华为云通过Model ...

  9. 华为云数据库 MySQL 内核新特性上线,首家彻底解决用户上云需改造应用的问题

    最新消息,搭载 HWSQL 内核的华为云数据库 MySQL,近期上线了几大关键特性.其中通过深入改造.去除社区版 GTID 约束限制的特性,更是首家彻底解决了用户上云需要对应用进行改造的问题. GTI ...

最新文章

  1. 本地方法接口和本地方法栈
  2. 数据库 ACCESS与SQL SERVER 2000分页SQL语句 分析
  3. Python 爬虫学习笔记
  4. 什么是数据库的三大范式?
  5. 笔记︱支持向量机SVM在金融风险欺诈中应用简述
  6. windows10改变鼠标指针
  7. R语言风玫瑰图绘制(附代码)
  8. 基于R语言的聚类分析
  9. java word 分段符,Word2013文档中插入分隔符(分节符)的方法
  10. 炒股两个指标: M1增速和筹码分布
  11. bootstrap 滚动 进度条_Bootstrap中的进度条
  12. 上班时间如何偷偷刷抖音不被发现?教你一招搞定
  13. Tkinter模块GUI界面化编程实战(七)——人机对战五子棋(含超详解及完整源码、完整程序免费下载链接)
  14. oracle 采购模块表信息,EBS采购(PO)模块常用表
  15. usbip--局域网内共享的USB设备
  16. 【读书笔记】Peano公理(为什么“数学归纳法”是正确的?为什么“数学归纳法”可以那么用?)
  17. 花千骨与虐死人的源代码
  18. vsftpd2.3.4笑脸漏洞
  19. 逻辑仿真工具VCS的使用-Makefile
  20. 二进制枚举子集的方法

热门文章

  1. VD-BERT:用BERT搭建统一的视觉对话模型
  2. 「推荐系统」领域近期有哪些值得读的论文?| 每周论文清单
  3. 数学建模第三节2020.4.17-5.3补
  4. php mysql服务器配置_配置最新的PHP加MYSQL服务器
  5. 定义快捷代码_Qt Creator快捷键
  6. linux 虚拟机大量udp请求失败_理解 Linux 网络栈:Linux 网络协议栈简单总结分析...
  7. Ⅰ:zookeeper的单机安装 - 详细教程
  8. Elasticsearch系列「零」架构解析与最佳实践
  9. @RequestParam和@RequestBody
  10. Baby Coins