《Dubbo迈出云原生重要一步-应用级服务发现解析》

 

作者 | 刘军(陆龟) Apache Dubbo PMC

 

概述

社区版本 Dubbo 从 2.7.5 版本开始,新引入了一种基于实例(应用)粒度的服务发现机制,这是我们为 Dubbo 适配云原生基础设施的一步重要探索。版本发布到现在已有近半年时间,经过这段时间的探索与总结,我们对这套机制的可行性与稳定性有了更全面、深入的认识;同时在 Dubbo 3.0 的规划也在全面进行中,如何让应用级服务发现成为未来下一代服务框架 Dubbo 3.0 的基础服务模型,解决云原生、规模化微服务集群扩容与可伸缩性问题,也已经成为我们当前工作的重点。

既然这套新机制如此重要,那它到底是怎么工作的呢?今天我们就来详细解读一下。在最开始的社区版本,我们给这个机制取了一个神秘的名字 - 服务自省,下文将进一步解释这个名字的由来,并引用服务自省代指这套应用级服务发现机制。

熟悉 Dubbo 开发者应该都知道,一直以来都是面向 RPC 方法去定义服务的,并且这也是 Dubbo 开发友好性、治理功能强的基础。既然如此,那我们为什么还要定义个应用粒度的服务发现机制呢?这个机制到底是怎么工作的?它与当前机制的区别是什么?它能给我们带来哪些好处那?对适配云原生、性能提升又有哪些帮助?

带着所有的这些问题,我们开始本文的讲解。

 

服务自省是什么?

首先,我们先来解释文章开篇提到的问题:

  1. 应用粒度服务发现是到底是一种怎样的模型,它与当前的 Dubbo 服务发现模型的区别是什么?

  2. 我们为什么叫它服务自省?

所谓“应用/实例粒度” 或者“RPC 服务粒度”强调的是一种地址发现的数据组织格式。

 

 

以 Dubbo 当前的地址发现数据格式为例,它是“RPC 服务粒度”的,它是以 RPC 服务作为 key,以实例列表作为 value 来组织数据的:

 
 

"RPC Service1": [ {"name":"instance1", "ip":"127.0.0.1", "metadata":{"timeout":1000}}, {"name":"instance2", "ip":"127.0.0.1", "metadata":{"timeout":2000}}, {"name":"instance3", "ip":"127.0.0.1", "metadata":{"timeout":3000}}, ] "RPC Service2": [Instance list of RPC Service2], "RPC ServiceN": [Instance list of RPC ServiceN]

而我们新引入的“应用粒度的服务发现”,它以应用名(Application)作为 key,以这个应用部署的一组实例(Instance)列表作为 value。这带来两点不同:

  1. 数据映射关系变了,从 RPC Service -> Instance 变为 Application -> Instance;

  2. 数据变少了,注册中心没有了 RPC Service 及其相关配置信息。

 
 

"application1": [ {"name":"instance1", "ip":"127.0.0.1", "metadata":{}}, {"name":"instance2", "ip":"127.0.0.1", "metadata":{}}, {"name":"instanceN", "ip":"127.0.0.1", "metadata":{}} ]

要进一步理解新模型带来的变化,我们看一下应用与 RPC 服务间的关系,显而易见的,1 个应用内可能会定义 n 个 RPC Service。因此 Dubbo 之前的服务发现粒度更细,在注册中心产生的数据条目也会更多(与 RPC 服务成正比),同时也存在一定的数据冗余。

简单理解了应用级服务发现的基本机制,接着解释它为什么会被叫做“服务自省”?

其实这还是得从它的工作原理说起,上面我们提到,应用粒度服务发现的数据模型有几个以下明显变化:数据中心的数据量少了,RPC 服务相关的数据在注册中心没有了,现在只有 application - instance 这两个层级的数据。为了保证这部分缺少的 RPC 服务数据仍然能被 Consumer 端正确的感知,我们在 Consumer 和 Provider 间建立了一条单独的通信通道:Consumer 和 Provider 两两之间通过特定端口交换信息,我们把这种 Provider 自己主动暴露自身信息的行为认为是一种内省机制,因此从这个角度出发,我们把整个机制命名为:服务自省。

 

为什么需要服务自省?

