小米电商 Apache Dubbo-go 微服务实践

简介:2021 年是小米中国区电商部门变动调整较大的一年,小米中国区早期电商、服务体系建立在 Go 语言构建的微服务体系之上,由内部自研的 Go 语言微服务框架 koala 支撑起数以千计的微服务应用。随着业务的发展,新零售体系的成立以及业务中台普及与推广,我们更倾向于拥有丰富生态的 Java 为主的微服务体系技术选型,新项目及服务大多基于 Apache Dubbo、Spring Cloud 的微服务生态。

作者 | 董振兴

背景

2021 年是小米中国区电商部门变动调整较大的一年,小米中国区早期电商、服务体系建立在 Go 语言构建的微服务体系之上,由内部自研的 Go 语言微服务框架 koala 支撑起数以千计的微服务应用。随着业务的发展,新零售体系的成立以及业务中台普及与推广,我们更倾向于拥有丰富生态的 Java 为主的微服务体系技术选型,新项目及服务大多基于 Apache Dubbo、Spring Cloud 的微服务生态。

考虑到服务迁移的巨大成本以及服务稳定性的保障,我们最终决定在大范围投入与使用以 Apache Dubbo 为主的服务体系的同时,保留原有 Go 微服务项目。由于原有跨部门的技术选型差异,留存的服务包含基于 Thrift、gRPC 等不同协议服务,我们希望多套微服务体系能够无缝稳定地融合。在经过大量调研之后,确定了以 Dubbo+Nacos+etcd+sidecar+mirpc+Dubbo-go 的为核心的一套互通的微服务体系。

微服务治理

1、相关组件

mione

mione 是一套由小米公司新零售效能团队开源的“项目创建->开发->测试->发布->运维” 端到端的系统服务和研发工具,支持物理机部署、docker 部署、K8s、dockerFile 部署等多种部署形态,通过人工智能、自动化技术的应用助力开发者提升研发效能,持续快速交付有效价值。详细了解可以通过官网

目前内部基于 Java Dubbo 生态的微服务基本上都托管于 mione,并以 Nacos 为注册中心,这些服务作为 consumer 基本上通过 Apache Dubbo、side-car 两种方式实现调用。

koala

koala 是小米内部自研的 Go 语言的微服务框架,基于 etcd 的注册中心以及 Thrift 协议。作为服务的提供方,服务注册将自身元数据等信息注册到 etcd 中,并对外提供 Thrift 的服务。

Java Dubbo 的 consumer 服务则通过 side-car 兼容 Thrift/gRPC 协议,基于 etcd 进行服务发现调用。

sidecar

sidecar 同样是小米内部自研的用于服务注册及发现,支持跨服务调用的组件,名为 soa-agent ,以 side-car 的方式同服务部署于 mione 容器中,服务借助该组件实现兼容协议的 RPC 调用,具体技术细节这里不做详细介绍。

Apache Dubbo-go

我们以 side-car 的方式解决了 Java 服务的 consumer 到 Go 服务基于 Thrift/gRPC 的调用,而 Go 服务到新项目,即基于Apache Dubbo 生态的 Java 服务的调用,在经过大量调研与参考后,决定使用还在不断进行迭代的 Apache Dubbo-go。

Apache Dubbo-go 是当前 Apache Dubbo 多语言支持中较为热门的项目,社区也较为活跃。Apache Dubbo-go 由 Go 语言实现,继承了 Apache Dubbo 的设计理念与架构,拥有较好的可扩展性。它能够架起 Java 和 Go 之间的桥梁,与 gRPC/Apache Dubbo 生态互联互通,这正式对于是我们当前痛点较好的解决方案,所支持的 Nacos 注册中心也与我们当前中间件的技术选型契合。

Apache Dubbo-go的应用

经过调研后,我们选用了当时较为稳定的 v1.5.7 版本进行接入。

Apache Dubbo 官方文档中提供了使用 Apache Dubbo-go 的一般调用方式,但该方式需要业务方调用方严格遵守切合服务方提供的接口格式、数据格式,因此我们选择使用泛化的方式进行调用。

