开课啦 dubbo-go 微服务升级实战

简介: 杭州开课啦教育科技有限公司是一家致力于为中小学生提供学习辅导的在线教育公司,目前公司后端服务基础设施主要依托于阿里云原生,其中包含计算、网络、存储以及 Kubernetes 服务。

 

技术选型背景

2020 年是开课啦公司发展壮大的一年,整个公司团队由原来的几百人扩充至现在的几千人,在集中使用的时候基本上会有几千人同时在运营后台进行操作,公司原有的内部后台运营系统是用 PHP 搭建起来的,性能跟业务上已逐渐不能满足公司的需求规划,加上目前开课啦公司开发部已经做了微服务拆分,主体对外服务是 java 语言的 Dubbo 集群,后台系统需要无缝对接 java 的 Dubbo 服务,所以 PHP 已经逐渐不能满足开课啦公司的需求。

当时自己也调研过 PHP 的 Dubbo 项目,由于项目已基本无人更新维护所以 pass 掉,后面自己对简洁高性能的 go 语言感兴趣,然后就关注到了 Dubbo-go 项目,经过一段时间的调研之后发现 Dubbo Go 符合我们的业务需要,并且社区非常的活跃,后面便决定选用 Dubbo-go 作为后台的 pc 业务框架。

可能也有同学会问为什么不使用跨言支持程度更好的 gRPC 呢,因为很多公司最开始的 RPC 服务集群都是基于 Dubbo 生态构建的,如果换框架成本太大,所以基本不会考虑,gRPC 虽然跨语言支持程度更好但是很多东西都需要自己造轮子,比如服务注册,服务发现,日志监控等。

当时在决定选用 Dubbo-go 的时候开发内部也有一些反对的声音的,为什么不直接转 java,转 java 的话就没有跨语言通信的问题了,转 java 的问题在于入门成本高,而且对于整个公司的技术栈来说,保持语言的多样性,才能更加从容的应对未来的业务变化,Go 本身是一个不弱于 Java 的高性能语言,非常适合微服务架构。

面临的挑战

确定了框架选型后,我接到的首要任务便是要搭建出一套可快速创建业务项目的脚手架,开发出基于 HTTP 协议的 RPC 代理服务,部署需要接入公司的容器化部署平台,一切都是从零开始,在网上基本上找不到可以借鉴的资料。

首先是要进行 Dubbo-go 项目的架构的规划,确定项目目录结构,经过参考 Dubbo-go Demo 以及其它的 Go 项目最终确定了项目的目录结构,以下目录结构可作为参考。

 

为了与 Java 服务注册中心保持一致,Dubbo-go 在项目选型上选用如下组件:

  • 使用 zookeeper 作为注册中心
  • nacos 作为配置中心
  • 数据库 orm 采用 gorm
  • 消息队列使用 RocketMQ

为了增加开发的效率我们在 provider 服务初始化前可以对配置进行精简只保留最基础的配置就可以类似下面这种,provider 服务的编码参考 Dubbo-go demo 就可以了。

 

下面是服务启动的 main 方法代码:

 

Dubbo-go RPC 服务网关设计

一般使用 Dubbo,provider 端需要暴露出接口和方法,consumer 端要十分明确服务使用的接口定义和方法定义,还有入参返参类型等等信息,还需要基于 provider 端提供的 API,两端才能正常通信调用。

然而网关的使用场景是并不关心要调用的接口的详细定义,网关只关注要调用的方法、传递的参数、能接收返回结果就可以了,实现网关代理的基础是 Dubbo/Dubbo-go 的泛化调用特性。

下面是 Dubbo-go 官方给的 demo,泛化服务加载后需要等待 3 秒才能完成调用,然而在实际使用的时候肯定是不能实时加载服务去等待 3 秒,所以在网关应用启动时就需要加载缓存好需要泛化调的服务。

 

经过对 Dubbo-go 泛化调用 demo 的研究,发现用该特性设计 dubbo-go 网关是可行的,难点在于我们需要把每一个需要网关代理 RPC 服务方法的参数以及服务的路径等配置获取到并缓存起来,这样才能在调用前初始化好泛化调用服务,一个服务的配置如下。

 

