编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

Gloo学习过程(奔驰glc学习)

wxchong 2024-08-16 06:09:28 开源技术 10 ℃ 0 评论

云和安全管理服务专家新钛云服 杨波原创


目录

Gloo学习资源:

引言:

Architechture(架构)

  • Component Architechture
  • Discovery Architechture
  • Deployment Architecture

Concepts(核心概念)

  • Virtual Services
  • Routes
  • Matchers
  • Destinations
  • Upstreams
  • Functions
  • Secrets

Traffic Management

  • Gloo Configuration
  • PetStore精确匹配
  • Prefix前置匹配
  • regex正则匹配
  • 删除route
  • Header路由
  • Query Parameter路由
  • Method路由

Transformations

  • transformationTemplate
  • Update Response Code
  • Extrac Query Parameters
  • Update Request Path


Gloo学习资源:


Gloo最新发布:

https://docs.solo.io/gloo-edge/latest/

Gloo官网:

https://docs.solo.io/gloo-edge

企业版:

https://www.solo.io/products/gloo-edge

版本对比:

https://www.solo.io/wp-content/uploads/2021/06/Solo_Edge_Feature_Comparison_061621_v3.pdf

github:

https://github.com/solo-io/gloo

https://github.com/solo-io/envoy-gloo

开发手册:


https://docs.solo.io/gloo-edge/latest/guides/dev

https://docs.solo.io/gloo-edge/latest/reference/api

介绍和演示:

https://www.youtube.com/playlist?list=PLBOtlFtGznBiN5dZmaYsP-VxoVxOdxsVq

官方演示教程:

https://docs.solo.io/gloo-edge/latest/guides/traffic_management/hello_world

多种部署方式:

https://docs.solo.io/gloo-edge/latest/installation/gateway

安装核心脚本:

https://run.solo.io/gloo/install

https://storage.googleapis.com/solo-public-helm

https://raw.githubusercontent.com/solo- io/gloo/v1.2.9/example/petstore/petstore.yaml

部署参考:

https://www.lijiaocn.com/%E9%A1%B9%E7%9B%AE/2019/05/21/apigateway-base-envoy-compare-gloo.html

源代码框架分析参考:

https://www.lijiaocn.com/%E9%A1%B9%E7%9B%AE/2019/05/28/apigateway-gloo-deep-search.html


引言:


gloo edge是基于envoy proxy之上的API网关项目,是一个相对独立的系统,支持的平台较多(传统服务、ingress、knative、labmda等),独特之处是在网关的基本功能外,设计了自动发现的函数路由功能,缺点是有开源版和商业版之分,一些高级功能(高级认证、高级定制化限速和人性化管理UI等)只有商业版具备。

初步分析代码结构和依赖,目前相关的项目有两个:gloo edge和envoy gloo,前者主要是go语言开发,插件化设计比较先进和丰富,后者是基于envoy之上的filter能力增强等,主要是C++语言开发,总体来说各种插件和定制化开发入手难度中等,另外一个比较好的优点是文档等参考资料比较全面。


Architechture(架构)


Gloo通过Envoy XDS gRPC API来动态更新Envoy配置, 更方便的控制Envoy Proxy, 并保留扩展性..本质是一个Envoy xDS配置翻译引擎, 为Envoy提供高级配置(及定制的Envoy过滤器).它监控各种配置源的更新,并立即响应通过gRPC更新给Envoy。


Component Architechture



· Config Watcher: 监控Upstreams和Virtual Services配置变化.

· Secret Watcher: 监控敏感信息的配置变化,比如SSL配置信息.

· Endpoint Discovery: 服务注册和自动发现.

如上图kubenetes的Upstream自动发现机制: 通过自己的插件把注册信息写到Endpoint Discovery中,然后Gloo监控它变化,并把这些信息通过自己翻译引擎(Translation Engine)成一个完整的xDS Server快照,传给Envoy,让他构建这个服务的路由规则及过滤器设置.