对于一个 Java 的 Apache Dubbo 服务提供的接口如下:

public interface DubboHealthService {List<Health> health();String ping(String param,int param2);AaRes health1(List<AaReq> list);Health health2(AaReq aaReq);}//impl
@Service(timeout = 1000, group = "dev", version = "4.0")
public class DubboHealthServiceImpl implements DubboHealthService {......
}

在 Apache Dubbo-go 的 client 配置文件中,需要的核心配置如下:

# registry config
registries:"demoNacos":protocol: "nacos"timeout: "3s"address: "xxx.xxx.xxx"username: "****"password: "****"references:"UserProvider":registry: "demoNacos"protocol: "dubbo"interface: "com.xiaomi.youpin.test0930.api.service.DubboHealthService"cluster: "failover"version: "4.0"group: "dev"generic: truemethods:- name: "health"retries: 0timeout: "0.5s"......

首先配置对应注册中心,包括选型及地址,Nacos/zookeeper 等,其次配置需要调用的具体接口,方法、超时时间等信息。由于我们使用泛化调用,需要进行配置 generic: true。这里我们在使用 v1.5.7 版本时发现了关于泛化调用下方法级别超时时间并不生效的情况,进行了修复,详细可以参考该 pr

配置完成后,泛化调用的方式我们进行了一定的封装:

//......
var paramTypes []string
var paramVals []interface{}
for _, param := range req.Params {paramTypes = append(paramTypes, param.GetKey())paramVals = append(paramVals, param.GetVal())
}
//添加context信息
m := make(map[string]string)
m["xxx(generic_flag)"] = "xxx(flag)"
//服务端返回json字符串
m["xxx(return_flag)"] = "true" 
ctx = context.WithValue(context.Background(), constant.DubboCtxKey("attachment"), m)
//invoke调用
response, err = config.GetRPCService(req.AppName).(*config.GenericService).Invoke(ctx, []interface{}{req.MethodName, paramTypes, paramVals})
if err != nil {err = fmt.Errorf("dubbo call request appName: %s methodName: %s rpc invoke failed,err:%+v", req.AppName, req.MethodName, err)return
}

这里实际上业务只需要传入需要调用的 Apache Dubbo 方法参数列表例如  ["java.lang.String"] 以及参数值即可。

为了切合业务需要,我们在内部维护的 Java Dubbo 版本中也做了一定程度的兼容与改造,Apache Dubbo-go 中通过 context,即 attachment 可以带上两个特殊标识,服务端的 Java Dubbo 版本中将根据该特殊标识接收处理与返回以 json 格式的数据。

这样一来,留存的 Go 服务就能够使用 Apache Dubbo 协议与 Java Dubbo 生态的服务达到互联互通,同时也由于 Apache Dubbo 的优势,也具备了一定程度的服务治理能力。

在线上运行该版本 Apache Dubbo-go 时,也发现了 Apache Dubbo-go 提供的像黑名单机制等的一些不太合理之处,例如该机制下,当服务端出现报错后,调用方会将该服务端的 ip 记录黑名单,再进行调用时可能出现 no provider 的情况,而实际上服务端可能仅是针对某个请求的处理报错,服务实际上能够正常运行,那么这时候该机制便有待商榷,我们实际使用时也是进行了摘除。详细细节可见该 pr。

现状与未来发展

1、当前架构

目前小米新零售已经基于上述 mione 的体系以及上述介绍的这一部分组件,建立了一套较为完善的,包括微服务标准化、可持续集成部署、以及可见可控的观测性平台的服务治理体系。

在传统的微服务体系下,我们通常需要满足两个服务治理的基本的需求:一站式的服务治理平台、普适性的服务开发框架。

前者我们通过 mione 实现了包括但不限于基于容器化的 CICD、服务的标准化定义、服务的生命周期管理(服务上下线、扩缩容等)、服务的基本通信和链路治理(如重试、限流降级熔断等);而后者我们借助了 Apache Dubbo 、Apache Dubbo-go 等开源 RPC 框架,结合像 Springboot 这样的传统开发框架提供了较为标准化的服务搭建开发流程。