由于是用 go 语言做的网关代理,所以不能通过 Java 的 jar 包来获取到 Java RPC 服务配置,如果通过人工维护的话工作量太大,而且易出错,显然是不可接受的。经过一段时间的了解,Java 服务可以通过注解来实现配置的获取,Java 端在方法上加上注解后启动服务的时候会将配置信息通过消息发送到 MQ,网关消费这些消息来实现获取 Java RPC 服务的配置。

Dubbo Go 的 RPC 服务由于 go 语言不支持注解,所以我经过思考自己写了一个扫描代码的小工具,在每个 RPC 服务方法前加上对应的注释,通过对注释的扫描来获取 RPC 服务的配置,获取到配置后在项目目录内生成 RPC 服务配置,启动应用的时候读取配置发送到 MQ。

网关代理实现之后还可以在网关的基础实现更多的功能,比如 token 验证、白名单、限流、熔断、日志监控功能,网关代理请求实现效果如下:

 

容器化部署

公司内部的容器化部署环境为阿里云的 K8s,部署至 K8s 平台只需要提供镜像文件,由于 Dubbo-go 编译后是一个二进制的文件,不需任何额外的第三方库,能在 Docker 环境下稳定运行。有 docker 镜像文件如下图所示,可以用 centos 等任一 linux 发行版作为 base 镜像。

