自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(145)
  • 收藏
  • 关注

原创 如何开发一个wasm插件

开发 WASM 插件,理论上可以采用任何开发语言。目前已有不同语言实现的 Envoy Proxy WASM SDK 可供使用,如:proxy-wasm-cpp-sdkproxy-wasm-rust-sdkAssemblyScriptproxy-wasm-go-sdkpackage testimport ( "github.com/tetratelabs/proxy-wasm-go-sd...

2024-10-11 09:09:53 395

原创 wasm在ebpf领域的运用

Wasm 最初是以浏览器安全沙盒为目的开发的,我们之前讲到了,很多云原生领域也已经开始使用wasm的能力来做插件化扩展。随着 eBPF 的兴起,它使云原生开发人员能够构建安全的网络、服务网格和多种可观测性组件,并且它也在逐步渗透和深入到内核的各个组件,提供更强大的内核态可编程交互能力。...

2024-10-09 08:42:39 158

原创 wasm在可观测领域的运用

我们知道deepflow是当前业内比较流行的无侵入可观测平台,为了提高deepflow的扩展性,deepflow也引入了wasm插件机制来让用户自己对观测内容的处理。wasm实现机制下面我们来看下deepflow的具体实现wasm-go-sdkdeepflow也定义了自己的一套wasm abi接口,并提供了go版本的sdk:https://github.com/deepflowio/deepflo...

2024-10-07 08:52:58 517

原创 wasm在云原生领域的运用

Wasm 最初是以浏览器安全沙盒为目的开发的,发展到目前为止,WebAssembly 已经成为一个用于云原生软件组件的高性能、跨平台和多语言软件沙箱环境,Wasm 轻量级容器也非常适合作为下一代无服务器平台运行时Envoy 社区在 Envoy 中嵌入了 WASM 虚拟机以获得一个安全的沙箱环境,用于动态加载和运行可拔插的扩展代码(被编译为 WASM 字节码),简化 Envoy 二次开发和功能增强的...

2024-10-06 16:54:49 656

原创 wasm虚拟机介绍

官网对 Wasm 的定义 ——Wasm 是基于栈式虚拟机的二进制指令格式。也就是说 Wasm 不仅仅是一门编程语言,也是一套虚拟机体系结构规范。那么什么是虚拟机,什么又是栈式虚拟机呢?虚拟机概念虚拟机是软件对硬件的模拟,借助操作系统和编译器提供的功能模拟硬件的工作,这里主要指对硬件 CPU 的模拟。虚拟机执行指令主要有以下 3 个步骤:取指—从程序计数器 PC 指向指令流中的地址获取指令译码—判...

2024-10-04 13:47:00 1036

原创 【Temporal】日志打印控制

开启server日志级别首先我们从代码出发看看应该怎么开启,进入到temporal server的启动入口:temporal/cmd/server/main.gologger := log.NewZapLogger(log.BuildZapLogger(cfg.Log))logger.Info("Build info.", tag.NewTimeTag("git-time", build....

2024-09-21 11:44:50 480

原创 【Temporal】方法规范

在workflow或者childWorkflow的方法代码中,不能使用golang的一些库方法,比如sleep,go协程等,必须使用其对应的封装方法,比如对应关系如下:time.Sleep -> workflow.Sleepgo xx -> workflow.Go(xx)这是因为workflow或者childWorkflow代码是在workflow的线程或者协程中调度的,任务的控制不能...

2024-09-17 10:53:15 375

原创 【Temporal】配额控制类配置

配置检查代码入口:temporal/service/history/workflow/context.gofunc (c *ContextImpl) maxHistorySizeExceeded() bool { namespaceName := c.GetNamespace().String() historySizeLimitWarn := c.config.HistorySize...

2024-09-16 10:35:45 509

原创 【Temporal】监控系统搭建

对于temporal这样一个比较复杂的调度系统来说,指标监控是必不可少的,好在temporal也提供了一系列的指标监控方式来使用,下面我们就一步步来看看怎么构造temporal的监控系统。安装prometheus这里我们将其部署到k8s集群上,简单的示例如下主要是yaml资源文件的编写:---apiVersion: v1kind: ConfigMapmetadata: name: pro...

2024-09-15 09:34:22 615

原创 【Temporal】执行childWorkflow的工作流程分析

这里主要简单介绍下执行一个child workflow的工作流程,通过源码来分析分析。源码路径:temporal-go/internal/workflow.go客户端调用首先我们通过客户端调用方法入口进入,通过方法调用找到主要的逻辑入口:func (wc *workflowEnvironmentImpl) ExecuteChildWorkflow( params ExecuteWorkflo...

2024-09-08 09:41:51 343

原创 【Temporal】启动workflow流程分析

这里主要分析下通过temporal的sdk创建一个workflow的流程客户端代码源码入口:temporal-go/internal/internal_workflow_client.gofunc (w *workflowClientInterceptor) ExecuteWorkflow( ctx context.Context, in *ClientExecuteWorkflowI...

2024-09-02 08:44:45 402

原创 【Temporal】Worker启动流程

代码入口:temporal-go.sdk/internal/internal_worker.goworker启动// Start the worker in a non-blocking fashion.func (aw *AggregatedWorker) Start() error { aw.assertNotStopped() if err := initBinaryCheck...

2024-09-01 08:39:51 344

原创 【Temporal】Worker任务流控

拉取任务流控代码入口:temporal-go/internal/internal_worker_base.gofunc (bw *baseWorker) Start() { if bw.isWorkerStarted { return } bw.metricsHandler.Counter(metrics.WorkerStartCounter).Inc(1)...

2024-08-31 14:31:55 330

原创 【Temporal】Server任务执行流程

执行任务通过fx.invoke我们可以找到任务的执行入口:代码路径:temporal/service/history/replication/fx.go通过调用关系,我们找到关键的入口方法如下:func (s *SequentialScheduler[T]) Start() { if !atomic.CompareAndSwapInt32( &s.status, ...

2024-08-24 08:55:41 281

原创 【Temporal】Server启动逻辑

Server启动代码入口:temporal/cmd/server/main.go Choose here javascripttypescripthtmlcssshellpythongolangjavacc++c#phprubyswiftkotlinscalarustdartelixirhaskellluaperlrsql s, err := temporal.Ne...

2024-08-18 11:59:06 377

原创 【Temporal】方法错误处理机制

temporal有一套自己的错误机制,对于workflow和activity方法来说,错误返回都会被temporal层层封装,最后在外部拿到的是一个temporal类型的错误码对于workflow或者activity方法的错误返回,我们收到的一般都是类似这种信息:Activity error. Namespace default TaskQueue ting-queue-20130815 Work...

2024-08-17 14:20:19 251

原创 【Temporal】任务并发失败问题研究

问题描述我们有时候可能会收到这样的错误:getState: illegal access from outside of workflow context单从这个错误信息来看,是无法知道具体的错误根因是什么的,网上也基本没有这方面的资料,因此咋们就从源码来分析分析,找到具体的根因。源码分析源代码入口:temporal-go.sdk/internal/internal_workflow.go找到错误...

2024-08-14 13:50:39 474

原创 【Temporal】工作流程引擎

关键概念Workflow:Workflow是在编排层的关键概念,每种类型是注册到服务端的一个WorkflowType,每个WorkflowType可以创建任意多的运行实例,即WorkflowExecution,每个Execution有唯一的WorkflowID,如果是Cron/Continue-as-New, 每次执行还会有唯一的RunID。Workflow可以有环,可以嵌套子工作流(ChildW...

2024-08-11 08:21:49 507

原创 基于ebpf的可观测方案

插桩应用程序可观测性的一个重要方向是通过代码插桩的方式来实现。利用插桩,应用程序可以暴露非常丰富的观测信号,包括指标、追踪、日志、函数性能剖析等。插桩是一种软件开发技术,它的主要目的是在不修改源代码的情况下,对程序进行测试、监控和分析。有两种常见的插桩方案:无侵入的Agent方式:这个主要跟语言强相关,每种语言都需要自己实现一套独立的agent方案Python猴子补丁:对于python语言来说,因...

2024-08-03 11:10:34 647

原创 如何构建面向用户的云管平台

为了解决业务用户到k8s-api之间的鸿沟,大致有两种直接的方式。第一种就是把业务变成k8s专家,这样业务方就可以直接使用k8s而不会出现不会用不好用的感受,但这会导致一个很大的问题,就是业务发开的认知负荷爆炸。另外一个看起来也很直接的解决方式,就是由我们的k8s工程师和平台工程师,充分利用k8s的能力,去构建一套面向用户的应用管理平台。面向用户,意味着,我们的模型或API是业务侧熟悉和理解的。 ...

2024-07-28 15:49:42 339

原创 如何看待云原生下的多活容灾

为什么业务容器化之后,多活容灾变得更具挑战?不像之前使用CVM或者物理机部署时,业务容器化之后,底层资源的可控程度更弱,应用实例生命周期更短、变化更快,这就给业务做容灾部署带来了更大的难度。除此之外,当前自研业务大部分都是面向Kubernetes集群进行编排的,业务需要感知Kubernetes集群和集群内的资源拓扑,然后再结合自己的容灾部署拓扑去选择合适的集群,配置合适的调度标签进行强有序的多活部...

2024-07-21 16:54:12 425

原创 CUE-云原生配置语言

CUE 是一种服务于云化配置的强类型配置语言,由 Go team 成员 Marcel van Lohiuzen 结合 BCL 及多种其他语言研发并开源,可以说是 BCL 思路的开源版实现CUE 是一种服务于云化配置的强类型配置语言,由 Go team 成员 Marcel van Lohiuzen 结合 BCL 及多种其他语言研发并开源,可以说是 BCL 思路的开源版实现https://cuelan...

2024-07-20 13:13:35 623

原创 聊聊服务的接口认证

当我们在提供一个服务时,除了面向用户提供界面操作外,还会面向各种三方开发者,那么此时服务的接口认证就很重要了。下面来简单说说怎么设计一个接口的认证:API签名机制API签名可以理解为就是对API的调用进行签名保护。是在进行API调用时,加了一个调用者及其调用行为的指纹信息,以帮助服务端更好的识别用户及其调用行为的合法性。其直接目的归纳为:(1)明确调用者的身份(确认调用者是谁)(2)明确调用者的调...

2024-02-20 15:03:27 1084

原创 如何构建无侵入的可观测平台

使用opentelemetry开源标准协议实现:搭建trace、metric、log三种观测信号的服务端通过opentelemetry提供的SDK库封装业务侧操作通过切面编程的方式获取业务服务相关信息建立跟服务端的通信,发送信息到服务端下面简单聊聊第二点的实现启动Exporterexporter, err := otlptracehttp.New(context.Background(), otl...

2024-02-19 09:49:57 444

原创 OPA—云原生策略模型

简介OPA,全称 Open Policy Agent(开放策略代理),官网是openpolicyagent.org。OPA 主要为了解决云原生应用的访问控制、授权和策略。OPA 是通用的,与平台无关。请求和响应是以 JSON 格式发送的。OPA将决策与策略执行解耦。当你的软件需要做出决策时,它查询 OPA 并提供结构化数据(例如,JSON)作为输入。OPA 通过评估查询输入并对照策略和数据来生成...

2023-12-09 16:07:06 698

原创 Kelemetry-Kubernetes全局可观测

背景作为分布式异步声明式 API,与传统的基于 RPC 的服务相比,Kubernetes 的可解释性较低,因为事件之间没有明确的因果关系;一个对象的变化会间接影响其他对象的变化,过去在 Kubernetes 中进行可观测的尝试要么仅限于单个组件,要么过度侵入单个组件。于是诞生了kelemetry项目,用于对Kubernetes进行全局的观测监控。原理kelemetry以对象操作为监控粒度,区别于传...

2023-12-05 13:35:00 186

原创 RPC框架思考

调研在开发一个RPC 框架之前,一般需要搞清楚以下几个问题1、开发效率问题开发效率是所有的框架都需要解决的基础问题,框架的初衷几乎都是为了提高开发效率,避免每次 RPC 调用都要进行重复的 socket 操作、序列化与反序列化处理、解析协议、寻址处理、异常处理等等。因此,一个好的RPC框架应该是对开发友好的,不能让开发进行重复性的工作2、通信效率问题作为一款高性能的 RPC 框架,通信效率肯定是要...

2023-11-28 16:10:20 155

原创 GraphQL—构建多服务架构的数据层

简介作为 Facebook 在 2015 年推出的查询语言,GraphQL 能够对 API 中的数据提供一套易于理解的完整描述,使得客户端能够更加准确的获得它需要的数据现在的web系统大多是基于restful的,我们知道,REST强调以资源来划分系统,通过URL规范来操作相应的资源:一个系统中的资源有关联关系,通过URL规范就不太好定义一个很好的url接口每个操作都需要对应一个url接口前端在获取...

2023-11-24 13:39:09 1162 1

原创 ETCD中MVCC的运用

MVCC并发与锁从来都是密不可分的两个东西,在一个请求的过程中,难免会操作各种各样的资源,那么在多个请求同时到来的时候,各个请求处理资源是无序的,肯定就会造成干扰,那么普遍的做法就是加锁。但是,这势必会导致系统性能下降,因此出现了各种优化的方案:控制锁的粒度;乐观锁等等。另一个方面,伴随着锁的出现,针对锁的处理,开始有了事务,说到事务,那么就会想到MVCC(多版本控制),相信大家对MVCC开始了解...

2023-11-17 13:41:55 728

原创 Prometheus扩展思想

不足Prometheus 本身只支持单机部署,没有自带支持集群部署,也就不支持高可用以及水平扩容,在大规模场景下,最让人关心的问题是它的存储空间也受限于单机磁盘容量,磁盘容量决定了单个 Prometheus 所能存储的数据量,数据量大小又取决于被采集服务的指标数量、服务数量、采集速率以及数据过期时间。在数据量大的情况下,我们可能就需要做很多取舍,比如丢弃不重要的指标、降低采集速率、设置较短的数据过...

2023-11-11 15:30:26 105

原创 Istio-EnvoyFilter配置浅谈

EnvoyFilterEnvoyFilter提供了一种机制来定制 Istio Pilot 生成的 Envoy 配置。使用 EnvoyFilter 来修改某些字段的值,添加特定的过滤器,甚至添加全新的 listener、cluster 等。这个功能必须谨慎使用,因为不正确的配置可能破坏整个网格的稳定性。对于特定命名空间中的特定工作负载,可以存在任意数量的 EnvoyFilter。这些 EnvoyF...

2023-11-07 18:06:06 414

原创 Envoy的配置浅谈

今天来简单说说envoy的配置想象一下网络代理程序的流程,比如作为一个代理,首先要能获取请求流量,通常是采用监听端口的方式实现;其次拿到请求数据后需要对其做微处理,例如附加Header或校验某个Header字段的内容等,这里针对来源数据的层次不同,可以分为L3/L4/L7,然后将请求转发出去;转发这里又可以衍生出如果后端是一个集群,需要从中挑选一台机器,如何挑选又涉及到负载均衡等。脑补...

2023-11-04 15:24:43 227

原创 Terraform—基础设施即代码(Iac)

简介IAC(基础设施即代码),是指通过编写代码来进行基础设施的定义,部署,更新与销毁。让基础设施的变更同代码一样,具有版本控制的能力,同时可以通过codeReview 进行审阅,保障其可靠性与一致性。只需要做好基础设施可变与不可变部分的划分,即可通过流水线工具及相关策略对可变部分进行动态调整,完成基础设施的自动化编排与管理。Terraform 是 Hashicorp 公司开源的一种多云资源编排工具...

2023-10-14 16:55:36 165

原创 Apisix-Ingress服务发现详解

apisixApache APISIX 是一个基于微服务 API 网关,其不仅可以处理南北向的流量,也可以处理东西向的流量即服务之间的流量。Apache APISIX 集成了控制面板和数据面,与其他 API 网关相比,Apache APISIX 的上游、路由、插件全是动态的,修改这些东西时都不用重启。并且 Apache APISIX 的插件也是热加载,可以随时插拔、修改插件。Apache APIS...

2023-10-11 14:33:00 1316

原创 Mongo聚合分析命令浅析

在很多时候,我们需要临时统计下数据库中的数据,一般的做法是写一个脚本,通过代码来统计分析。在mongo中,其实可以直接使用命令就可以实现,主要得益于其非常强大的统计命令支撑。下面通过一个例子来看下mongo中强大的统计分析命令。有这样一个集合,test集合字段示例如下:cmgo-dho4eog7_0:PRIMARY> db.resource_f57ddf3fa743426b93cd6390e...

2023-09-23 18:43:40 125

原创 Crossplane-云基础架构管理平台

背景Crossplane(跨平面,意思是可以跨越多个 公有云平台) 是一个开源的 Kubernetes 插件,它允许平台团队组装来自多个供应商的基础设施,并向应用程序团队公开更高级别的自助服务 api,而不需要编写任何代码。Crossplane 扩展您的 Kubernetes 集群,为您提供任何基础设施或托管服务的 crd。将这些细粒度资源组合成更高级别的抽象,这些抽象可以使用您喜欢的工具,也可以...

2023-09-18 18:41:51 239

原创 跟着Kubernetes学设计—声明式or命令式

我们知道k8s是基于声明式设计的系统,我们只管告诉k8s我们想要达到的系统状态,至于怎么达到,是k8s自身需要处理的事情,比如下面的yaml:apiVersion: apps/v1kind: Deploymentmetadata:name: nginx-deploymentspec:selector:matchLabels:app: nginxrep...

2023-09-10 12:08:51 157

原创 大规模场景下对Istio的性能优化

简介当前istio下发xDS使用的是全量下发策略,也就是网格里的所有sidecar(envoy),内存里都会有整个网格内所有的服务发现数据。这样的结果是,每个sidecar内存都会随着网格规模增长而增长。Aeraki-meshaeraki-mesh项目下有一个子项目专门用来处理istio配置分发性能问题,我们找到该项目:https://github.com/aeraki-mesh/lazyxds从...

2023-08-30 13:57:02 958

原创 OAM—云原生下的应用模型

OAM概述OAM (Open Application Model)是一个专注于描述应用的标准规范,OAM的愿景是在应用的维护生命周期内,提供一种标准化的沟通方式。将应用开发者、应用运维人员和基础设施运维人员,以一种标准化的方式连接起来,并且强化了应用生命周期中各个角色的职责。对于平台开发人员来说,我们都知道Kubernetes的抽象层级:容器和基础设施API资源。但是对于平台的终端用户而言还是太过...

2023-08-23 13:39:08 257

原创 CloudEvents—云原生事件规范

我们的系统中或多或少都会用到如下两类业务技术:异步任务,用于降低接口时延或削峰,提升用户体验,降低系统并发压力;通知类RPC,用于微服务间状态变更,用户行为的联动等场景;以上两种场景,都十分适合使用事件驱动来实现。但是对于事件的描述,现在还缺乏一种统一描述,服务使用方和提供方往往要花费大量的时间沟通字段定义,凭直觉设计事件属性,并在将来的使用过程中会因为新增或修改事件的属性而增加很大的额外工作量。...

2023-08-14 18:08:08 1535

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除