上面讲服务自省的大概原理的时候也提到了它给注册中心带来的几点不同,这几点不同体现在 Dubbo 框架侧(甚至整个微服务体系中),有以下优势:

  • 与业界主流微服务模型对齐,比如 SpringCloud、Kubernetes Native Service 等;

  • 提升性能与可伸缩性。注册中心数据的重新组织(减少),能最大幅度的减轻注册中心的存储、推送压力,进而减少 Dubbo Consumer 侧的地址计算压力;集群规模也开始变得可预测、可评估(与 RPC 接口数量无关,只与实例部署规模相关)。

 

1. 对齐主流微服务模型

自动、透明的实例地址发现(负载均衡)是所有微服务框架需要解决的事情,这能让后端的部署结构对上游微服务透明,上游服务只需要从收到的地址列表中选取一个,发起调用就可以了。要实现以上目标,涉及两个关键点的自动同步:

  • 实例地址,服务消费方需要知道地址以建立链接;

  • RPC 方法定义,服务消费方需要知道 RPC 服务的具体定义,不论服务类型是 rest 或 rmi 等。

 

 

对于 RPC 实例间借助注册中心的数据同步,REST 定义了一套非常有意思的成熟度模型,感兴趣的朋友可以参考这里的链接 : https://www.martinfowler.com/articles/richardsonMaturityModel.html

按照文章中的 4 级成熟度定义,Dubbo 当前基于接口粒度的模型可以对应到 L4 级别。

接下来,我们看看 Dubbo、SpringCloud 以及 Kubernetes 分别是怎么围绕自动化的实例地址发现这个目标设计的。

 

2. Spring Cloud

Spring Cloud 通过注册中心只同步了应用与实例地址,消费方可以基于实例地址与服务提供方建立链接,但是消费方对于如何发起 HTTP 调用(SpringCloud 基于 rest 通信)一无所知,比如对方有哪些 HTTP endpoint,需要传入哪些参数等。

RPC 服务这部分信息目前都是通过线下约定或离线的管理系统来协商的。这种架构的优缺点总结如下:

  • 优势:部署结构清晰、地址推送量小;

  • 缺点:地址订阅需要指定应用名, provider 应用变更(拆分)需消费端感知;RPC 调用无法全自动同步。

 

 

 

3. Dubbo

Dubbo 通过注册中心同时同步了实例地址和 RPC 方法,因此其能实现 RPC 过程的自动同步,面向 RPC 编程、面向 RPC 治理,对后端应用的拆分消费端无感知,其缺点则是地址推送数量变大,和 RPC 方法成正比。

 

 

 

4. Dubbo + Kubernetes

Dubbo 要支持 Kubernetes native service,相比之前自建注册中心的服务发现体系来说,在工作机制上主要有两点变化:

  • 服务注册由平台接管,provider 不再需要关心服务注册;

  • consumer 端服务发现将是 Dubbo 关注的重点,通过对接平台层的 API-Server、DNS 等,Dubbo client 可以通过一个 Service Name(通常对应到 Application Name)查询到一组 Endpoints(一组运行 provider 的 pod),通过将 Endpoints 映射到 Dubbo 内部地址列表,以驱动 Dubbo 内置的负载均衡机制工作。

Kubernetes Service 作为一个抽象概念,怎么映射到 Dubbo 是一个值得讨论的点

Service Name - > Application Name,Dubbo 应用和 Kubernetes 服务一一对应,对于微服务运维和建设环节透明,与开发阶段解耦。

 
 

apiVersion: v1 kind: Service metadata: name: provider-app-name spec: selector: app: provider-app-name ports: - protocol: TCP port: targetPort: 9376

Service Name - > Dubbo RPC Service,Kubernetes 要维护调度的服务与应用内建 RPC 服务绑定,维护的服务数量变多。

 
 

--- apiVersion: v1 kind: Service metadata: name: rpc-service-1 spec: selector: app: provider-app-name ports: ## ... --- apiVersion: v1 kind: Service metadata: name: rpc-service-2 spec: selector: app: provider-app-name ports: ## ... --- apiVersion: v1 kind: Service metadata: name: rpc-service-N spec: selector: app: provider-app-name ports: ## ...

 

 

结合以上几种不同微服务框架模型的分析,我们可以发现,Dubbo 与 SpringCloud、Kubernetes 等不同产品在微服务的抽象定义上还是存在很大不同的。SpringCloud 和 Kubernetes 在微服务的模型抽象上还是比较接近的,两者基本都只关心实例地址的同步,如果我们去关心其他的一些服务框架产品,会发现它们绝大多数也是这么设计的;

