apache / apache/dubbo-spi-extensions
【XDS】Dubbo xds 分享-1
- Dominant language
- Java
- Stars
- 206
- Forks
- 121
- PR merge metrics
- No merged PRs in 30d
Description
## 概述
服务治理分为两种模式,有`sidecar`和无`sidecar`。
两者都分为控制面和数据面,控制面负责收集并下发`xds`资源,数据面负责解析资源,根据资源进行服务治理。
有`sidecar`为代表的是`envoy`,无`sidecar`需要框架自己实现。

## Envoy
### 资源类型
* `LDS`: 服务或程序的监听器,当监听到请求时,通过`Filter Chain`对请求进行处理。
* `RDS`: `Route`规则规定请求如何路由到哪个`Cluster`。
* `CDS`: 可以理解`应用集群`,对应提供相同服务的一个或多个`Endpoint`, 类似`K8s`中`Service`概念,一个`CDS`包含一组`EDS`。
* `EDS`: 具体的应用实例,类似于`K8s`中的一个`Pod`。
### 通信过程
V代表版本号,R代表资源名称,T代表资源类型。

`ADS`: 通过`Stream流`实现,全双工的。当配置更新后,控制面可以动态获取并`推送配置`到数据面,数据面`更新路由规则`。
### 资源使用
用户请求整体流程

`RDS`资源格式:最终会找到`ClusterName`

### 参考链接
[xDS REST and gRPC protocol](https://www.envoyproxy.io/docs/envoy/latest/api-docs/xds_protocol)
## 实现
### 原理
主要包括两步:
1、资源(`xds`)的获取与更新。
2、根据资源进行服务治理(将请求发送到对应的provider)。
### Dubbo实现
AdsObserver: 观察者,服务端响应后负责调用对应的`资源Protocol`解析。
XdsRouter.doRoute() -> PilotExchanger -> xxxProtocol -> AdsObserver
XdsChannel(建立连接) -> Bootstrap(从文件中获取启动信息)

## gRPC实现
## 功能
### 流量管理
* 金丝雀发布(流量按比例转发:将不同版本的服务`pod`打上不同的标签部署在同一个`Service`中;`VirtualService`中定义通过`destination.subset`和`weight`指定该`subset`下`pod`分配的流量比例;`DestinationRule`负责划分`pod`中的标签划分`subset`)
* 流量路由(将流量转发到不同的服务)
* 参数路由:根据参数指定
* 条件路由:
* 标签路由:
* 负载均衡
* 超时
* 重试
* 熔断
* 故障注入
### 可观测性
* 指标
* 分布式追踪
* 访问日志
### 安全
## 其他链接
* `grpc-xds`实现proposal:https://github.com/grpc/proposal/tree/master
* `grpc-xds`概述:https://istio.io/v1.15/blog/2021/proxyless-grpc/
* `dubbo-xds`实现源码:https://github.com/apache/dubbo-spi-extensions/tree/master/dubbo-xds
* `envoy server`端`Java`实现:https://github.com/envoyproxy/java-control-plane
* `envoy server`端`Go`实现:https://github.com/grpc/grpc-go/blob/master/test/xds/xds_server_integration_test.go
Contributor guide
Assessment
This issue has not been assessed yet.