同时,我们内部自研了一套可见可观测性体系,帮助我们获取更多有价值的数据来反馈于服务治理,对服务做到更全面准确的把控。这实际上包括了 3 个层次的工具集合:Logging(日志系统)、Metric(度量系统) 以及 Tracing(分布式链路追踪系统)

我们通过上述的架构与设计实际上已经基本上满足了传统方式下对微服务治理需求,然而,这还不够。

未来方向

1、Service Mesh 与 Serverless

Service Mesh

首先什么是 Service Mesh?Service Mesh 是一个致力于解决服务间通信的基础设施层,它负责在现代云原生应用的复杂服务拓扑下实现请求的可靠传递,它通常实现为一组轻量级的网络代理,与应用服务部署在一起,对应用服务透明。

我们上面架构组件中的 sidecar soa-agent 实际上就是一个 service mesh 的雏形,这个组件目前承担了包括服务发现、配置托管等一些能力,当然,他能够做到的应当更多。对于业务应用服务的透明以及零侵入是 service mesh 的一大优势,也是当前它正备受推崇的主要原因。

综合来看,Service Mesh 主要能够解决当下传统微服务体系的几大痛点:

1、完善的微服务基础设施

service mesh 能够将微服务的通信下沉到基础设施层,它屏蔽了微服务处理各种通信问题的复杂度。对于业务开发者来说,实际上他并不关心像 Rpc 通信、服务注册与发现这样的非功能性细节。但传统微服务下,拿 Thrift 举例,作为开源的一套性能较高的 Rpc 框架,由于它缺乏一些基本的服务治理能力,Thrift 很多时候并无法做到开箱即用,在早期小米电商的基础架构团队就对 Thrift 做了定制化的二次开发,在生成的桩代码中加入了服务发现、打点等功能,这些代码再与自研的开发框架 koala 耦合来实现服务的闭环调用。而这些框架代码以及生成的桩代码,与业务代码也并没有明显的隔离与区分,甚至业务能够直接修改框架代码以及桩代码,实际上埋下了较大的隐患,也造成后续升级困难、严重阻塞等问题。

而 service mesh 则可以完美的解决像这样的痛点,通过对这些能力的下沉,他们将对业务服务屏蔽实现细节,业务服务也就不再需要关心包括服务发现、负载均衡、流量调度、限流降级熔断、监控统计等一切细节。

2、语言无关的通信和链路治理

实际上 service mesh 在功能上并没有提供对于服务治理的任何新的特性和能力,它所能够提供的能力在 service mesh 之前其实都能够找到。service mesh 改变的是通信和服务治理能力的提供方式,它将这些能力从业务层面解耦,下沉到基础设施中,以更加标准化和通用的方式来提供,这样一来它便能屏蔽不同语言、不同平台的差异性,在多语言、多技术栈的团队环境中,它能够提供胶水般的融合与协同能力。这也是我们上面小米电商微服务调用架构图中 sidecar 所做到的,为跨语言的调用提供了解决方案。

3、通信和服务治理的标准化

通过标准化,带来一致的服务治理体验,减少多业务之间由于服务治理标准不一致带来的沟通和转换成本,提高全局服务治理的效率。

鉴于以上 service mesh 带来的好处,小米电商微服务的架构在未来会进一步在已有基础上更多的调研、参考以及参与该技术落地。

但是,硬币总有正反面,service mesh 也绝不是仅有优点的万能膏药。实际上,引入多一层的组件代理转发请求,本身就不可避免地带来更多的资源消耗,在一定程度上会降低系统的通信性能。其次,基础功能与服务解耦有解耦的绝对优势,但侵入式框架反而在支持业务的定制与扩展能力上反而有先天优势,这点在系统的设计中也应当考虑。第三,系统中对于组件的引入本身也带来一定的风险,业务将及其依赖 service mesh 的稳定性,在保障 service mesh 的稳定性上将带来更多的技术考验。目前我们对于 service mesh 的用法实现设计如下图所示,我们通过 Sidecar 的方式,将服务发现、负载均衡、集群策略、健康检查以及部分的监控打点等下沉到该组件中,该组件对于不同的服务部署方式部署方式稍有不同。例如对于早期的裸物理机部署的老服务来说,该组件与服务部署在同一台物理机,而对于例如 K8s 这样的容器部署方式,只需要部署在同一个 Pod ,即共享同一个 ip 即可。Sidecar 中开放了一些 OpenAPI,部署在一起的服务只需要访问 localhost 对应端口的 OpenAPI 即可达到相应的服务治理能力。

