当前位置: 首页 > news >正文

专业商城网站建设多少钱郑州网站建设公司排名

专业商城网站建设多少钱,郑州网站建设公司排名,设计师培训学校排行榜,天河网站建设服务简介#xff1a; 阿里云边缘容器服务上线 1 年后#xff0c;正式开源了云原生边缘计算解决方案 OpenYurt#xff0c;跟其他开源的容器化边缘计算方案不同的地方在于#xff1a;OpenYurt 秉持 Extending your native Kubernetes to edge 的理念#xff0c;对 Kubernetes 系…简介 阿里云边缘容器服务上线 1 年后正式开源了云原生边缘计算解决方案 OpenYurt跟其他开源的容器化边缘计算方案不同的地方在于OpenYurt 秉持 Extending your native Kubernetes to edge 的理念对 Kubernetes 系统零修改并提供一键式转换原生 Kubernetes 为 OpenYurt让原生 K8s 集群具备边缘集群能力。 作者 | 何淋波新胜 来源 | 阿里巴巴云原生公众号 OpenYurt延伸原生 K8s 的能力到边缘 阿里云边缘容器服务上线 1 年后正式开源了云原生边缘计算解决方案 OpenYurt跟其他开源的容器化边缘计算方案不同的地方在于OpenYurt 秉持 Extending your native Kubernetes to edge 的理念对 Kubernetes 系统零修改并提供一键式转换原生 Kubernetes 为 OpenYurt让原生 K8s 集群具备边缘集群能力。 同时随着 OpenYurt 的持续演进也一定会继续保持如下发展理念 非侵入式增强 K8s保持和云原生社区主流技术同步演进 OpenYurt 如何解决边缘自治问题 想要实现将 Kubernetes 系统延展到边缘计算场景那么边缘节点将通过公网和云端连接网络连接有很大不可控因素可能带来边缘业务运行的不稳定因素这是云原生和边缘计算融合的主要难点之一。 解决这个问题需要使边缘侧具有自治能力即当云边网络断开或者连接不稳定时确保边缘业务可以持续运行。在 OpenYurt 中该能力由 yurt-controller-manager 和 YurtHub 组件提供。 1. YurtHub 架构 在之前的文章中我们详细介绍了 YurtHub 组件的能力。其架构图如下 图片链接 YurtHub 是一个带有数据缓存功能的“透明网关”和云端网络断连状态下如果节点或者组件重启各个组件kubelet/kube-proxy 等将从 YurtHub 中获取到业务容器相关数据有效解决边缘自治的问题。这也意味着我们需要实现一个轻量的带数据缓存能力的反向代理。 2. 第一想法 实现一个缓存数据的反向代理第一想法就是从 response.Body 中读取数据然后分别返回给请求 client 和本地的 Cache 模块。伪代码如下 func HandleResponse(rw http.ResponseWriter, resp *http.Response) {bodyBytes, _ : ioutil.ReadAll(resp.Body)go func() {// cache response on local diskcacher.Write(bodyBytes)}// client reads data from responserw.Write(bodyBytes) } 当深入思考后在 Kubernetes 系统中上述实现会引发下面的问题 问题 1流式数据需要如何处理(如: K8s 中的 watch 请求)意味 ioutil.ReadAll() 一次调用无法返回所有数据。即如何可以返回流数据同时又缓存流数据。问题 2同时在本地缓存数据前有可能需要对传入的 byte slice 数据先进行清洗处理。这意味着需要修改 byte slice或者先备份 byte slice 再处理。这样会造成内存的大量消耗同时针对流式数据到底申请多大的 slice 也不好处理。 3. 优雅实现探讨 针对上面的问题我们将问题逐个抽象可以发现更优雅的实现方法。 问题 1如何对流数据同时进行读写 针对流式数据的读写(一边返回一边缓存)如下图所示其实需要的不过是把 response.Body(io.Reader) 转换成一个 io.Reader 和一个 io.Writer。或者说是一个 io.Reader 和 io.Writer 合成一个 io.Reader。这很容易就联想到 Linux 里面的 Tee 命令。 而在 Golang 中 Tee 命令是实现就是io.TeeReader那问题 1 的伪代码如下 func HandleResponse(rw http.ResponseWriter, resp *http.Response) {// create TeeReader with response.Body and cachernewRespBody : io.TeeReader(resp.Body, cacher)// client reads data from responseio.Copy(rw, newRespBody) } 通过 TeeReader 的对 Response.Body 和 Cacher 的整合当请求 client 端从 response.Body 中读取数据时将同时向 Cache 中写入返回数据优雅的解决了流式数据的处理。 问题 2如何在缓存前先清洗流数据 如下图所示缓存前先清洗流数据请求端和过滤端需要同时读取 response.Body2 次读取问题。也就是需要将 response.Body(io.Reader) 转换成两个 io.Reader。 也意味着问题 2 转化成问题 1 中缓存端的 io.Writer 转换成 Data Filter 的 io.Reader。其实在 Linux 命令中也能找到类似命令就是管道。因此问题 2 的伪代码如下 func HandleResponse(rw http.ResponseWriter, resp *http.Response) {pr, pw : io.Pipe()// create TeeReader with response.Body and Pipe writernewRespBody : io.TeeReader(resp.Body, pw)go func() {// filter reads data from response io.Copy(dataFilter, pr)}// client reads data from responseio.Copy(rw, newRespBody) } 通过 io.TeeReader 和 io.PiPe当请求 client 端从 response.Body 中读取数据时Filter 将同时从 Response 读取到数据优雅的解决了流式数据的 2 次读取问题。 YurtHub 实现 最后看一下 YurtHub 中相关实现由于 Response.Body 为 io.ReadCloser所以实现了 dualReadCloser。同时 YurtHub 可能也面临对 http.Request 的缓存所以增加了 isRespBody 参数用于判定是否需要负责关闭 response.Body。 // https://github.com/openyurtio/openyurt/blob/master/pkg/yurthub/util/util.go#L156 // NewDualReadCloser create an dualReadCloser object func NewDualReadCloser(rc io.ReadCloser, isRespBody bool) (io.ReadCloser, io.ReadCloser) {pr, pw : io.Pipe()dr : dualReadCloser{rc: rc,pw: pw,isRespBody: isRespBody,}return dr, pr }type dualReadCloser struct {rc io.ReadCloserpw *io.PipeWriter// isRespBody shows rc(is.ReadCloser) is a response.Body// or not(maybe a request.Body). if it is true(its a response.Body),// we should close the response body in Close func, else not,// it(request body) will be closed by http request callerisRespBody bool }// Read read data into p and write into pipe func (dr *dualReadCloser) Read(p []byte) (n int, err error) {n, err dr.rc.Read(p)if n 0 {if n, err : dr.pw.Write(p[:n]); err ! nil {klog.Errorf(dualReader: failed to write %v, err)return n, err}}return }// Close close two readers func (dr *dualReadCloser) Close() error {errs : make([]error, 0)if dr.isRespBody {if err : dr.rc.Close(); err ! nil {errs append(errs, err)}}if err : dr.pw.Close(); err ! nil {errs append(errs, err)}if len(errs) ! 0 {return fmt.Errorf(failed to close dualReader, %v, errs)}return nil } 在使用 dualReadCloser 时可以在httputil.NewSingleHostReverseProxy的modifyResponse()方法中看到。代码如下 // https://github.com/openyurtio/openyurt/blob/master/pkg/yurthub/proxy/remote/remote.go#L85 func (rp *RemoteProxy) modifyResponse(resp *http.Response) error {rambohe-ch, 10 months ago: • hello openyurt// 省略部分前置检查 rc, prc : util.NewDualReadCloser(resp.Body, true)go func(ctx context.Context, prc io.ReadCloser, stopCh -chan struct{}) {err : rp.cacheMgr.CacheResponse(ctx, prc, stopCh)if err ! nil err ! io.EOF err ! context.Canceled {klog.Errorf(%s response cache ended with error, %v, util.ReqString(req), err)}}(ctx, prc, rp.stopCh)resp.Body rc } 总结 OpenYurt 于 2020 年 9 月进入 CNCF 沙箱后持续保持了快速发展和迭代在社区同学一起努力下目前已经开源的能力有 边缘自治边缘单元化管理云边协同运维一键式无缝转换能力 同时在和社区同学的充分讨论下OpenYurt 社区也发布了2021 roadmap欢迎有兴趣的同学来一起贡献。 原文链接 本文为阿里云原创内容未经允许不得转载。
http://www.yutouwan.com/news/207763/