· Reporter:会收集翻译引擎处理的所有Upstream及Vritual service验证报告.任何无效的配置对象都会反馈给用户.无效的对象会被标记为"Rejected",并在用户配置中给出详细的错误信息.


Discovery Architechture


Gloo支持k8s, consul的Upstream discovery, 还要以自己开发自定义的组件。


Deployment Architecture


Gloo可以在各种基础设施上以多种方式部署, 推荐是使用kubernets,它可以简化操作.但并不一定要部署在kubernets上.

可到官网查看更多的部署方式。


Concepts(核心概念)


通过下面这个简单的vritual services来理解gloo的核心概念:


Virtual Services


· 将一组路由规则规范在某个或多个域(domains)下面.

· Gloo会建一个默认的virtualService是 default, 它会和*域名匹配.这会把header中没有Host(:authority)字段的请求,及那些不会找不到路由的请求都路由到这个域下面.

· VirtualService都在同一个Gloo必须是唯一的,否则找不到路由.

· 绝大多数实例使用中,让所有路由都放在一个VirtualService下就足够了,Gloo也会使用同一套路由规则来处理请求.如果只有一个VirtualServics时,会忽略header中的Host或:authority头部信息.


Routes


· Routes是VritualServices的核心组成.如果请求与路由上的matcher匹配了,那么它就把请求路由到对应的目的地上.路由由一系列的匹配规则(a list of matchers)及各种目的地组成.

o a single destination 一个目地的。

o a list of weighted destinations 一组有权重的目地的。

o **an upstream group ** 一组upstream。


· 因为多个matcher可以匹配一个请求,所以路由的先后顺序很重要.Gloo会选择第一个与请求匹配的路由.所以必须把匹配任何路径(像自定义的404页面)请求,放在路由列表的最后面.


Matchers


Matchers支持2种请求类型:

· HTTP requests中的请求属性: 对HTTP 来说就是: path, method, header, query parameters, 对应的HTTP2.0 就是header中的:path, :method属性.

· HTTP events根据CloudEvents规范匹配HTTP事件属性.但CloudEvents 规范还处于 0.2 版本,将来会有更改。Event Matcher目前唯一匹配的属性是事件的事件类型(由 x-event-type 请求头指定)


Destinations


· 匹配路由后,要将请求转发到Destinations,它可指向单一的目的地,也可以将路由流量分成到一系列加权的目地的上(a series of weighted destinations).

· Desinations可以是Upstream destination也可以是Function destination.

· Upstream destination类似于Evnoy集群.

· Function destination: Gloo支持将请求路由到各种Upstream中的函数中.函数可以是无服务器的函数调用(Lambda, Google Cloud Function)也可以是REST API OPENAPI, XML/SOAP请求.还可以发布到消息队列中.


Upstreams


Upstreams定义了路由规则最终去向(Destinations).一般是通过服务发现(services discovery)自动加入,最基本的Upstream类型就是静态的Upstream: 它只需要告诉Gloo一个静态主机或dns名列表.复杂的Upstream有kubernets及AWS lambda upstream。


一个简单的Upsteams例子



· name: 如何在Gloo中找到这个upstream.是一个标识符。

· spec: kubernetes插件的serviceName,serviceNamespaces,Gloo路由时需要用到。


Functions


有些Upstream支持函数destinations, 比如: 我们可以在Upstream中添加一些HTTP函数.让Gloo根据这些函数把检验请求参数,然后将传入的请求格式化为Upstream服务所期望的参数.一个简单的示例:


调用curl http://url/petstore/findWithId/100会路由到函数findPetById(id)中,其中Id的是通过parameters中的规则赋值的.


Secrets


· 某些插件(如AWS Lambda Plugin)需要使用secrets来进行身份验证,配置SSL证书和其它不应该存储在明文配置的数据.

