This is an automated email from the ASF dual-hosted git repository. liujun pushed a commit to branch refactor/docs in repository https://gitbox.apache.org/repos/asf/dubbo-website.git
commit e0473ecff58834b4d868ddaffe9473696cbb5397 Author: chickenlj <[email protected]> AuthorDate: Mon May 9 16:10:54 2022 +0800 update --- content/cn/facade-docs/_index.md | 14 ++-- content/cn/facade-docs/mannual/Golang.md | 2 +- content/cn/facade-docs/mannual/Java.md | 2 +- content/cn/facade-docs/what/overview.md | 107 +++++++++++++++++++++++++-- content/cn/facade-docs/what/usecases.md | 10 +-- content/cn/facade-docs/whatsnew/_index.md | 21 +++++- content/cn/facade-docs/whatsnew/mesh.md | 4 +- content/cn/users/_index.md | 66 +++++++++++++++++ content/cn/users/alibaba.md | 7 ++ content/cn/users/icbc.md | 7 ++ content/cn/users/xiaomi.md | 7 ++ layouts/shortcodes/page/header.html | 13 ++++ layouts/shortcodes/page/page-meta-links.html | 3 + layouts/shortcodes/page/toc.html | 30 ++++++++ static/imgs/v3/concepts/rpc.png | Bin 0 -> 22695 bytes static/imgs/v3/mesh/mix-mesh.png | Bin 0 -> 144878 bytes 16 files changed, 269 insertions(+), 24 deletions(-) diff --git a/content/cn/facade-docs/_index.md b/content/cn/facade-docs/_index.md index 1a14e81fcb..18d529e304 100755 --- a/content/cn/facade-docs/_index.md +++ b/content/cn/facade-docs/_index.md @@ -13,15 +13,15 @@ menu: Dubbo 是一款包含多种语言实现(Java、Golang等)的 RPC 服务框架,在这里可以查看 Dubbo 核心概念以及每种语言实现的 Demo、用户手册等。 * **如果你是第一次接触 Dubbo**,可以通过以下链接快速了解 Dubbo: - * 什么是 Dubbo - * 核心概念与架构 - * 选择相应**语言 SDK 实现**,通过**快速开始**体验 Dubbo + * [什么是 Dubbo](what/overview.md) + * [用户案例与生态](what/usecases.md) + * 通过 [**快速开始**](quickstart/) 体验 Dubbo * 想了解更多 Dubbo 特性与使用细节? - * 选择相应**语言 SDK 实现**,并参考**高级特性**或**参考手册** - * Dubbo 生态 + * 选择相应 [**多语言 SDK 实现**](mannual/),并参考**高级特性**或**参考手册** + * [**FAQ**](faq) * 老用户,想快速了解 **Dubbo 3.0** 相关知识 - * 3.0 特性一览 - * 查看相应语言 SDK 实现,了解升级与兼容性 + * [3.0 特性一览](whatsnew/) + * 查看相应[多语言 SDK 实现](mannual/),了解升级与兼容性 #### 相关链接 Dubbo 的多语言实现及文档: diff --git a/content/cn/facade-docs/mannual/Golang.md b/content/cn/facade-docs/mannual/Golang.md index 81e212e25e..0808bdd0b5 100755 --- a/content/cn/facade-docs/mannual/Golang.md +++ b/content/cn/facade-docs/mannual/Golang.md @@ -2,7 +2,7 @@ --- type: docs title: "Golang SDK" -linkTitle: "golang" +linkTitle: "Golang" description: "" weight: 2 manualLinkTarget: _blank diff --git a/content/cn/facade-docs/mannual/Java.md b/content/cn/facade-docs/mannual/Java.md index a97f1ad29c..c45f149a3c 100755 --- a/content/cn/facade-docs/mannual/Java.md +++ b/content/cn/facade-docs/mannual/Java.md @@ -2,7 +2,7 @@ --- type: docs title: "Java SDK" -linkTitle: "java" +linkTitle: "Java" description: "" weight: 1 manualLinkRelref: ../../java-sdk/ diff --git a/content/cn/facade-docs/what/overview.md b/content/cn/facade-docs/what/overview.md index e4586462de..6006fab764 100644 --- a/content/cn/facade-docs/what/overview.md +++ b/content/cn/facade-docs/what/overview.md @@ -6,14 +6,109 @@ weight: 1 description: "" --- -Dubbo 的一句话定义与总结。 +Apache Dubbo 是一款 RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题,并提供了 Java、Golang 等多种语言的 SDK 实现。使用 Dubbo 开发的微服务,将原生具备相互之间的远程地址发现与通信能力, +同时利用 Dubbo 提供的丰富服务治理特性,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。Dubbo 被设计为高度可扩展,用户几乎可以在任意功能点去定制自己的实现以满足自身业务需求。 -> Dubbo 总体工作原理图,可涵盖服务发现、RPC、多语言、Mesh 等。 +3.0 版本(Dubbo3)开始,我们将 Dubbo 定义为面向云原生的下一代 RPC 服务框架。3.0 基于 [Dubbo 2.x]() 演进而来,在保持原有核心功能特性的同时, Dubbo3 在易用性、超大规模微服务实践、云原生基础设施适配、安全性等几大方向上进行了全面升级。 -## Dubbo 是什么 +### Dubbo 是什么 +Apache Dubbo 是一款开源 RPC 服务框架,它最初在 2008 年由 Alibaba 捐献开源,并且很快成为了国内开源服务框架选型的事实标准框架,得到了各行各业的广泛应用。在 2017 年,Dubbo 正式捐献到 Apache 软件基金会并成为 Apache 顶级项目,目前 Dubbo3 已经是一站式的微服务解决方案提供: +* 基于 HTTP/2 的 [Triple 协议]()以及面向代理 API 的编程体验。 +* 强大的[流量治理能力](),如地址发现、负载均衡、路由选址、动态配置等。 +* [多语言 SDK 实现](),涵盖 Java、Golang、Javascript 等,更多语言实现将会陆续发布。 +* 灵活的适配与扩展能力,可轻松与微服务体系其他组件如 Tracing、Transaction 等适配。 +* [Service Mesh 解决方案](),同时支持 Sidecar、Proxyless 等灵活的 Mesh 部署方案。 -## Dubbo 如何工作 +Apache Dubbo 总体架构能很好的满足企业的大规模微服务实践,因为它从设计之初就是为了解决超大规模微服务集群实践问题,不论是阿里巴巴还是工商银行、中国平安、携程等社区用户,它们都通过多年的大规模生产环境流量对 Dubbo 的稳定性与性能进行了充分验证,因此,Dubbo 在解决业务落地与规模化实践方面有着无可比拟的优势: +* 开箱即用 + * 易用性高,如 Java 版本的面向接口代理特性能实现本地透明调用 + * 功能丰富,基于原生库或轻量扩展即可实现绝大多数的微服务治理能力 +* 面向超大规模微服务集群设计 + * 极致性能,高性能的 RPC 通信协议设计与实现 + * 横向可扩展,轻松支持百万规模集群实例的地址发现与流量治理 +* [高度可扩展]() + * 调用过程中对流量及协议的拦截扩展,如 Filter、Router、LB 等 + * 微服务治理组件扩展,如 Registry、Config Center、Metadata Center 等 +* 企业级微服务治理能力 + * 国内共有云厂商支持的事实标准服务框架 + * 多年企业实践经验考验,参考[用户实践案例](../../users) + +### Dubbo 基本工作流程 -## Dubbo 核心特性 -https://istio.io/latest/about/service-mesh/ \ No newline at end of file + + +Dubbo 首先是一款 RPC 框架,它定义了自己的 RPC 通信协议与编程方式。如上图所示,用户在使用 Dubbo 时首先需要定义好 Dubbo 服务;其次,是在将 Dubbo 服务部署上线之后,依赖 Dubbo 的应用层通信协议实现数据交换,Dubbo 所传输的数据都要经过序列化,而这里的[序列化协议]()是完全可扩展的。 +使用 Dubbo 的第一步就是定义 Dubbo 服务,服务在 Dubbo 中的定义就是完成业务功能的一组方法的集合,可以选择使用与某种语言绑定的方式定义,如在 Java 中 Dubbo 服务就是有一组方法的 Interface 接口,也可以使用语言中立的 Protobuf Buffers [IDL 定义服务]()。定义好服务之后,服务端(Provider)需要提供服务的具体实现,并将其声明为 Dubbo 服务,而站在服务消费方(Consumer)的视角,通过调用 Dubbo 框架提供的 API 可以获得一个服务代理(stub)对象,然后就可以像使用本地服务一样对服务方法发起调用了。 +在消费端对服务方法发起调用后,Dubbo 框架负责将请求发送到部署在远端机器上的服务提供方,提供方收到请求后会调用服务的实现类,之后将处理结果返回给消费端,这样就完成了一次完整的服务调用。如图中的 Request、Response 数据流程所示。 +>需要注意的是,在 Dubbo 中,我们提到服务时,通常是指 RPC 粒度的、提供某个具体业务增删改功能的接口或方法,与一些微服务概念书籍中泛指的服务并不是一个概念。 + +在分布式系统中,尤其是随着微服务架构的发展,应用的部署、发布、扩缩容变得极为频繁,作为 RPC 消费方,如何定动态的发现服务提供方地址成为 RPC 通信的前置条件。Dubbo 提供了自动的地址发现机制,用于应对分布式场景下机器实例动态迁移的问题。如下图所示,通过引入注册中心来协调提供方与消费方的地址,提供者启动之后向注册中心注册自身地址,消费方通过拉取或订阅注册中心特定节点,动态的感知提供方地址列表的变化。 + + + +地址发现解决了实例变更的问题,但微服务环境下的服务治理诉求同样变得非常复杂,用户需要考虑 Dubbo 服务治理的问题如服务测试、服务元数据管理、流量管控、动态行为调整等,为此, Dubbo 架构引入了配置中心、元数据中心进一步拓展了其服务治理边界。 + + + +随着云原生架构的发展,更多的微服务组件及能力正下沉到以 Kubernetes 为代表的基础设施层。一方面传统微服务开发框架应剔除一些冗余机制,积极的适配到基础设施层以做到能力复用;另一方面微服务框架生命周期、服务治理等能力应更好地与 Kubernetes 服务编排机制融合。更近一步的,以 Service Mesh 为代表的微服务架构给微服务开发带来了新的选择,Dubbo3 也完成了对 Kubernetes、Mesh 的适配。 + + + +### Dubbo 核心特性 + +#### 高性能 RPC 通信协议 +跨进程或主机的服务通信是 Dubbo 的一项基本能力,Dubbo RPC 以预先定义好的协议编码方式将请求数据(Request)发送给后端服务,并接收服务端返回的计算结果(Response)。RPC 通信对用户来说是完全透明的,使用者无需关心请求是如何发出去的、发到了哪里,每次调用只需要拿到正确的调用结果就行。除了同步模式的 Request-Response 通信模型外,Dubbo3 还提供更丰富的通信模型选择: +* 消费端异步请求(Client Side Asynchronous Request-Response) +* 提供端异步执行(Server Side Asynchronous Request-Response) +* 消费端请求流(Request Streaming) +* 提供端响应流(Response Streaming) +* 双向流式通信(Bidirectional Streaming) + +具体可参见[可选协议列表]()、[Triple协议]() + +#### 自动服务(地址)发现 +Dubbo 的服务发现机制,让微服务组件之间可以独立演进并任意部署,消费端可以在无需感知对端部署位置与 IP 地址的情况下完成通信。Dubbo 提供的是 Client-Based 的服务发现机制,使用者可以有多种方式启用服务发现: +* 使用独立的注册中心组件,如 Nacos、Zookeeper、Consul、Etcd 等。 +* 将服务的组织与注册交给底层容器平台,如 Kubernetes,这被理解是一种更云原生的使用方式 + +#### 运行态流量管控 +透明地址发现让 Dubbo 请求可以被发送到任意 IP 实例上,这个过程中流量被随机分配。当需要对流量进行更丰富、更细粒度的管控时,就可以用到 Dubbo 的流量管控策略,Dubbo 提供了包括负载均衡、流量路由、请求超时、流量降级、重试等策略,基于这些基础能力可以轻松的实现更多场景化的路由方案,包括金丝雀发布、A/B测试、权重路由、同区域优先等,更酷的是,Dubbo 支持流控策略在运行态动态生效,无需重新部署。具体可参见: +* [路由说明]() +* [负载均衡]() +* [服务治理示例]() + +#### 丰富的扩展组件及生态 +Dubbo 强大的服务治理能力不仅体现在核心框架上,还包括其优秀的扩展能力以及周边配套设施的支持。通过 Filter、Router、Protocol 等几乎存在于每一个关键流程上的扩展点定义,我们可以丰富 Dubbo 的功能或实现与其他微服务配套系统的对接,包括 Transaction、Tracing 目前都有通过 SPI 扩展的实现方案,具体可以参见 Dubbo 扩展性的详情,也可以在 [apache/dubbo-spi-extensions](https://github.com/apache/dubbo-spi-extensions) 项目中发现与更多的扩展实现。具体可参见: +* [Dubbo 生态]() +* [官方扩展组件]() +* [Dubbo 可扩展性设计]() + + +#### 面向云原生设计 + +Dubbo 从设计上是完全遵循云原生微服务开发理念的,这体现在多个方面,首先是对云原生基础设施与部署架构的支持,包括 Kubernetes、Service Mesh 等,另一方面,Dubbo 众多核心组件都已面向云原生升级,包括 Triple 协议、统一路由规则、对多语言支持。值得一提的是,如何使用 Dubbo 支持弹性伸缩的服务如 Serverless 也在未来计划之中,这包括利用 Native Image 提高 Dubbo 的启动速度与资源消耗等。 + +结合当前版本,本节主要从以下两点展开 Dubbo 的云原生特性 +* 容器调度平台(Kubernetes) +* Service Mesh + +##### Kubernetes +Dubbo 微服务要支持 Kubernetes 平台调度,最基础的就是实现 dubbo 服务生命周期与容器生命周期的对齐,这包括 Dubbo 的启动、销毁、服务注册等生命周期事件。相比于以往 Dubbo 自行定义生命周期事件,并要求开发人员在运维实践过程中遵守约定,Kubernetes 底层基础设施定义了严格的组件生命周期事件(probe),转而要求 Dubbo 去按约定适配。 + +Kubernetes Service 是另一个层面的适配,这体现了服务定义与注册向云原生底层基础设施下沉的趋势。在这种模式下,用户不再需要搭建额外的注册中心组件,Dubbo 消费端节点能自动对接到 Kubernetes(API-Server 或 DNS),根据服务名(Kubernetes Service Name) 查询到实例列表(Kubernetes endpoints)。 此时服务是通过标准的 Kubernetes Service API 定义,并被调度到各个节点。 + +##### Service Mesh + +Service Mesh 在业界得到了广泛的传播与认可,并被认为是下一代的微服务架构,这主要是因为它解决了很多棘手的问题,包括透明升级、多语言、依赖冲突、流量治理等。Service Mesh 的典型架构是通过部署独立的 Sidecar 组件来拦截所有的出口与入口流量,并在 Sidecar 中集成丰富的流量治理策略如负载均衡、路由等,除此之外,Service Mesh 还需要一个控制面(Control Panel)来实现对 Sidecar 流量的管控,即各种策略下发。我们在这里称这种架构为经典 Mesh。 + +然而任何技术架构都不是完美的,经典 Mesh 在实施层面也面临成本过高的问题 +1. 需要运维控制面(Control Panel) +2. 需要运维 Sidecar +3. 需要考虑如何从原有 SDK 迁移到 Sidecar +4. 需要考虑引入 Sidecar 后整个链路的性能损耗 + +为了解决 Sidecar 引入的相关成本问题,Dubbo 引入了另一种变相的 Mesh 架构 - Proxyless Mesh,顾名思义,Proxyless Mesh 就是指没有 Sidecar 的部署,转而由 Dubbo SDK 直接与控制面交互,其架构图如下 + + +可以设想,在不同的组织、不同的发展阶段,未来以 Dubbo 构建的微服务将会允许有三种部署架构:传统 SDK、基于 Sidecar 的 Service Mesh、脱离 Sidecar 的 Proxyless Mesh。基于 Sidecar 的 Service Mesh,即经典的 Mesh 架构,独立的 sidecar 运行时接管所有的流量,脱离 Sidecar 的 Proxyless Mesh,富 SDK 直接通过 xDS 与控制面通信。Dubbo 微服务允许部署在物理机、容器、Kubernetes 平台之上,能做到以 Admin 为控制面,以统一的流量治理规则进行治理。 diff --git a/content/cn/facade-docs/what/usecases.md b/content/cn/facade-docs/what/usecases.md index 86cf022c31..16efe19489 100644 --- a/content/cn/facade-docs/what/usecases.md +++ b/content/cn/facade-docs/what/usecases.md @@ -3,9 +3,7 @@ type: docs title: "用户案例" linkTitle: "用户案例" weight: 2 -description: "" ---- - -概括 Dubbo 被广泛使用。 - -前期放用户案例列表,可以把用户的故事写出来,链接过去。 \ No newline at end of file +manualLinkRelref: ../../users/ +manualLinkTarget: _blank +_build: { render: link } +--- \ No newline at end of file diff --git a/content/cn/facade-docs/whatsnew/_index.md b/content/cn/facade-docs/whatsnew/_index.md index 940c5cfea6..4df4c842ec 100755 --- a/content/cn/facade-docs/whatsnew/_index.md +++ b/content/cn/facade-docs/whatsnew/_index.md @@ -6,4 +6,23 @@ linkTitle: "3.0 速览" weight: 3 --- -此页面需要完整的描述 3.0 背后的核心设计理念与思考,以及 3.0 当前的状态与实践情况。 \ No newline at end of file +Dubbo3 的设计有两个大的背景,企业实践,尤其是 Dubbo 在大规模企业实践的经历,给了,云原生时代的。 +因此,Dubbo3 和阿里巴巴, + +Dubbo3 + +### 性能 容量 +集群容量瓶颈 + +资源利用率提升 + +### 云原生 +协议 + +多语言 + +异构体系互通 + +底层基础设施 + +Serivice Mesh diff --git a/content/cn/facade-docs/whatsnew/mesh.md b/content/cn/facade-docs/whatsnew/mesh.md index 7629b6acd7..6a52685191 100644 --- a/content/cn/facade-docs/whatsnew/mesh.md +++ b/content/cn/facade-docs/whatsnew/mesh.md @@ -1,7 +1,7 @@ --- type: docs -title: "Mesh" -linkTitle: "Mesh" +title: "Dubbo Mesh" +linkTitle: "Dubbo Mesh" weight: 1 --- diff --git a/content/cn/users/_index.md b/content/cn/users/_index.md new file mode 100644 index 0000000000..c0ffaf55cf --- /dev/null +++ b/content/cn/users/_index.md @@ -0,0 +1,66 @@ + +--- +title: "用户案例" +weight: 3 +description: Dubbo 用户案例分享,涵盖最新 3.0 版本 +menu: + main: + weight: 20 +--- + +{{< blocks/cover height="sm" color="primary" >}} +{{< page/header >}} +{{< /blocks/cover >}} + +<div class="container l-container--padded"> + +<div class="row"> +{{< page/toc collapsed=true placement="inline" >}} +</div> + +<div class="row"> +<div class="col-12 col-lg-12"> + +Apache Dubbo 诞生于阿里巴巴微服务实践之中,在开源之后深受企业用户喜爱并迅速成为国内开源服务框架选型的事实标准产品,用户范围涵盖互联网、金融保险、科技公司、制造业、零售物流等领域的几乎所有头部用户。 + + +{{< cardpane >}} + {{< card header="阿里巴巴的 Dubbo3 落地实践" >}} +阿里巴巴多条核心业务包括淘宝、考拉、饿了么、钉钉、达摩院等业务线都已完全或部分迁移到 Dubbo3,用于取代上一代 HSF2 服务框架。 +<a href='{{< relref "alibaba.md" >}}'>了解更多</a> + {{< /card >}} + + {{< card header="工商银行 Dubbo3 应用级服务发现实践" >}} + 工商银行为什么要选型 Dubbo3 应用级服务发现架构那?核心原因是 2.x 版本架构在超大规模集群实战上的性能和容量瓶颈。 + <a href='{{< relref "alibaba" >}}'>了解更多</a> + {{< /card >}} + + {{< card header="小米的 Dubbo-go 实践" >}} + dubbo3已经和云原生做了深度适配,建议后续能够和istio等service mesh框架进行更多的衔接打通,方便dubbo用户更简单的走向mesh化之路; + dubbo3重新设计了Triple协议和服务发现模型,为跨语言跨微服务框架的通信提供了可能,建议提供一些和go、springcloud打通的实际解决方案; + 建议在调用方和服务方调用链路上增加更多的可选可观测点 + <a href='{{< relref "alibaba" >}}'>了解更多</a> + {{< /card >}} +{{< /cardpane >}} + + {{< cardpane >}} + {{< card header="阿里巴巴的 Dubbo3 落地实践" >}} + 阿里巴巴多条核心业务包括淘宝、考拉、饿了么、钉钉、达摩院等业务线都已完全或部分迁移到 Dubbo3,用于取代上一代 HSF2 服务框架。当前用到的核心功能包括: +* 下一代通信协议 Triple,实现反压、Stream、跨网关调用等 +* 应用级服务发现模型,用于降低单机及注册中心资源消耗,实现百万实例集群水平扩容 +* 统一的云原生服务治理规则 + {{< /card >}} + {{< card header="工商银行 Dubbo3 应用级服务发现实践" >}} + 工商银行为什么要选型 Dubbo3 应用级服务发现架构那?核心原因是 2.x 版本架构在超大规模集群实战上的性能和容量瓶颈。 + {{< /card >}} + {{< card header="小米的 Dubbo-go 实践" >}} + dubbo3已经和云原生做了深度适配,建议后续能够和istio等service mesh框架进行更多的衔接打通,方便dubbo用户更简单的走向mesh化之路; + dubbo3重新设计了Triple协议和服务发现模型,为跨语言跨微服务框架的通信提供了可能,建议提供一些和go、springcloud打通的实际解决方案; + 建议在调用方和服务方调用链路上增加更多的可选可观测点 + {{< /card >}} + {{< /cardpane >}} + + +</div> +</div> +</div> \ No newline at end of file diff --git a/content/cn/users/alibaba.md b/content/cn/users/alibaba.md new file mode 100644 index 0000000000..b7507afdf5 --- /dev/null +++ b/content/cn/users/alibaba.md @@ -0,0 +1,7 @@ +--- +type: docs +title: "阿里巴巴" +linkTitle: "阿里巴巴" +weight: 3 +description: Dubbo 用户案例分享,涵盖最新 3.0 版本 +--- \ No newline at end of file diff --git a/content/cn/users/icbc.md b/content/cn/users/icbc.md new file mode 100644 index 0000000000..b7507afdf5 --- /dev/null +++ b/content/cn/users/icbc.md @@ -0,0 +1,7 @@ +--- +type: docs +title: "阿里巴巴" +linkTitle: "阿里巴巴" +weight: 3 +description: Dubbo 用户案例分享,涵盖最新 3.0 版本 +--- \ No newline at end of file diff --git a/content/cn/users/xiaomi.md b/content/cn/users/xiaomi.md new file mode 100644 index 0000000000..b7507afdf5 --- /dev/null +++ b/content/cn/users/xiaomi.md @@ -0,0 +1,7 @@ +--- +type: docs +title: "阿里巴巴" +linkTitle: "阿里巴巴" +weight: 3 +description: Dubbo 用户案例分享,涵盖最新 3.0 版本 +--- \ No newline at end of file diff --git a/layouts/shortcodes/page/header.html b/layouts/shortcodes/page/header.html new file mode 100644 index 0000000000..2d579e836b --- /dev/null +++ b/layouts/shortcodes/page/header.html @@ -0,0 +1,13 @@ +{{ $title := $.Page.Params.title -}} +{{ $desc := $.Page.Params.description | markdownify -}} +<div class="text-left"> + <h1 class="display-1 mb-5"> + {{- $title -}} + </h1> + + {{- with $desc -}} + <h3 class="font-weight-light"> + {{- . -}} + </h3> + {{ end -}} +</div> \ No newline at end of file diff --git a/layouts/shortcodes/page/page-meta-links.html b/layouts/shortcodes/page/page-meta-links.html new file mode 100644 index 0000000000..5a1d4d3a22 --- /dev/null +++ b/layouts/shortcodes/page/page-meta-links.html @@ -0,0 +1,3 @@ +<div class="c-global-meta-links d-lg-none"> + {{ partial "page-meta-links" .Page }} +</div> \ No newline at end of file diff --git a/layouts/shortcodes/page/toc.html b/layouts/shortcodes/page/toc.html new file mode 100644 index 0000000000..5fe1433eef --- /dev/null +++ b/layouts/shortcodes/page/toc.html @@ -0,0 +1,30 @@ +{{ $collapsed := .Get "collapsed" | default false }} +{{ $placement := .Get "placement" | default "sidebar" }} + +{{ with .Page.TableOfContents }} + {{ if (eq $placement "sidebar") }} + <div class="d-none d-lg-block col-3 offset-md-1"> + <div class="td-toc td-toc--inline"> + {{ else if (eq $placement "inline") }} + <div class="d-lg-none col-12"> + <div class="td-toc td-toc--inline"> + {{ end }} + {{ if $collapsed }} + <a id="td-content__toc-link" class="collapsed" href="#td-content__toc" data-toggle="collapse" aria-controls="td-page-toc" aria-expanded="false" aria-label="Toggle toc navigation"> + <span class="lead">Contents<i class="fas fa-chevron-right ml-2"></i></span> + </a> + <div id="td-content__toc" class="collapse"> + {{ . }} + </div> + <button id="td-content__toc-link-expanded" href="#td-content__toc" class="btn btn-small ml-1 my-2 py-0 px-3" data-toggle="collapse" aria-controls="td-docs-toc" aria-expanded="true" aria-label="Toggle toc navigation"> + </button> + {{ else }} + <h5 class="lead"><i class="fas fa-list mr-2"></i>Contents</h5> + {{ partial "page-meta-links.html" $.Page }} + <div class="text-left"> + {{ . }} + </div> + {{ end }} + </div> + </div> +{{ end }} \ No newline at end of file diff --git a/static/imgs/v3/concepts/rpc.png b/static/imgs/v3/concepts/rpc.png new file mode 100644 index 0000000000..702b126e25 Binary files /dev/null and b/static/imgs/v3/concepts/rpc.png differ diff --git a/static/imgs/v3/mesh/mix-mesh.png b/static/imgs/v3/mesh/mix-mesh.png new file mode 100644 index 0000000000..9100dd0336 Binary files /dev/null and b/static/imgs/v3/mesh/mix-mesh.png differ