即 REST 成熟度模型中的 L3 级别。

对比起来 Dubbo 则相对是比较特殊的存在,更多的是从 RPC 服务的粒度去设计的。

对应 REST 成熟度模型中的 L4 级别。

如我们上面针对每种模型做了详细的分析,每种模型都有其优势和不足。而我们最初决定 Dubbo 要做出改变,往其他的微服务发现模型上的对齐,是我们最早在确定 Dubbo 的云原生方案时,我们发现要让 Dubbo 去支持 Kubernetes Native Service,模型对齐是一个基础条件;另一点是来自用户侧对 Dubbo 场景化的一些工程实践的需求,得益于 Dubbo 对多注册、多协议能力的支持,使得 Dubbo 联通不同的微服务体系成为可能,而服务发现模型的不一致成为其中的一个障碍,这部分的场景描述请参见这里。

 

5. 更大规模的微服务集群 - 解决性能瓶颈

这部分涉及到和注册中心、配置中心的交互,关于不同模型下注册中心数据的变化,之前原理部分我们简单分析过。为更直观的对比服务模型变更带来的推送效率提升,我们来通过一个示例看一下不同模型注册中心的对比:

 

 

图中左边是微服务框架的一个典型工作流程,Provider 和 Consumer 通过注册中心实现自动化的地址通知。其中,Provider 实例的信息如图中表格所示:

应用 DEMO 包含三个接口 DemoService 1 2 3,当前实例的 ip 地址为 10.210.134.30。

  • 对于 Spring Cloud 和 Kubernetes 模型,注册中心只会存储一条 DEMO - 10.210.134.30+metadata 的数据;

  • 对于老的 Dubbo 模型,注册中心存储了三条接口粒度的数据,分别对应三个接口 DemoService 1 2 3,并且很多的址数据都是重复的。

可以总结出,基于应用粒度的模型所存储和推送的数据量是和应用、实例数成正比的,只有当我们的应用数增多或应用的实例数增长时,地址推送压力才会上涨。

而对于基于接口粒度的模型,数据量是和接口数量正相关的,鉴于一个应用通常发布多个接口的现状,这个数量级本身比应用粒度是要乘以倍数的;另外一个关键点在于,接口粒度导致的集群规模评估的不透明,相对于实i例、应用增长都通常是在运维侧的规划之中,接口的定义更多的是业务侧的内部行为,往往可以绕过评估给集群带来压力。

以 Consumer 端服务订阅举例,根据我对社区部分 Dubbo 中大规模头部用户的粗略统计,根据受统计公司的实际场景,一个 Consumer 应用要消费(订阅)的 Provier 应用数量往往要超过 10 个,而具体到其要消费(订阅)的的接口数量则通常要达到 30 个,平均情况下 Consumer 订阅的 3 个接口来自同一个 Provider 应用,如此计算下来,如果以应用粒度为地址通知和选址基本单位,则平均地址推送和计算量将下降 60% 还要多。

而在极端情况下,也就是当 Consumer 端消费的接口更多的来自同一个应用时,这个地址推送与内存消耗的占用将会进一步得到降低,甚至可以超过 80% 以上。

一个典型的几段场景即是 Dubbo 体系中的网关型应用,有些网关应用消费(订阅)达 100+ 应用,而消费(订阅)的服务有 1000+ ,平均有 10 个接口来自同一个应用,如果我们把地址推送和计算的粒度改为应用,则地址推送量从原来的 n 1000 变为 n 100,地址数量降低可达近 90%。

 

工作原理

 

1. 设计原则

上面一节我们从服务模型及支撑大规模集群的角度分别给出了 Dubbo 往应用级服务发现靠拢的好处或原因,但这么做的同时接口粒度的服务治理能力还是要继续保留,这是 Dubbo 框架编程模型易用性、服务治理能力优势的基础。

以下是我认为我们做服务模型迁移仍要坚持的设计原则:

  • 新的服务发现模型要实现对原有 Dubbo 消费端开发者的无感知迁移,即 Dubbo 继续面向 RPC 服务编程、面向 RPC 服务治理,做到对用户侧完全无感知;

  • 建立 Consumer 与 Provider 间的自动化 RPC 服务元数据协调机制,解决传统微服务模型无法同步 RPC 级接口配置的缺点。

 