相关文章:

  • 如何把网站放在根目录那些网站分享pr做的视频软件
  • 在国外做电商网站云南省文山建设厅网站
  • 网站建设优化扬州贵州网站建设公司推荐
  • 徐州模板建站系统ui设计素材
  • 化妆品企业网站建设的缺点网站最好推广的方式
  • 成都高新网站建设内蒙古高端网站建设
  • 申请企业资助建设网站seo优化在哪里学
  • 网站的模块企业网站建设公司 末路
  • 如何做app 的模板下载网站网站建设费用评估
  • 虚拟主机空间发布网站外贸网站建设优化
  • 直播间网站建设网上怎么样挣钱
  • 给设计网站做图互联网行业简介
  • 做网站用什么程序比较好发布出租信息免费的网站
  • 淘宝店网站论坛怎么做免费网站访客qq统计系统
  • 水果网站建设案例龙华网站建设的基本步骤
  • 南通集团网站建设海网站建设生产厂家哪家好
  • 做缓网站网站高中建设工具
  • 个人营销网站id中怎么链接wordpress
  • 百度推广做的网站可以用吗东莞是哪个省
  • 报网站开发培训班最好的网站设计公
  • 网站设计专业简单的网站建设公司的模板下载
  • 电子商务网站建设与管理程序设计题深圳市企业名录
  • 徐州建设企业网站手机网站php开发
  • 嘉兴制作企业网站广州网站推广找哪家
  • 视频播放类网站建设费用企业注册很多网站的好处
  • 深圳网站建设联雅网络推广渠道方案
  • 北京网站优化步宁波网站设计推广服务公司
  • 做网站要注意哪些竞价广告是什么意思
  • app开发学习网站河南省建设厅网站无事故证明
  • 网站logo设计在线生成上海公司牌照价格走势