· Gloo运行一个独立的(gorutine)控制器来保护Secrets.它有自己的storage layer.


Traffic Management


Gloo核心是一个强大的路由引擎.可以处理API到API的简单路由。

也可以处理HTTP到gRPC协议转换.

1

Request -> Router -> Destinations(Upstream)


得益于envoy proxy灵活的扩展性,gloo中在上面每一个环节中支持的类型都非常多样. 下面以HTTP REST API为例子,演示一下基础路由功能。


Gloo Configuration


Gloo配置布局分3层: Gateway listeners, Virtual Services, Upstreams.大多数情况,我们只与VirtualServices进行交互.可以通过它配置暴露给Gateway的API细节,还可以配置具体的路由规则. Upstream代表后端服务, Gateway控制监听端口,请求的入口.


PetStore精确匹配

Prefix前置匹配

regex正则匹配

删除route

Header路由

Query Parameter路由

Method路由


Transformations


Gloo可以在请求到达到指定的Service前把请求进行任意修改(requestTransformation),也可以在应答返回给Client之前把应答进行任意修改(responseTransformation).

Transformations属性定义在Virtual Services, 你可以在它的VritualHosts, Routes, WeightedDestionations的属性下定义Transformations, 它们的格式都是一样的.唯一的区别是作用的范围大小不一样.所有的子属性都会受到对应的transformations影响.如果你要同时在VritualHostsRoutes都定义了2个transformations,那Routers不会合并VritualHosts,两者各不影响。

1

2

3

4

transformations:

clearRouteCache: bool

requestTransformation: {}

responseTransformation: {}


· clearRouterCache: 有时transformation会改变路由比如改了path后不应该再到这个路由条件下)后,如果设置为true,则在改变后会重新(根据新的path)找路由,如果是false,则还是走转换前的路由.默认为false.

· requestTransformationresponseTransformation一样的格式,处理方法也是一样的.他有两种形式

o headerBodyTransform: 把所有的header内容json的形式都写到body里面.分成headersbody字段.

o transformationTemplate: 使用转换模板.这是最灵活的.下面会详细介绍属性.


transformationTemplate


Templates是Transformation的核心,本质就是利用上面这几个关键字对Request/Response的所有内容进行任意转换,写出一个你想要的转换函数API.

· parseBodyBehavior: 默认为**ParseAsJson, **json的方式解析body , DontParse: 以`plain text的方式处理.

· ignoreErrorOnParse: 解析body为json时出错是否抛出异常, 默认为false.即抛出异常.

· extractors: 可以提出header及body里面的值作为变量,相当于定义变量,然后变量赋值.

· headers : 注意这里的headers不是extractors中的header, extractors是取值给变量,这里是把变量转换到请求/应答中的头中.

· body: 注意这里的body不是extractors中的body, extractors是取值给变量,这里是把变量转换到请求/应答中的body中.

· passthrough: 完全不想处理body,则设置它为true,这和parseBodyBehavior里面的DontParse有区别.如果完全不想管body,则设置为true, DontParse是以plain text处理.

· mergeExtractorsToBody: 他会把所有extrations得到的变量都合并到body里面.比如:

· dynamicMetadataValues: 动态设置metadata值.因为内置的这些函数和extractor值只能在TransformationTemplate中使用,有时我们需要其它的地方使用,这时间就要需要把在template中得到值赋值到动态的metadata中, 动态的metadata是可以全局使用的.比如:

· 内置函数

除了支持https://pantor.github.io/inja/里面的模板函数,可以写循环,if,math计算.还有gloo自定义函数:

o header(header_name):返回header中叫header_name的值.

o extraction(extraction_name):返回extraction中叫extraction_name的值.

o env(env_var_name):返回环境变量值

o body():返回body.

o context():以json的方式返回所有的上下文(几乎是所有信息了,你打出来一看就知道了)。


Update Response Code

Extrac Query Parameters

Update Request Path

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表