2. 基本原理详解

应用级服务发现作为一种新的服务发现机制,和以前 Dubbo 基于 RPC 服务粒度的服务发现在核心流程上基本上是一致的:即服务提供者往注册中心注册地址信息,服务消费者从注册中心拉取&订阅地址信息。

这里主要的不同有以下两点:

  • 注册中心数据以“应用 - 实例列表”格式组织,不再包含 RPC 服务信息;

 

 

以下是每个 Instance metadata 的示例数据,总的原则是 metadata 只包含当前 instance 节点相关的信息,不涉及 RPC 服务粒度的信息。

总体信息概括如下:实例地址、实例各种环境标、metadata service 元数据、其他少量必要属性。

 
 

{ "name": "provider-app-name", "id": "192.168.0.102:20880", "address": "192.168.0.102", "port": 20880, "sslPort": null, "payload": { "id": null, "name": "provider-app-name", "metadata": { "metadataService": "{\"dubbo\":{\"version\":\"1.0.0\",\"dubbo\":\"2.0.2\",\"release\":\"2.7.5\",\"port\":\"20881\"}}", "endpoints": "[{\"port\":20880,\"protocol\":\"dubbo\"}]", "storage-type": "local", "revision": "6785535733750099598", } }, "registrationTimeUTC": 1583461240877, "serviceType": "DYNAMIC", "uriSpec": null }

  • Client – Server 自行协商 RPC 方法信息。

在注册中心不再同步 RPC 服务信息后,服务自省在服务消费端和提供端之间建立了一条内置的 RPC 服务信息协商机制,这也是“服务自省”这个名字的由来。服务端实例会暴露一个预定义的 MetadataService RPC 服务,消费端通过调用 MetadataService 获取每个实例 RPC 方法相关的配置信息。

 

 

当前 MetadataService 返回的数据格式如下:

 
 

[ "dubbo://192.168.0.102:20880/org.apache.dubbo.demo.DemoService?anyhost=true&application=demo-provider&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&interface=org.apache.dubbo.demo.DemoService&methods=sayHello&pid=9585&release=2.7.5&side=provider&timestamp=1583469714314", "dubbo://192.168.0.102:20880/org.apache.dubbo.demo.HelloService?anyhost=true&application=demo-provider&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&interface=org.apache.dubbo.demo.DemoService&methods=sayHello&pid=9585&release=2.7.5&side=provider&timestamp=1583469714314", "dubbo://192.168.0.102:20880/org.apache.dubbo.demo.WorldService?anyhost=true&application=demo-provider&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&interface=org.apache.dubbo.demo.DemoService&methods=sayHello&pid=9585&release=2.7.5&side=provider&timestamp=1583469714314" ]

熟悉 Dubbo 基于 RPC 服务粒度的服务发现模型的开发者应该能看出来,服务自省机制机制将以前注册中心传递的 URL 一拆为二:

  • 一部分和实例相关的数据继续保留在注册中心,如 ip、port、机器标识等;

  • 另一部分和 RPC 方法相关的数据从注册中心移除,转而通过 MetadataService 暴露给消费端。

理想情况下是能达到数据按照实例、RPC 服务严格区分开来,但明显可以看到以上实现版本还存在一些数据冗余,有些也数据还未合理划分。尤其是 MetadataService 部分,其返回的数据还只是简单的 URL 列表组装,这些 URL其实是包含了全量的数据。

以下是服务自省的一个完整工作流程图,详细描述了服务注册、服务发现、MetadataService、RPC 调用间的协作流程。

 

 

  1. 服务提供者启动,首先解析应用定义的“普通服务”并依次注册为 RPC 服务,紧接着注册内建的 MetadataService 服务,最后打开 TCP 监听端口;

  2. 启动完成后,将实例信息注册到注册中心(仅限 ip、port 等实例相关数据),提供者启动完成;

  3. 服务消费者启动,首先依据其要“消费的 provider 应用名”到注册中心查询地址列表,并完成订阅(以实现后续地址变更自动通知);

  4. 消费端拿到地址列表后,紧接着对 MetadataService 发起调用,返回结果中包含了所有应用定义的“普通服务”及其相关配置信息;

  5. 至此,消费者可以接收外部流量,并对提供者发起 Dubbo RPC 调用。

