openyurt源码分析系列(一):YurtHub

YurtHub的功能主要是对客户端Request的反向代理。本文基于Openyurt0.3版本(commit:e1c1651405aeeb61f0ad264a9acdf8d08e917a4d)的源码,提供了对反向代理功能的解析(不包括YurtHub的本地缓存管理:CacheManager,storage和GC)。

YurtHubServer是执行ListenAndServe的主体,其主要结构和功能是YurtReverseProxy,即边缘节点的反向代理。YurtHubServer将YurtReverseProxy挂载在几乎所有路径(以/为前缀的路径,但也有一些路径另作他用)上,当HTTP请求的URL路径满足条件就会交由YurtReverseProxy处理,但在此之前会对request通过context添加一些额外的信息。

YurtHubServer挂载的路径,方法和handler的对应关系:

其中:

updateToken是用来更新节点的证书。

healthz是直接返回StatusOK,用于其它节点对本节点的健康检查。

proxyHandler提供其主要的反向代理功能。

YurtHubServer在接收到HTTPrequest后,在通过YurtReverseProxy转发前,会先对request进行处理。流程如下:

在这之后才会将request转交给YurtReverseProxy。

其构造handler的函数源码如下:

代理来自边缘节点(Kubelet,Kube-Proxy等)的REST请求,根据APIServer的健康状况,如果健康则将该请求通过LoadBalancer转发到APIServer处理,否则在本地节点LocalProxy中进行处理。最后将reponse返回给请求方。

YurtReverseProxy内有:

结构体如下:

typeyurtReverseProxystruct{resolverapirequest.RequestInfoResolverloadBalancerremote.LoadBalancerlocalProxy*local.LocalProxycacheMgrcachemanager.CacheManagermaxRequestsInFlightint//用来限制pendingrequest数量的上限stopCh<-chanstruct{}}YurtReverseProxy工作流程作为YurtHubServer的一个组件,它接受YurtHubServer指定Path(除了/v1/token,/v1/healthz和一些/debug下的路径外)的request,并进行处理。

通过LoadBalancer判断APIServer的健康状况,如果健康则调用LoadBalancer处理请求,否则调用LocalProxy处理请求。

具体源码如下:

Next:

在APIServer处于健康状态时,LoadBalancer接收来自YurtReverseProxy的request,并转发到APIServer。LoadBalancer中记录了多个能处理request的APIServer的地址,在转发request时会采取一定的负载均衡策略。

LoadBalancer内主要有APIServer代理列表([]*RemoteProxy)和负载均衡策略(loadBalancerAlgo)。APIServer代理(RemoteProxy)代理一个能处理request的APIServer。LoadBalancer根据设置的负载均衡策略,挑选一个APIServer代理,将request通过APIServer代理转发到APIServer。

typeloadBalancerstruct{backends[]*RemoteProxyalgoloadBalancerAlgocertManagerinterfaces.YurtCertificateManager}RemoteProxy的结构RemoteProxy内置有

源码如下:

目前LoadBalancer中内置了两种负载均衡策略:Round-Robin和基于优先级的策略。一个LoadBalancer采用哪种负载均衡策略在创建时由lbMode参数指定:rr表示Round-Robin,priority表示基于优先级的调度策略。默认使用的Round-Robin。LoadBalancer统一通过策略的PickOne()接口来选出一个能够转发请求的APIServer。

策略结构

typeloadBalancerAlgointerface{PickOne()*RemoteProxyName()string}Roud-Robin策略原理

如果没有健康的APIServer,则返回nil。否则通过不回退的轮询来找到第一个健康的APIServer。

轮询部分的源码:

hasFound:=falseselected:=rr.next//next是上次轮询的终点位置//rr.backends是记录的所有APIServer的序列fori:=0;i

使用基于优先级的策略时,需要手动按优先级将APIServer序列排序。策略本身的实现是从头开始的轮询。

实现源码:

在APIServer非健康状态下,接受来自YurtReverseProxy的request,并根据本地缓存和request的内容进行处理。目前只支持ResourceRequest。处理内容主要是根据ResourceRequest中对资源的操作类型(verb)来更新本地缓存。

LocalProxy内有:

//LocalProxyisresponsibleforhandlingrequestswhenremoteserversareunhealthytypeLocalProxystruct{cacheMgrmanager.CacheManagerisHealthyIsHealthy}LocalProxy的处理流程在Response.Header中设置Transfer-Encoding:chuncked,以长连接处理watch请求。然而目前LocalProxy并不支持本地处理watch,因此直到Timeout都在周期性探测APIServer是否健康,如果感知到APIserver恢复健康则直接返回nil,下次watch将由LoadBalancer处理。

如果请求的resource是event,则调用CacheManager.CacheResponse将请求的内容缓存到本地。并总会返回一个response,header和body与request相同,状态码为201(StatusCreated)。

LocalProxy不支持对resource的delete请求,因此返回的Response的Reason为”Forbidden”,状态码为200(StatusOK)。

根据request中的信息生成key,调用CacheManager.QueryCache根据key找到缓存中的runtime.object(s),将其写入response并返回。

THE END
1.开源游戏服务器引擎goworld源码解析11gate这段代码是gate的主入口文件。它主要负责初始化和启动游戏服务器的各个组件,包括解析命令行参数、设置日志、初始化网络服务、连接到调度器集群等。 以下是代码的主要功能和流程: 命令行参数解析:使用flag包解析命令行参数,包括gateid(网关ID)、configFile(配置文件路径)、logLevel(日志级别)和runInDaemonMode(是否以守https://blog.csdn.net/gengkunpeng/article/details/145415212
2.服务器部署codeserver腾讯云开发者社区将源码下载到服务器并解压 [button color="success" url="https://github.com/coder/code-server/releases/" outline="" target="_blank"]源码下载地址[/button] 第二步 在终端中打开解压的目录并执行下列命令,即可访问网页,访问地址为:你的公网ip:端口 https://cloud.tencent.com/developer/article/2447416
3.codeserver.zip码农集市源码下载平台codeserver是一个开源项目,它允许用户在浏览器中运行Visual Studio Code(VS Code)。通过codeserver,用户可以在任何设备上使用浏览器访问VS Code的功能,无需在本地安装VS Code。这为用户提供了更大的灵活性和便利性。codeserver的工作原理是将VS Code的服务器端运行在云端或本地服务器上,用户通过浏览器访问该服务器https://code.coder100.com/index/index/content/id/57566
4.serverOAuth2AuthorizationCodeAuthenticationProvider源码import org.springframework.security.oauth2.server.authorization.OAuth2Authorization; import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationCode; import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService; https://www.seaxiang.com/blog/333ee9660e7c4b84af9a603d61209020
5.深入理解Electron(二)VSCode架构探索背景说起建立在Electron之上以上是VS Code源码的核心组织架构。通过code和server作为入口,workbench作为主框架,而editor、platform和base则成为这个庞大应用的基石。 由于VSCode本身同时提供面向浏览器的版本和客户端的版本,所以在二级目录下整体的目录结构又是跟所支持的目标平台环境有关: https://article.juejin.cn/post/7205044806275743801
6.codeVisual Studio Code(简称 vscode)是一款由微软开发且跨平台的免费源代码编辑器,结合插件能够用于多种语言程序开发(如 python, java, javascript, go 等)。但是其属于一款客户端软件,在远程服务器上使用不如 code-server,code-server 是一款能够在网页上使用的 vscodehttps://xujinzh.github.io/2024/04/10/install-code-server/
7.Codeserver在线IDE部署骑着蜗牛路过你的风景下载源码包,运行.install.sh 但是好像没有运行起来,不清楚原因 使用docker部署 dockerpull codercom/code-serverdockerrun-d-p8888:8080--envPASSWORD=WZS134125--namecode-server codercom/code-serverdockerstart code-server# 运行服务http://59999.316.18.54:8888 https://www.cnblogs.com/chuck-study/p/15267350.html
8.浅谈VisualStudio和VisualStudioCode(VSCode)的区别及如何选择VS Code 本身是使用Electron shell、Node.js、TypeScript和Language Server协议构建的,并且每月更新一次。扩展会根据需要经常更新。支持的丰富程度因不同的编程语言及其扩展而异,从简单的语法突出显示和括号匹配到调试和重构。 VS Code 存储库中的代码在 MIT 许可证下是开源的。VS Code 产品本身在标准Microsoft 产品许https://www.jb51.net/program/3224958u3.htm
9.codeserver配置codeserver部署Code-server是由Coder基于VS Code开发的在线编辑器,通俗来讲,就是把VS Code搬到了浏览器上,Code-Server作为Web IDE的存在,可以实现随时随地的写代码。 code-server的优势 随时随地编写代码:使用一致的开发环境,在多种设备上设置代码,然后通过Web浏览器从任何设备中获取 https://blog.51cto.com/u_16213653/10739826
10.SqlMetal.exe(代码生成工具)/conn:<连接字符串>指定数据库连接字符串。 不能与/server、/database、/user或/password选项一起使用。 不要在连接字符串中包含文件名, 而应将文件名作为输入文件添加到命令行中。 例如,下一行命令将“c:\northwnd.mdf”指定为输入文件:sqlmetal /code:"c:\northwind.cs" /language:csharp "c:\northwnd.mdhttps://msdn.microsoft.com/zh-cn/library/bb386987
11.codeserver:codecurl -fsSL https://code-server.dev/install.sh | sh When done, the install script prints out instructions for running and starting code-server. Note To manage code-server for a team on your infrastructure, see: coder/coder We also have an in-depth setup and configuration guide. Questionshttps://gitee.com/mirrors/code-server/
12.coder/codeserverInnerStackPaaSEngine插件安装 使用内置 Terminal 终端 注: 更多的操作信息请参考code.visualstudio.com 申明 InnerStack/AppCenter 旨在助力企业构建自主 PaaS 平台,InnerStack 自身AppCenter 包含的第三方项目源码统一开放在https://github.com/inpackhttps://www.sysinner.cn/gdoc/view/app-guide/coder/code-server.md
13.spice源码分析之server(1)图1是spice服务器的核心架构,贯穿整个源码的组织结构. 值得一提的是,spice server是作为一个库提供给qemu使用的,编译出来就是libspice,所以代码中没有main函数. 下面我们先了解一个server源码中使用到的一些核心概念,在看源码之前推荐大家先看一遍Spice入门,否则理解代码中的某些核心概念会很吃力. https://www.jianshu.com/p/89c22926c2e9
14.opcworkshop完全开源的,OPCserver源代码,比lightOPC更容易看opcsvrsdk开发包包含如下内容: demo/ 例程,利用本开发包和C++开发OPC Server的例程 bin/ 编译好的opcsvrtst.exe例子OPC Server opcsvrtst/ opcsvrtst例子OPC Server的VC9源码工程 opcclinet/ OPC客户端测试工具,供参考 sdk/ opcdasvr.dll和opcdasvr.h以及方便开发的辅助C++源码 wopc3tst/ opc da3.0 的IOPCIthttps://www.iteye.com/resource/leevideom-10120659
15.CODEMAP源代码阅读器下载2025最新pc版在底层,codemap通过支持vscode的lsp(language server protocol)协议,使得codemap具有各种语言的语法解析能力,方便用户能快速跳转、查看源代码。现目前,codemap通过融合各类插件,已经完美支持js、ts、c、c++、java、golang、python等多种主流语言,未来codemap还计划支持更多语言。 http://www.onlinedown.net/soft/10130937.htm
16.TiDB7.x源码编译之TiDBServer篇,及新特性详解(文末彩蛋本文将延续本系列文章,介绍如何编译 TiDB Server 源码。以及,阐释 TiDB Server 7.x 的部分新特性。 News !!! TiDB v7.5.0 LTS 计划于 2023-11-23 正式 Release[1],目前代码虽未冻结,但已经可以看到 Alpha 版本的 Code 了,本文代码将以v7.5.0-alpha为基准。 https://cn.pingcap.com/article/post/11893.html
17.云途车规MCU软件开发环境搭建及使用详解Tips:可以通过全局搜索工具,比如everyting搜索“JLinkGDBServerCL.exe”确定: 以上配置信息,将被生成保存到应用工程的./vscode/launch.json配置文件中: 3.2.2 YCT代码生成选项(Code Generate)配置 Code Generate用于控制YCT的代码生成行为,主要配置选项包括: https://www.shangyexinzhi.com/article/11765924.html
18.CodeProjectFor those who code; Updated: 5 Feb 2025https://www.codeproject.com/