首页 » PHP教程 » php调dubbo技巧_开课啦 dubbogo 微做事进级实战

php调dubbo技巧_开课啦 dubbogo 微做事进级实战

访客 2024-12-02 0

扫一扫用手机浏览

文章目录 [+]

曾凡维 杭州开课啦教诲科技有限公司高等开拓工程师来源 | 阿里巴巴云原生"大众年夜众号

杭州开课啦教诲科技有限公司是一家致力于为中小学生供应学习辅导的在线教诲公司,目前公司后端做事根本举动步伐紧张依托于阿里云原生,个中包含打算、网络、存储以及 Kubernetes 做事。

php调dubbo技巧_开课啦 dubbogo 微做事进级实战

技能选型背景

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

php调dubbo技巧_开课啦 dubbogo 微做事进级实战
(图片来自网络侵删)

当时自己也调研过 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 /appEXPOSE 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) //实体机的ip regPort = os.Getenv(constant2.RegistryEnvPort) //实体机的端口 urlNode, _ := common.NewURL(node) role, _ := strconv.Atoi(urlNode.GetParam(constant.ROLE_KEY, "")) if role == common.PROVIDER && regIp != "" && regPort != "" { urlNode.Ip = regIp urlNode.Port = regPort node = url.QueryEscape(urlNode.String()) } zkPath, err = r.client.RegisterTemp(root, node) ...}末了的话

如果利用 dubbo-go 过程中碰着一些问题,可以提交 issue 或者进社区钉钉群进行沟通互换。

个人建议:如果你做好了入坑 Dubbo-go 的准备,最好自己办理这些问题并给官方反馈 PR,碰着问题办理问题你才能发展并有所收成,不是吗?

作者简介

曾凡维(github @jack15083), 一个有 9 年做事端业务开拓履历的一线程序员,曾在腾讯阅文等多家公司担当后端开拓工程师,目前就职杭州开课啦教诲科技有限公司,从事 go 措辞做事根本架构和中间件及部分业务开拓事情。

标签:

相关文章

介绍白点控制之路,从原理到方法

白点,作为生活中常见的现象,无处不在。对于如何控制白点,许多人却感到困惑。本文将从原理出发,探讨白点的控制方法,并结合实际案例,为...

PHP教程 2025-01-03 阅读1 评论0

介绍直播王者,如何开启你的电竞直播之旅

随着电竞产业的蓬勃发展,越来越多的年轻人投身于电竞直播行业。王者荣耀作为一款备受欢迎的MOBA手游,吸引了大量玩家和观众。如何开启...

PHP教程 2025-01-03 阅读1 评论0