在以上流程中,我们只考虑了一切顺利的情况,但在更详细的设计或编码实现中,我们还需要严格约定一些异常场景下的框架行为。比如,如果消费者 MetadataService 调用失败,则在重试知道成功之前,消费者将不可以接收外部流量。

 

服务自省中的关键机制

 

1. 元数据同步机制

Client 与 Server 间在收到地址推送后的配置同步是服务自省的关键环节,目前针对元数据同步有两种具体的可选方案,分别是:内建 MetadataService;独立的元数据中心,通过中细化的元数据集群协调数据。

  • 内建 MetadataService:MetadataService 通过标准的 Dubbo 协议暴露,根据查询条件,会将内存中符合条件的“普通服务”配置返回给消费者。这一步发生在消费端选址和调用前;

  • 元数据中心:复用 2.7 版本中引入的元数据中心,provider 实例启动后,会尝试将内部的 RPC 服务组织成元数据的格式到元数据中心,而 consumer 则在每次收到注册中心推送更新后,主动查询元数据中心。

注意 consumer 端查询元数据中心的时机,是等到注册中心的地址更新通知之后。也就是通过注册中心下发的数据,我们能明确的知道何时某个实例的元数据被更新了,此时才需要去查元数据中心。

 

 

 

2. RPC 服务 < - > 应用映射关系

回顾上文讲到的注册中心关于“应用 - 实例列表”结构的数据组织形式,这个变动目前对开发者并不是完全透明的,业务开发侧会感知到查询/订阅地址列表的机制的变化。具体来说,相比以往我们基于 RPC 服务来检索地址,现在 consumer 需要通过指定 provider 应用名才能实现地址查询或订阅。

老的 Consumer 开发与配置示例:

 
 

<!-- 框架直接通过 RPC Service 1/2/N 去注册中心查询或订阅地址列表 --> <dubbo:registry address="zookeeper://127.0.0.1:2181"/> <dubbo:reference interface="RPC Service 1" /> <dubbo:reference interface="RPC Service 2" /> <dubbo:reference interface="RPC Service N" />

新的 Consumer 开发与配置示例:

 
 

<!-- 框架需要通过额外的 provided-by="provider-app-x" 才能在注册中心查询或订阅到地址列表 --> <dubbo:registry address="zookeeper://127.0.0.1:2181?registry-type=service"/> <dubbo:reference interface="RPC Service 1" provided-by="provider-app-x"/> <dubbo:reference interface="RPC Service 2" provided-by="provider-app-x" /> <dubbo:reference interface="RPC Service N" provided-by="provider-app-y" />

以上指定 provider 应用名的方式是 Spring Cloud 当前的做法,需要 consumer 端的开发者显示指定其要消费的 provider 应用。

以上问题的根源在于注册中心不知道任何 RPC 服务相关的信息,因此只能通过应用名来查询。

为了使整个开发流程对老的 Dubbo 用户更透明,同时避免指定 provider 对可扩展性带来的影响(参见下方说明),我们设计了一套 RPC 服务到应用名的映射关系,以尝试在 consumer 自动完成 RPC 服务到 provider 应用名的转换。

 

 

Dubbo 之所以选择建立一套“接口-应用”的映射关系,主要是考虑到 service - app 映射关系的不确定性。一个典型的场景即是应用/服务拆分,如上面提到的配置 ,PC Service 2 是定义于 provider-app-x 中的一个服务,未来它随时可能会被开发者分拆到另外一个新的应用如 provider-app-x-1 中,这个拆分要被所有的 PC Service 2 消费方感知到,并对应用进行修改升级,如改为 ,这样的升级成本不可否认还是挺高的。 到底是 Dubbo 框架帮助开发者透明的解决这个问题,还是交由开发者自己去解决,当然这只是个策略选择问题,并且 Dubbo 2.7.5+ 版本目前是都提供了的。其实我个人更倾向于交由业务开发者通过组织上的约束来做,这样也可进一步降低 Dubbo 框架的复杂度,提升运行态的稳定性。

 

总结与展望

应用级服务发现机制是 Dubbo 面向云原生走出的重要一步,它帮 Dubbo 打通了与其他微服务体系之间在地址发现层面的鸿沟,也成为 Dubbo 适配 Kubernetes Native Service 等基础设施的基础。