未来小米新零售效能团队也将在大量的考量与取舍中,更进一步地参与与适配该技术的落地,其中关键的一步也将会有对于 Apache Dubbo、Apache Dubbo-go 等底层框架的适配与融合,必要地情况下将进行一些定制化的改造。

2、Serverless

什么是 Serverless? Serverless(无服务器架构)指的是由开发者实现的服务端逻辑运行在无状态的计算容器中,它由事件触发, 完全被第三方管理,其业务层面的状态则被开发者使用的数据库和存储资源所记录。这也是当下比较热门的方向。
Serverless 是云原生技术发展的高级阶段,使开发者更聚焦在业务逻辑,而减少对基础架构的关注。它与我们之前说的 service mesh 实际上并不在同一理念上,service mesh 倾向于将基础能力下沉,业务服务与代理一同部署。而 Serverless 则干脆希望开发者不再关注服务器,不再关注服务所需资源,这些资源与能力将由 Serverless 的厂商来提供。开发者只需要编写业务函数即可(函数即服务 FaaS)。相同的是,两者的目的都是为了业务开发能够仅专心于业务逻辑。

目前我们小米新零售效能团队也正在尝试对一些服务进行 Serverless 化,并提供了一些基础的能力。这些 Serverless 化的服务在开发中同样不需要再关心底层的协议,无论是 Apache Dubbo、Apache Dubbo-go 都会在我们后端的 Serverless 系统中进行兼容与适配,同样以上的一些列服务治理的能力也将由 Serverless 系统全权托管。

上图就是我们目前对于服务 Serverless 化的一个基本的支持逻辑,我们定义了成为 Serverless 服务的 Function 必须实现的接口 execute :

public interface Handler {Result execute(Event var1, Context var2);default void init(Object... objs) {}default String version() {return "0.0.1";}
}

业务仅需要实现该接口,并通过平台配置管理该服务的 git 库等信息,就可以以 Serverless 的方式开始提供服务,Serverless 系统将自动拉取该 Function 的代码信息,编译打包等,提交到核心池中等待执行。并且同时,服务将无感知地接入系统提供的服务治理、可观测性等能力。

总结

Dubbo 作为一个老牌的、强大的微服务框架与体系,提供了跨语言的支持,这帮助我们将内部不同的技术栈实际上形成了闭环。而 Apache Dubbo-go 作为 Apache Dubbo 生态中一个还在不断迭代发展的开源项目,会存在一些待完善的小问题,但更能够切实地帮助到我们搭建与发展整个云原生微服务体系。同样的,我们在完善传统的微服务体系架构的同时,我们也关注与尝试目前微服务技术的一些发展方向,像 Serverless、service mesh 这些较为热门的方向,我们也都将持续的跟进与参与落地。我们将不断与像 dubbogo 等开源社区合作,积极反馈我们使用的经验,参与完善,推动更多此类开源项目的发展。

作者介绍

董振兴,目前就职于小米中国区新零售技术部-零售中台-研发效能组,负责小米中国区新零售微服务中间件体系及效能相关研发工作。

原文链接

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

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

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

相关文章

RocketMQ 端云一体化设计与实践

简介&#xff1a;本文首先介绍了端云消息场景一体化的背景&#xff0c;然后重点分析了终端消息场景特点&#xff0c;以及终端消息场景支撑模型&#xff0c;最后对架构和存储内核进行了阐述。我们期望基于 RocketMQ 统一内核一体化支持终端和服务端不同场景的消息接入目标&#…

计算机死机的时候,它在干什么?