LABEL maintainer="<xxx@xx.com>"
LABEL version="1.0"
LABEL description="KKL-GO-NKO-BASE"`ARG envType=stable
#设置环境变量
ENV envType ${envType}
#编译打包好的压缩包
ADD ./target/nko-base-${envType}.tar.gz /app/WORKDIR /app
EXPOSE 20000

镜像写好后提供给发布平台,发布平台机器启动镜像并解压打包文件,执行 Dubbo-Go 程序 。

Container entrypoint set to [bash, -c, tar -zxf nko-base-stable.tar.gz && SERVER_ENV=kubernetes && sh ./nko-base/bin/load.sh start -group=stable]

由于开发测试到生产一般是有多个部署环境的,所以我们需要改动的dubbo-go samples demo 里的编译脚本,让其支持多环境打包。

另外,Dubbo-go 默认注册的 IP 是 K8s pod 的虚拟 IP,不同 K8s 集群之间网络是不能互通的,所以如果需要跨集群调用就需要修改默认注册 IP,将默认注册的 pod IP + 端口 修改为 Kubernetes 实体机的 IP 加对应端口,Kubernetes 会在 pod 内写入实体机的 IP 加对应端口环境变量,应用程序可以通过读取环境变量获取实体机的 IP加端口,如果需要实现此功能需要修改 Dubbo-go 的注册逻辑。例如以 zookeeper 注册中心为例,我们可以通过扩展
registery/zookeeper/registry.go的 registerTempZookeeperNode 方法来实现修改注册 IP 跟端口,代码如下图,Dubbo-go 官方将在后面的版本以配置的形式支持自定义注册 IP 跟端口的功能。

func (r *zkRegistry) registerTempZookeeperNode(root string, node string) error {...regIp = os.Getenv(constant2.RegistryEnvIP) //实体机的ipregPort = os.Getenv(constant2.RegistryEnvPort) //实体机的端口urlNode, _ := common.NewURL(node)role, _ := strconv.Atoi(urlNode.GetParam(constant.ROLE_KEY, ""))if role == common.PROVIDER && regIp != "" && regPort != "" {urlNode.Ip = regIpurlNode.Port = regPortnode = url.QueryEscape(urlNode.String())}zkPath, err = r.client.RegisterTemp(root, node)...
}

 

作者:曾凡维, 一个有 9 年服务端业务开发经验的一线程序员,曾在腾讯阅文等多家公司担任后端开发工程师,目前就职杭州开课啦教育科技有限公司,从事 go 语言服务基础架构和中间件及部分业务开发工作。

原文链接

本文为阿里云原创内容,未经允许不得转载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/514105.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gui界面设计心得体会 python_Python笔记-GUI界面设计(tkinter)

文章目录前言相关介绍一、函数方法介绍二、导入tkinter库三、窗口[1]. 创建[2]. 设置标题[3]. 设置大小[4]. 设置背景色[5]. 删除窗口四、按钮[1]. 创建[2]. 放置按钮(绝对位置)[3]. 放置按钮(相对位置)[4]. 代码五、单行文本[1]. 创建[2]. 代码前言此篇文章介绍的是有关图形用…

阿里云科技驱动“数字化转型”,助力中小企业发展“突围”

2020年至2021年的新冠疫情&#xff0c; 让全世界进入了困难模式&#xff0c;国家的经济运行不得不放缓脚步。这不仅给每个人造成了很多不便&#xff0c;更是给人们所依赖的企业组织&#xff0c;造成了巨大的影响。每一个微观个体所感受的只是自己身边肉眼可见的影响&#xff0c…

这些中秋礼盒绝了,悄悄惊艳互联网人

整理 | 王晓曼出品 | 程序人生 &#xff08;ID&#xff1a;coder _life&#xff09;来了来了它们来了&#xff0c;2021年腾讯、阿里、百度、字节等诸多互联网大厂带着他们的中秋礼盒来了&#xff01;“八月十五月儿圆&#xff0c;中秋月饼香又甜”&#xff0c;没有月饼的中秋节…

想成为全栈工程师,要做到哪几点?

简介&#xff1a; 如何成为一名全栈工程师&#xff1f;需要具备哪些技术积累&#xff1f;成为全栈工程师有哪些好处&#xff1f;希望本文能为期望成为全栈工程师的同学提供一点帮助&#xff0c;和同学们一起分享交流。 作为开发者&#xff0c;我们不过度区分服务端 server 客户…

DDD as Code:如何用代码诠释领域驱动设计?

简介&#xff1a; 相较于常规的MVC架构&#xff0c;DDD更抽象、更难以理解&#xff0c;各个开发者对DDD的解释也不尽相同。那么哪种设计方式才更好&#xff1f;在学习时如何知道哪种DDD更正统&#xff0c;没有被别人带歪&#xff1f;本文尝试使用“DDD as Code”的概念&#xf…

谈身份管理之进阶篇 - 快速了解从管理到治理的最佳方案

简介&#xff1a; 云上身份安全是当今企业管理者和云上运维团队所面临的挑战之一&#xff0c;针对云上身份管理不全面所产生的风险究竟又哪些&#xff1f;又应当如何应对&#xff1f;本文将结合案例和最佳实践与您分享。 引言 云上身份安全是当今企业管理者和云上运维团队所面…

报名倒计时 | TeaTalk 深圳站邀您共话安全云世界

对越发复杂的网络环境&#xff0c;保障网络安全势不可挡&#xff0c;为此国家也对应颁布了系列规章政策。除相关政策外&#xff0c;网络安全及云安全也同时被列入国家规划重点发展方向&#xff0c;随着“十三五”规划逐渐落实&#xff0c;“十四五”规划制定实施&#xff0c;推…

KubeNode:阿里巴巴云原生 容器基础设施运维实践

简介&#xff1a; 目前 KubeNode 已经覆盖了阿里巴巴集团的所有的 ASI 集群&#xff0c;接下来&#xff0c;将随着阿里巴巴集团“统一资源池”的项目&#xff0c;推进 KubeNode 覆盖更大的范围、更多的场景&#xff0c;让云原生的容器基础设施运维架构发挥更大的价值。 阿里巴巴…

扫盲贴|如何评价一款App的稳定性和质量?

简介&#xff1a; 我们不应该为了掩盖代码质量问题&#xff0c;通过手动try catch去规避某些问题&#xff0c;这样有可能会打断用户的正常使用&#xff0c;并造成感知性的阻断反馈&#xff0c;应该从用户使用APP时的真实感知出发&#xff0c;当出现问题时及时捕获和处理问题。 …

聊聊 5G 云专线

作者|小枣君来源|鲜枣课堂通过本文&#xff0c;和大家分享探讨一下 5G 云专线。我们从今天文章的标题开始说起吧。5G、云、专线&#xff0c;分开的3个词&#xff0c;作为通信人&#xff0c;大家应该都懂&#xff08;专线可能陌生一点&#xff09;。但是&#xff0c;合起来之后&…

谈AK管理之基础篇 - 如何进行访问密钥的全生命周期管理?

简介&#xff1a; 我们也常有听说例如AK被外部攻击者恶意获取&#xff0c;或者员工无心从github泄露的案例&#xff0c;最终导致安全事故或生产事故的发生。AK的应用场景极为广泛&#xff0c;因此做好AK的管理和治理就尤为重要了。本文将通过两种AK使用不安全的典型案例&#x…

2021信服云创新峰会:托管云成上云第三种选择

9月17日&#xff0c;以“万物皆可云”为主题的信服云创新峰会成功举办。中国工程院院士、中国科学院计算技术研究所研究员倪光南&#xff0c;IDC咨询&#xff08;北京&#xff09;有限公司副总裁/首席分析师武连峰&#xff0c;深信服科技股份有限公司创始人、CEO何朝曦&#xf…

三只松鼠:阿里云数据中台基座上的多渠道、多业态生长

简介&#xff1a; 刚刚过去的2020年&#xff0c;对三只松鼠来说更像是一座认知分水岭&#xff0c;三只松鼠CEO章燎原坦言“要忘记流量时代&#xff0c;并习惯放缓增长”&#xff0c;而随后的重要一步&#xff0c;就是以披荆斩棘的姿态进入数据中台建设新赛道。 刚刚过去的2020年…

浅谈专有云MQ存储空间的清理机制

简介&#xff1a; 浅谈专有云MQ存储空间的清理机制 在近⼀年的项⽬保障过程中&#xff0c;对专有云MQ产品的存储⽔位清理模式⼀直存疑&#xff0c;总想一探究竟但又苦于工作繁忙、精力有限&#xff0c;直到最近⼀次项⽬保障过程中再次出现了类似的问题&#xff0c;⼤家对MQ Bro…

气象气候应用在Intel最新处理器Icelake上的性能测评

浪潮HPC实验室 一、Intel第三代至强可扩展处理器(Icelake)性能大升级 Intel于今年发布了第三代至强可扩展处理器系列产品&#xff08;代号Ice Lake&#xff09;&#xff0c;与上一代至强可扩展处理器系列产品&#xff08;代号Cascade Lake&#xff09;相比&#xff0c;第三代…

评审恩仇录——我为什么愿意执行代码评审

简介&#xff1a; 代码评审带来的好处不言自明, 但企业业务快速发展的诉求与代码评审推动落地两者之间, 往往存在矛盾。在如今快速发展的互联网时代&#xff0c;数字化、智能化已经是基础能力&#xff0c;单纯只靠人肉审查的时代已经过去了&#xff0c;基于各种自动化检查能力的…

AI+混合云模式,如何最大化挖掘数据价值?

9月8日&#xff0c;IBM举行了“科技一席谈”线上媒体访谈会&#xff0c;此次访谈以“数据与AI”为主题&#xff0c;由IBM 大中华区科技事业部、客户成功管理部总经理朱辉&#xff0c;IBM 中国混合云与 AI 华东及华南大区总经理许伟杰作主题分享。 在数字化转型的时代&#xff…

阿里云贾扬清:大数据和人工智能一体化是必然趋势

简介&#xff1a; 拥抱“融合”是大数据演进的新方向&#xff0c;⼤数据⼈⼯智能⼀体化是⼤数据发展的必然⽅向&#xff0c;而人工智能是⼤数据业务发展的终极出⼝ 。 12月13日&#xff0c;阿里云计算平台负责人贾扬清在Flink Forward Asia 2020 峰会上指出&#xff0c;拥抱“融…

云效安全那些事儿—访问控制与数据安全

简介&#xff1a; 云效 Codeup 提供了代码 GPG 签名&#xff0c;拒绝未签名的提交&#xff1b;支持代码属主验证&#xff0c;约束提交记录属主。 在质量管控上&#xff0c;云效 Codeup 精细化读写权限管控&#xff0c;支持代码提交卡点机制&#xff0c;保障提交质量。 接下来我…

深信服何朝曦:托管云为用户上云提供第三种选择

9月17日&#xff0c;以“万物皆可云”为主题的信服云创新峰会成功举办。会上&#xff0c;深信服科技股份有限公司CEO何朝曦分享了运用云计算技术帮助用户进行数字化转型的观点。他认为兼具公有云和私有云优势的托管云&#xff0c;可以帮助非科技型企业和中小企业获得“数字化平…