我们期望 Dubbo 在新模型基础上,能继续保留在编程易用性、服务治理能力等方面强大的优势。但是我们也应该看到应用粒度的模型一方面带来了新的复杂性,需要我们继续去优化与增强;另一方面,除了地址存储与推送之外,应用粒度在帮助 Dubbo 选址层面也有进一步挖掘的潜力。

 

作者简介

刘军,Github 账号 Chickenlj,Apache Dubbo PMC,项目核心开发,见证了Dubbo从重启开源到Apache毕业的整个流程。现任职阿里云云原生应用平台团队,参与服务框架、微服务相关工作,目前主要在推动 Dubbo 3.0 - Dubbo 云原生。

 

课程推荐

为了更多开发者能够享受到 Serverless 带来的红利,这一次,我们集结了 10+ 位阿里巴巴 Serverless 领域技术专家,打造出最适合开发者入门的 Serverless 公开课,让你即学即用,轻松拥抱云计算的新范式——Serverless。

点击即可免费观看课程:https://developer.aliyun.com/learning/roadmap/serverless

“阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的公众号。”

原文链接
本文为云栖社区原创内容,未经允许不得转载。

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

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

相关文章

阿里云HiShop海商创新合作—线上商城这样做更合适

做商城一直是企业商家经久不衰的话题&#xff0c;尽管人们对于网上商城系统的了解已经有很多。距离电商真正来到与消费者做到息息相关&#xff0c;或许还要很长的路要走。人、货、场三种元素没有实现根本联通是一个很重要的原因。那么企业应该怎样搭建线上商城才能最符合当下消…

nacos 开启权限验证后 报错状态 403

文章目录一、漏洞修复1. 未授权访问漏洞2. 解决方案3. 修复效果图二、403 异常解决2.1. 版本对照2.2. 线上采用版本2.3. yml文件配置2.4. pom依赖2.5. 效果图一、漏洞修复 1. 未授权访问漏洞 前因&#xff1a;政府项目被扫出nacos未授权访问漏洞 2. 解决方案 在nacos/conf…

数据爆发式增长下,CIO不可不知的“数据经济学”

导读&#xff1a;6月9日&#xff0c;全速重构•2020阿里云线上峰会如期举行。阿里巴巴研究员、阿里云智能存储资深产品总监Alex Chen做了主题为《面向未来&#xff0c;企业CIO该懂的数据经济学》的分享。在分享中&#xff0c;他畅谈了数据增长所带来的全新挑战&#xff0c;同时…

小程序快速入门

文章目录一、微信小程序和企业微信小程序相同点和区别&#xff1f;1.1.相同点1.2.不同点1.3.受众人群1.4.核心概念1.5.总结二、开发文档2.1.微信开发文档2.2.企业微信开发文档三、小程序申请&#xff1f;3.1.申请流程3.2.主体说明四、小程序如何线下调试&#xff1f;4.1.调试流…

Serverless在大规模数据处理的实践

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 前言 当您第一次接触 Serverless 的时候&#xff0c;有一个不那么明显的新使用方式&#xff1a;与传统的基于服务器的方法相…

完美日记:实现高弹性高稳定电商架构

公司简介 完美日记&#xff08;Perfect Diary&#xff09;是广州市“独角兽”创新企业——广州逸仙电子商务有限公司旗下首个美妆品牌&#xff0c;创立于2017年&#xff0c;用心为新生代女性开发高品质、精设计、易上手的彩妆及护肤产品&#xff0c;立志于打造有国际影响力的C…

云原生体系下的技海浮沉与理论探索

来源 | 阿里巴巴中间件责编 | 晋兆雨头图 | 付费下载于视觉中国概述

比GPU性能提升5倍阿里云含光800云服务器正式商用

含光800云服务器&#xff0c;配备阿里平头哥自研神经网络加速芯片含光800&#xff0c;提供全球最高单芯片AI推理性能&#xff0c;有着同类处理器的数十倍性能&#xff1b;并针对业务场景做了深度优化&#xff0c;广泛适用于图像搜索、场景识别、视频内容识别、自然语言处理等业…

阿里研发效能数据知多少