作者 | 轩辕之风来源 | 编程技术宇宙今天花几分钟跟大家分享一个很有意思又能涨知识的问题&#xff1a;电脑死机的时候到底在干什么&#xff1f;电脑死机&#xff0c;应该每个接触计算机的小伙伴都经历过吧。尤其是早些年&#xff0c;电脑配置还没现在这么高的时候&#xff0c;…

交付铁三角的故事之兵戎相见

简介&#xff1a;大家好&#xff0c;交付铁三角带着全新的故事来啦&#xff01;一直被应用交付难题所困扰的他们这次又遇到了新的难题&#xff0c;售前大佬的一句客户资源规划缘何让开发铁子暴怒&#xff0c;交付小锤的劝架为何致使自己的交付团队陷入这场漩涡之中&#xff0c;…

一位“老程序员”的反思:C、Python、Java 不可兼得,专心学好一门编程语言就行!...

摘要&#xff1a;大多数程序员在其职业生涯中&#xff0c;接触到的编程语言不止一种&#xff0c;但主要掌握并运用的多数只有一门。那么在数量繁多、适用领域各不相同的编程语言中&#xff0c;哪一门更适合你来学习呢&#xff1f;“老程序员”Eleanor Berger 总结了这些年来他对…

高效使用Java构建工具|Maven篇|云效工程师指北

简介&#xff1a;高效使用Java构建工具&#xff5c;Maven篇。众所周知&#xff0c;当前最主流的Java构建工具为Maven/Gradle/Bazel&#xff0c;针对每一个工具&#xff0c;我将分别从日常工作中常见的场景问题切入&#xff0c;例如依赖管理、构建加速、灵活开发、高效迁移等&am…

布局云与边缘之后,Akamai 为何加码安全领域

作者 | 宋慧 出品 | CSDN 云计算 随着云的深入和普及&#xff0c;云上的安全也变得愈加重要。CSDN 系列技术直播栏目《大咖来了》就曾重点讨论 云上安全的攻防之道 &#xff0c;以及云原生的安全发展。 最近&#xff0c;发明 CDN 技术的资深技术厂商 Akamai&#xff0c;继增强…

Dubbo-go 服务代理模型

简介&#xff1a;HSF 是阿里集团 RPC/服务治理 领域的标杆&#xff0c;Go 语言又因为其高并发&#xff0c;云原生的特性&#xff0c;拥有广阔的发展前景和实践场景&#xff0c;服务代理模型只是一种落地场景&#xff0c;除此之外&#xff0c;还有更多的应用场景值得我们在研发的…

探索AI视觉技术新应用,夸克扫描王首推“离线模式”端侧AI算法提升隐私安全

手机扫描正在超越传统扫描仪&#xff0c;给大学生和职场人带来更高效、更便捷的信息服务体验。 在基于手机相机功能的搜索行为中&#xff0c;大学生的学习场景占比超过一半。 手机扫描的“离线模式”&#xff0c;让夸克成为第一个将扫描AI算法上端的App。 各大高校开学在即&…

作业帮云原生降本增效实践之路

简介&#xff1a;目前&#xff0c;作业帮已经和阿里云有一个关于 AEP 的 tair 方案的结合&#xff0c;在新的一年希望我们有更大规模的落地。文章里讲得比较多的是关于降本做的一些技术改进&#xff0c;其实在降本增效这里面还有很大一块工作量是运营&#xff0c;成本运营我们也…

基于 Serverless 打造如 Windows 体验的个人专属家庭网盘

简介&#xff1a;虽然现在市面上有些网盘产品&#xff0c; 如果免费试用&#xff0c;或多或少都存在一些问题&#xff0c; 可以参考文章《2020 国内还能用的网盘推荐》。本文旨在使用较低成本打造一个 “个人专享的、无任何限速的、如 Windows 体验的私有云盘”。 作者 | 西流…

Apsara Stack 技术百科 | 数字化业务系统安全工程

简介&#xff1a;数字化平台已经与我们生活紧密结合&#xff0c;其用户规模庞大&#xff0c;一旦系统出现故障&#xff0c;势必会造成一定生活的不便。比如疫情时代&#xff0c;健康码已经成为人们出门必备的条件&#xff0c;一旦提供健康码服务平台出现故障&#xff0c;出行将…

支撑百万级传感器的延时队列

文/升哲科技 刘鹏 摘要&#xff1a;本文主要描述升哲科技在打造物联智慧城市平台过程中关于如何实现延时队列服务的技术选型经验、延时队列服务的架构设计以及延时队列的底层细节实现原理。 背景 升哲科技是一家物联网与人工智能领域的国家高新技术企业、独角兽企业。 要打…

深度解析|基于 eBPF 的 Kubernetes 一站式可观测性系统

简介&#xff1a;阿里云 Kubernetes 可观测性是一套针对 Kubernetes 集群开发的一站式可观测性产品。基于 Kubernetes 集群下的指标、应用链路、日志和事件&#xff0c;阿里云 Kubernetes 可观测性旨在为 IT 开发运维人员提供整体的可观测性方案。 作者&#xff1a;李煌东、炎…

系列解读SMC-R:透明无感提升云上 TCP 应用网络性能(一)| 龙蜥技术

简介&#xff1a;已有的应用若想使用RDMA技术改造成本高&#xff0c;那么有没有一种技术是不做任何改造就可以享受RDMA带来的性能优势&#xff1f; 文/龙蜥社区高性能网络SIG 引言 Shared Memory Communication over RDMA (SMC-R) 是一种基于 RDMA 技术、兼容 socket 接口的内…

技术引领未来, IDC TechScape中国数据安全发展路线图首发

2022年8月26日&#xff0c;IDC 2022 CSO全球网络安全峰会&#xff08;中国站&#xff09;在上海隆重开幕&#xff0c;会上首次发布《IDC TechScape&#xff1a;中国数据安全发展路线图&#xff0c;2022》。报告认为&#xff0c;帮助用户构建全方位数据安全治理体系将成为大趋势…

DataV 3D 平面地图 2.0 焕新上线

简介&#xff1a;DataV3月&#xff0c;3D平面地图2.0现已上线~ 3D 平面地图 2.0 现已上线~ 让我们来看看更新了哪些功能吧&#xff01; 01 交互升级&#xff0c;省市区自由下钻 自带行政区域数据&#xff0c;无需配置&#xff1a; 甚至&#xff0c;可以通过「蓝图编辑器」实…

PolarDB-X 发布 2.1.0 版本,Paxos 开源

简介&#xff1a;2022年4月1号&#xff0c;PolarDB-X 正式开源X-Paxos&#xff0c;基于原生MySQL存储节点&#xff0c;提供Paxos三副本共识协议&#xff0c;可以做到金融级数据库的高可用和容灾能力&#xff0c;做到RPO0的生产级别可用性&#xff0c;可以满足同城三机房、两地三…

828成首个B2B企业节,华为联合3万生态伙伴助力中小企业数字化转型

中小企业既是市场的主体&#xff0c;也是保就业的主力军。截至2021年末&#xff0c;中小企业在全国企业中数量占比已超过99%&#xff0c;并贡献了80%的就业机会。 为助力中小企业创新发展&#xff0c;8月28日&#xff0c;华为联合3万家生态伙伴&#xff0c;共同发起了全国首个…

阿里云贾扬清:数据湖正成为企业数据应用创新标配

简介&#xff1a;全球数据湖峰会开幕 数字经济蓬勃发展的今天&#xff0c;越来越多的用户已经从“上好云”&#xff0c;走到了“用好云”的这个阶段。如果说在“上好云这个阶段&#xff0c;大多数用户关心的是如何在成本上获得更好的回报。那么在上好云这个阶段&#xff0c;更…

强强联手,NVIDIA 与 Ampere Computing 重磅推出云原生服务器平台

随着 5G、元宇宙的兴起&#xff0c;云游戏再一次迎来爆发。据 IDC 与中国信息通信研究院联合发布的《全球云游戏产业深度观察及趋势研判&#xff08;2022年&#xff09;》显示&#xff0c;2021年&#xff0c;中国地区云游戏市场收入已达 40.6 亿元&#xff0c;同比增长 93.3%。…