2020 年 3 月阿里云云效平台发布了阿里内部 4 万开发者的研发效能数据报&#xff0c;数据显示阿里代码量和交付表现一路飙升&#xff0c;2020 财年代码行数共新增 15 亿&#xff0c;修改重构代码总行数 4 亿&#xff0c;疫情期间新增代码行 2.9 亿&#xff1b;3 天开发出健康码…

春招抢跑丨腾讯新年放大“招”!超3000+岗位!

虽然离春节仅剩 1 个月的时间&#xff0c;大厂依旧没有停止招人。就在上周&#xff0c;腾讯官宣新年大扩招&#xff0c;放出 3000 多个岗位需求&#xff01;我们查看了腾讯的招聘数据发现&#xff0c;除了大量招聘运营人员&#xff0c;你猜&#xff0c;他们还在批量招聘什么岗位…

对话阿里云MVP裔隽跨界半生,不改赤子心

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 简介&#xff1a; 我从没想过会用“少年感”来形容一位40岁的商界人士。裔隽在很多时候像一位人生导师&#xff0c;儒雅随和&…

从 2018 年 Nacos 开源说起

2018 年夏天 国内微服务开源 领域&#xff0c;迎来了一位新成员。此后&#xff0c;在构建微服务注册中心和配置中心的过程中&#xff0c;国内开发者多了一个可信赖的选项。 Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台(官方网站)…

用三国杀讲分布式算法,舒适了吧?

来源 | 悟空聊架构头图 | 付费下载于视觉中国点击播放&#xff0c;看文效果更佳&#xff01;东汉末年&#xff0c;袁绍作为盟主&#xff0c;汇合了十八路诸侯一起攻打董卓。在讲解之前&#xff0c;我们先聊下分布式协议和算法整体脉络。现在很多开发同学对分布式的组件怎么使用…

软件设计师 - UML图

文章目录总览UML图关系活动图通信图用例图类图 对象图顺序图状态图组件图总览 UML图关系 包含&#xff1a; 扩展&#xff1a; 泛化&#xff1a; 用例的泛化&#xff1a;把可选行为从必须行为中分离出来&#xff1b; 参与者的泛化&#xff1a;可以完成参与者的同样的任务&am…

SpringBoot 使用宝兰德中间件替换tomcat运行部署+控制台部署

文章目录1. 排除tomcat依赖2. 集成宝兰德依赖3. 项目打包方式4. 支持war部署配置5. 控制台部署1. 排除tomcat依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions>…

戚俊:可能是最懂架构的投资人

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 简介&#xff1a; 戚俊的快速成长离不开恰逢其时的机遇和委以重任的伯乐&#xff0c;毕业一两年受邀创业。当腻了CTO&#xf…

除了 Docker,我们还有哪些选择?

来源 | CSDN编译 | 弯月 责编 | 张文头图 | CSDN下载于视觉中国【编者按】所谓三十年河东&#xff0c;三十年河西&#xff0c;曾经在容器领域叱咤风云的 Docker 如今已风光不再。抛开情怀&#xff0c;我们不得不承认&#xff0c;Docker 已经被后浪拍死在沙滩上了……大约 4 年前…

阿里云李飞飞:今年将帮1000家企业“去O”,完成10000套传统数据仓库上云

阿里云直播回放头号云话题直播回放 “今年将帮1000家企业去O&#xff0c;完成10000套传统数据仓库上云。”6月9日&#xff0c;阿里云数据库负责人李飞飞在阿里云峰会上表示&#xff0c;经过多年技术演进&#xff0c;传统数据库上云已进入大规模攻坚阶段。 达摩院数据库首席科学…

系统架构设计师 - 23种设计模式(GOF)

文章目录总览创建型&#xff08;5种&#xff09;工厂方法 Factory Method抽象工厂 Abstract Factory生成器模式 Builder原型模式 Prototype单例模式 Singleton结构型&#xff08;7种&#xff09;适配器 Adapter桥接 Bridge组合模式 Composite装饰者模式 Decorator外观模式 Faca…

如何使用Trie树,设计实践Google一样的输入提示功能

来源 | 搜索技术责编 | 小白Google和百度都支持输入提示功能&#xff0c;辅助你快速准确的输入想要的内容。如下&#xff1a;输入“五一”&#xff0c;会提示“五一劳动节”等。那如何实现谷歌这样的输入提示功能呢&#xff1f;分析下输入提示的功能需求当输入前面的词A&#x…