自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 如何带领团队“攻城略地”?不可告人的龙岭迷窟

架构师职责架构师不是一个人,他需要建立高效卓越的体系,带领团队去攻城略地,在规定的时间内完成项目。架构师需要能够识别定义并确认需求,能够进行系统分解形成整体架构,能够正确地技术选型,能够制定技术规格说明并有效推动实施落地。按 TOGAF 的定义,架构师的职责是了解并关注实际上关系重大但未变得过载的一些关键细节和界面,架构师的角色有:理解并解析需求,创建有用的模型,确认...

2020-03-08 22:55:21 240

原创 如何落地一个FaaS平台?

目前优酷内容分发相关业务已经陆续引入FaaS能力,在FaaS的助力下,迭代效率提升。但是平台整体上还处于刚刚起步阶段,也是我们Serverless实践的初步尝试。支持更多编程语言的运行时环境,以及更友好的云端IDE开发体验。优化函数运行集群的资源调度策略,合理分配函数执行需要的资源,支持动态扩缩容。结合内容分发业务的特点,寻找更多业务的切入点,通过FaaS进一步提升现有技术架构的灵活性和迭代效率。

2024-04-15 16:44:35 642

原创 大模型开发框架 LangChain最全总结系列

假如我们想要用 openai api 对一个段文本进行总结,我们通常的做法就是直接发给 api 让他总结。但是如果文本超过了 api 最大的 token 限制就会报错。这时,我们一般会进行对文章进行分段,比如通过 tiktoken 计算并分割,然后将各段发送给 api 进行总结,最后将各段的总结再进行一个全部的总结。LangChain 很好的帮我们处理了这个过程,使得我们编写代码变的非常简单。# 导入os,设置环境变量。导入文本加载器、总结链、文本分割器及OpenAI模型import os。

2024-04-11 18:14:35 701

原创 51-基于GitHubActions的CI实战

GitHub Actions 配置文件存放在代码仓库的目录下,文件后缀为.yml,支持创建多个文件,文件名可以任意取,比如iam.yml。GitHub 只要发现目录里面有.yml文件,就会自动运行该文件,如果运行过程中存在问题,会以邮件的形式通知到你。workflow 文件的配置字段非常多,如果你想详细了解,可以查看官方文档。这里,我来介绍一些基本的配置字段。name字段是 workflow 的名称。如果省略该字段,默认为当前 workflow 的文件名。on。

2024-04-11 13:59:03 1034

原创 50-服务编排(下):基于Helm的服务编排部署实战

这一讲,我们通过。有了Helm Chart包,我们就可以通过命令来一键部署好整个IAM应用。当IAM应用中的所有Pod都处在Running状态后,说明IAM应用被成功部署。最后,我们可以登录iamctl容器,执行命令,来对IAM应用进行冒烟测试。

2024-04-11 13:57:11 1028

原创 49-服务编排(上):Helm服务编排基础知识

Helm目前是Kubernetes服务编排事实上的标准。Helm提供了多种功能来支持Kubernetes的服务编排,例如helm命令行工具、Chart包、Chart仓库等。今天,我介绍了Helm的基础知识,并给你演示了如何基于Helm部署IAM应用。当一个应用包含了很多微服务时,手动在Kubernetes集群中部署、升级、回滚这些微服务是一件非常复杂的工作。这时候,我们就需要一个服务编排方案来编排这些服务,从而提高服务部署和维护的效率。

2024-04-11 11:40:55 959

原创 48-基于腾讯云EKS的容器化部署实战

我先简单介绍一下EKS是什么。EKS(Elastic Kubernetes Service)即腾讯云弹性容器服务,是腾讯云容器服务推出的无须用户购买节点即可部署工作负载的服务模式。它完全兼容原生的 Kubernetes,支持使用原生方式创建及管理资源,按照容器真实的资源使用量计费。弹性容器服务 EKS 还扩展支持腾讯云的存储及网络等产品,同时确保用户容器的安全隔离,开箱即用。云原生架构设计中,需要将IAM应用部署到Kubernetes集群中。所以,首先需要你准备一个Kubernetes集群。

2024-04-11 11:18:45 1286

原创 47-如何编写Kubernetes资源定义文件?

其实Kubernetes支持YAML和JSON两种格式,JSON格式通常用来作为接口之间消息传递的数据格式,YAML格式则用于资源的配置和管理。metadata:spec:ports:port: 8443selector:},"spec": {"ports": [],},我就是通过json2yaml在线工具,来转换YAML和JSON的,如下图所示:在编写Kubernetes资源定义文件的过程中,如果因为YAML格式文件中的配置项缩进太深,导致不容易判断配置项的层级,

2024-04-11 11:14:12 672

原创 46-如何制作Docker镜像?

上面,我介绍了一些与Docker镜像构建有关的基础知识。在实际生产环境中,我们标准的做法是通过Dockerfile来构建镜像,这就要求你会编写Dockerfile文件。接下来,我就详细介绍下如何编写Dockerfile文件。# Comment是指令,不区分大小写,但我的建议是指令都大写,这样可以与参数进行区分。Dockerfile中,以开头的行是注释,而在其他位置出现的# Comment一个Dockerfile文件中包含了多条指令,这些指令可以分为5类。FROM;MAINTAINER(可选);

2024-04-11 10:53:03 811

原创 45-基于Kubernetes的云原生架构设计

CNCF(Cloud Native Computing Foundation,云原生计算基金会),2015年由谷歌牵头成立,目前已有一百多个企业与机构作为成员,包括亚马逊、微软、思科、红帽等巨头。CNCF致力于培育和维护一个厂商中立的开源社区生态,用以推广云原生技术。CNCF目前托管了非常多的开源项目,其中有很多我们耳熟能详的项目,例如 Kubernetes、Prometheus、Envoy、Istio、etcd等。更多的项目,你可以参考CNCF公布的。

2024-04-11 10:36:48 898

原创 44-技术演进(下):软件架构和应用生命周期技术演进之路

最后,我们通过下面这张图,来对整个云技术的演进之路做个整体性的回顾:通过这张图你可以看到,每种技术并不是孤立存在的,而是相互促进的。在物理机阶段,我们用的是瀑布开发模式和单体架构;在虚拟机阶段,用得比较多的是敏捷开发模式和SOA架构;在容器这个阶段,则使用CI/CD的开发模式和微服务架构。在Serverless阶段,软件架构仍然采用微服务,不过在一些触发器场景,也可能会编写一些FaaS架构的函数,部署在类似腾讯云云函数这样的FaaS平台上;

2024-04-10 17:48:57 723

原创 43-技术演进(上):虚拟化技术演进之路

虚拟化技术的演进流程为:物理机阶段 -> 虚拟机阶段 -> 容器阶段 -> Serverless阶段。其中,物理机到虚拟机阶段的演进技术,主要是为了解决x86架构的虚拟化漏洞。要虚拟CPU、内存和I/O,就需要捕获其中的敏感指令,防止这些敏感指令修改系统状态,影响系统的稳定性。x86架构有些敏感指令不是特权指令,导致这些指令可以从客户机中直接在物理CPU上执行,从而可能会影响系统状态。所以,我们说x86架构是有虚拟化漏洞的。

2024-04-10 17:29:48 1163

原创 42-软件部署实战(下):IAM系统安全加固、水平扩缩容实战

iptables是Linux下最优秀的防火墙工具,也是Linux内核中netfilter网络子系统用户态的工具。netfilter提供了一系列的接口,在一个到达本机的数据包,或者经本机转发的数据包流程中添加了一些可供用户操作的点,这些点被称为HOOK点。通过在HOOK点注册数据包处理函数,可以实现数据包转发、数据包过滤、地址转换等功能。用户通过iptables工具定义各种规则,这些规则通过iptables传给内核中的netfilter。最终,netfilter会根据规则对网络包进行过滤。

2024-04-10 16:12:52 982

原创 41-软件部署实战(中):IAM系统生产环境部署实战

在腾讯云上,可通过绑定弹性公网IP来实现外网访问,需要先申请公网IP,然后将VIP绑定弹性公网IP。文件中指定一个普通内网IP为virtual IP,当Keepalived将virtual IP从MASTER机器切换到BACKUP机器时,将无法更新IP和MAC地址的映射,而需要调API来进行IP切换。配置Keepalived的流程比较复杂,分为创建腾讯云HAVIP、主服务器配置、备服务器配置、测试Keepalived、VIP绑定公网IP和测试公网访问六大步,每一步中都有很多小步骤,下面我们来一步步地看下。

2024-04-10 14:36:59 869

原创 40-软件部署实战(上):部署方案及负载均衡、高可用组件介绍

这里先简单介绍下Nginx。Nginx是一个轻量级、高性能、开源的HTTP服务器和反向代理服务器。IAM系统使用了Nginx反向代理和负载均衡的功能,下面我就来分别介绍下。为什么需要反向代理呢?在实际的生产环境中,服务部署的网络(内网)跟外部网络(外网)通常是不通的,这就需要一台既能够访问内网又能够访问外网的服务器来做中转,这种服务器就是反向代理服务器。Nginx的反向代理功能,能够根据不同的配置规则转发到不同的后端服务器上。假如我们在IP为。

2024-04-10 11:37:44 856

原创 39-性能分析(下):APIServer性能测试和调优实战

这里我们来看下wrk的使用方法。wrk使用起来不复杂,执行wrk --helpOptions:-t,线程数(线程数不要太多,是核数的2到4倍就行,多了反而会因为线程切换过多造成效率降低)。-c,并发数。-d,测试的持续时间,默认为10s。-T,请求超时时间。-H,指定请求的HTTP Header,有些API需要传入一些Header,可通过wrk的-H参数来传入。–latency,打印响应时间分布。-s,指定Lua脚本,Lua脚本可以实现更复杂的请求。

2024-04-10 08:15:00 691

原创 38-性能分析:如何分析Go语言代码的性能?

Go语言已经为开发者内置了很多性能调优、监控的工具和方法,这大大提升了我们profile分析的效率,借助这些工具,我们可以很方便地对Go程序进行性能分析。在Go语言开发中,开发者基本都是通过内置的工具包来进行性能分析的。 要查看性能数据,需要先生成性能数据文件。生成性能数据文件有三种方法,分别是通过命令行、通过代码和通过包。 我们可以使用来生成性能测试数据。进入internal/apiserver/service/v1目录,执行以下命令:上面的命令会在当前目录下生成3个文件:我们还可以使用代码来生成

2024-04-10 07:45:00 897

原创 37-代码测试(下):Go语言其他测试类型及IAM测试介绍

上面,我介绍了如何使用 GoMock 编写单元测试用例。其中,我们使用到了mockgen工具来生成 Mock代码,mockgen工具提供了很多有用的功能,mockgen工具是 GoMock 提供的,用来Mock一个Go接口。它可以根据给定的接口,来自动生成Mock代码。这里,有两种模式可以生成Mock代码,分别是源码模式和反射模式。源码模式上面的命令,Mock了文件中定义的Spider接口,并将Mock代码保存在文件中,文件的包名为spider。反射模式。

2024-04-09 22:18:40 1031

原创 36-代码测试(上):如何编写Go语言单元测试和性能测试用例?

代码开发完成之后,我们需要为代码编写单元测试用例,并根据需要,给一些函数编写性能测试用例。Go语言提供了testing包,供我们编写测试用例,并通过go test命令来执行这些测试用例。go test在执行测试用例时,会查找具有固定格式的Go源码文件名,并执行其中具有固定格式的函数,这些函数就是测试用例。这就要求我们的测试文件名、函数名要符合go test工具的要求:Go的测试文件名必须以_test.go结尾;测试用例函数必须以TestBenchmarkExample开头。

2024-04-09 18:44:27 1032

原创 35-效率神器:如何设计和实现一个命令行客户端工具?

客户端又叫用户端,与后端服务相对应,安装在客户机上,用户可以使用这些客户端访问后端服务。前端,包括浏览器、手机应用;SDK;命令行工具;其他终端。接下来,我就来分别介绍下。浏览器和手机应用提供一个交互界面供用户访问后端服务,使用体验最好,面向的人群是最终的用户。这两类客户端也称为前端。SDK(Software Development Kit)也是一个客户端,供开发者调用。

2024-04-09 11:40:42 685

原创 34-SDK设计(下):IAM项目GoSDK设计和实现

marmotedu-sdk-go在设计时,通过接口实现了3类客户端,分别是项目级别的客户端、应用级别的客户端和服务级别的客户端。开发人员可以根据需要,自行创建客户端类型。marmotedu-sdk-go通过,创建了RESTClient类型的客户端,RESTClient向下通过调用Request模块,来完成HTTP请求方法、请求路径、请求体、认证信息的构建。Request模块最终通过调用gorequest。

2024-04-03 17:18:27 594

原创 33-SDK设计(上):如何设计出一个优秀的GoSDK?

对于SDK(Software Development Kit,软件开发工具包), SDK通常是指封装了Go后端服务API接口的软件包,里面通常包含了跟软件相关的库、文档、使用示例、封装好的API接口和工具。通常,服务提供者会提供不同语言的SDK,比如针对Python开发者会提供Python版的SDK,针对Go开发者会提供Go版的SDK。

2024-04-03 16:59:13 538

原创 32-数据处理:如何高效处理应用程序产生的数据?

采集服务只针对某个采集需求开发,如果采集需求有变,需要修改主代码逻辑,代码改动势必会带来潜在的 Bug,增加开发测试工作量。数据采集服务会导致已有的服务请求延时变高。采集数据性能差,需要较长时间才能采集完一批数据。启停服务时,会导致采集的数据丢失。

2024-04-03 15:07:45 570

原创 31-数据流:通过iam-authz-server设计,看数据流服务的设计

iam-authz-server目前的唯一功能,是通过提供/v1/authzRESTful API接口完成资源授权。/v1/authz接口是通过来完成资源授权的。因为iam-authz-server承载了数据流的请求,需要确保API接口具有较高的性能。为了保证API接口的性能,iam-authz-server在设计上使用了大量的缓存技术。Ladon解决了这个问题:在特定的条件下,谁能够/不能够对哪些资源做哪些操作。为了解决这个问题,Ladon引入了授权策略。

2024-04-03 14:44:14 1010

原创 30-ORM:CURD神器GORM包介绍及实战

GORM是Go语言的ORM包,功能强大,调用方便。像腾讯、华为、阿里这样的大厂,都在使用GORM来构建企业级的应用。功能全。使用ORM操作数据库的接口,GORM都有,可以满足我们开发中对数据库调用的各类需求。支持钩子方法。这些钩子方法可以应用在Create、Save、Update、Delete、Find方法中。开发者友好,调用方便。支持Auto Migration。支持关联查询。支持多种关系数据库,例如MySQL、Postgres、SQLite、SQLServer等。

2024-04-03 11:38:24 1195

原创 29-控制流(下):iam-apiserver服务核心功能实现讲解

今天,我和你分享了 iam-apiserver 的一些关键功能实现,并介绍了我的设计思路。这里我再简要梳理下。为了保证进程关停时,HTTP 请求执行完后再断开连接,进程中的任务正常完成,iam-apiserver 实现了优雅关停功能。为了避免进程存在,但服务没成功启动的异常场景,iam-apiserver 实现了健康检查机制。Gin 中间件可通过配置文件配置,从而实现按需加载的特性。为了能够直接辨别出 API 的版本,iam-apiserver 将 API 的版本标识放在 URL 路径中,例如。

2024-04-03 10:55:51 1147

原创 28-控制流(上):通过iam-apiserver设计,看Web服务的构建

iam-apiserver是一个Web服务,通过一个名为iam-apiserver的进程,对外提供RESTful API接口,完成用户、密钥、策略三种REST资源的增删改查。认证相关接口用户相关接口密钥相关接口策略相关接口我们可以通过不同的客户端来访问iam-apiserver,例如前端、API调用、SDK、iamctl等。这些客户端最终都会执行HTTP请求,调用iam-apiserver提供的RESTful API接口。接下来先介绍下cURL工具。标准的Linux发行版都安装了cURL工具。

2024-04-03 10:34:49 758

原创 27-权限模型:5大权限模型是如何进行资源授权的?

常见的术语总结如下:分别用用户操作和资源来替代 Subject、Action 和 Object。常见的权限模型有下面这 5 种:权限控制列表(ACL,Access Control List)。自主访问控制(DAC,Discretionary Access Control)。强制访问控制(MAC,Mandatory Access Control)。基于角色的访问控制(RBAC,Role-Based Access Control)。

2024-04-02 16:36:17 547

原创 26-IAM项目是如何设计和实现访问认证功能的?

在IAM项目中,iam-apiserver实现了Basic认证和Bearer认证,iam-authz-server实现了Bearer认证。这一讲重点介绍了iam-apiserver的认证实现。用户要访问iam-apiserver,首先需要通过Basic认证,认证通过之后,会返回JWT Token和JWT Token的过期时间。前端将Token缓存在LocalStorage或Cookie中,后续的请求都通过Token来认证。

2024-04-02 16:23:38 608

原创 25-认证机制:应用程序如何进行访问认证?

JWT是Bearer Token的一个具体实现,由JSON数据格式组成,通过HASH散列算法生成一个字符串。该字符串可以用来进行授权和信息交换。使用JWT Token进行认证有很多优点,比如说无需在服务端存储用户数据,可以减轻服务端压力;而且采用JSON数据格式,比较易读。除此之外,使用JWT Token还有跨语言、轻量级等优点。业界目前有四种常用的认证方式:Basic、Digest、OAuth、Bearer。其中Basic和Bearer用得最多。

2024-04-02 15:40:48 540

原创 24-Web服务核心功能有哪些,如何实现?

当前比较火的Go Web框架有 Gin、Beego、Echo、Revel、Martini。你可以根据需要进行选择。我比较推荐Gin,Gin也是目前比较受欢迎的Web框架。Gin Web框架支持Web服务的很多基础功能,例如 HTTP/HTTPS、JSON格式的数据、路由分组和匹配、一进程多服务等。另外,Gin还支持Web服务的一些高级功能,例如 中间件、认证、RequestID、跨域和优雅关停等。

2024-04-02 14:42:22 1291

原创 23-应用构建实战:如何构建一个优秀的企业应用框架?

一个应用框架由命令、命令行参数解析、配置文件解析 3 部分功能组成,我们可以通过 Cobra 来构建命令,通过 Pflag 来解析命令行参数,通过 Viper 来解析配置文件。一个项目,可能包含多个应用,这些应用都需要通过 Cobra、Viper、Pflag 来构建。为了不重复造轮子,简化应用的构建,我们可以将这些功能实现为一个 Go 包,方便直接调用构建应用。IAM 项目的应用都是通过basename,在构建应用时,只需要提供应用简短/详细描述、应用二进制文件名称和命令行选项即可。

2024-04-02 10:55:00 803

原创 22-应用构建三剑客:Pflag、Viper、Cobra核心功能介绍

Go服务开发中,经常需要给开发的组件加上各种启动参数来配置服务进程,影响服务的行为。像kube-apiserver就有多达200多个启动参数,而且这些参数的类型各不相同(例如:string、int、ip类型等),使用方式也不相同(例如:需要支持--长选项,短选项等),所以我们需要一个强大的命令行参数解析工具。虽然Go源码中提供了一个标准库Flag包,用来对命令行参数进行解析,但在大型项目中应用更广泛的是另外一个包:Pflag。

2024-04-02 09:52:30 464

原创 21-日志处理(下):手把手教你从0编写一个日志包

本示例将定义代码保存在options.go文件中。const (InfoLevelWarnLevelErrorLevelPanicLevelFatalLevel另外,因为要在日志输出中,输出可读的日志级别(例如输出INFO而不是1),所以需要有Level到Level Name的映射LevelNameMapping,LevelNameMapping会在格式化时用到。接下来看定义日志选项。日志级别。输出位置,例如标准输出或者文件。输出格式,例如JSON或者Text。

2024-04-01 16:10:32 772

原创 20-日志处理(上):如何设计日志包并记录日志?

关于日志记录问题,我从以上三个层面给你讲解了。综合来说,对于日志记录的最佳实践,你在平时都可以注意或进行尝试,我把这些重点放在这里,方便你后续查阅。开发调试、现网故障排障时,不要遗忘一件事情:根据排障的过程优化日志打印。好的日志,可能不是一次就可以写好的,可以在实际开发测试,还有现网定位问题时,不断优化。但这需要你重视日志,而不是把日志仅仅当成记录信息的一种方式,甚至不知道为什么打印一条Info日志。打印日志要“不多不少”,避免打印没有作用的日志,也不要遗漏关键的日志信息。

2024-04-01 15:40:12 619

原创 19-错误处理(下):如何设计错误包?

业界有很多优秀的、开源的错误包可供选择,例如Go标准库自带的包、包。 在我看来,至少需要有下面这六个功能:首先,应该能支持错误堆栈。 假设保存在bad.go文件中:执行上面的代码: 为了解决这个问题,我们可以加一些Debug信息,来协助我们定位问题。这样做在测试环境是没问题的,但是在线上环境,一方面修改、发布都比较麻烦,另一方面问题可能比较难重现。这时候我们会想,要是能打印错误的堆栈就好了。例如: 其次,能够支持不同的打印格式。例如、、等格式,可以根据需要打印不同丰富度的错误信息。再次,

2024-04-01 15:12:26 584

原创 18-错误处理(上):如何设计一套科学的错误码?

对外暴露的API接口需要有一套规范的、科学的错误码。不论请求成功失败,始终返回,在HTTP Body中包含用户账号没有找到的错误信息。返回错误码,并在Body中返回简单的错误信息。返回错误码,并在Body中返回详细的错误信息。纯数字表示,不同部位代表不同的服务,不同的模块。

2024-04-01 14:53:50 994

原创 17-API文档:如何生成SwaggerAPI文档?

Swagger是一套围绕OpenAPI规范构建的开源工具,可以设计、构建、编写和使用REST API。基于浏览器的编辑器,可以在其中编写OpenAPI规范,并实时预览API文档。就是一个Swagger编辑器,你可以尝试在其中编辑和预览API文档。将OpenAPI 规范呈现为交互式API文档,并可以在浏览器中尝试API调用。根据OpenAPI规范,生成服务器存根和客户端代码库,目前已涵盖了40多种语言。swagger命令格式为。可以通过swagger -h查看swagger使用帮助。

2024-04-01 14:45:51 927

原创 16-代码检查:如何进行静态代码检查?

Go项目开发中,对代码进行静态代码检查是必要的操作。当前有很多优秀的静态代码检查工具,但golangci-lint因为具有检查速度快、可配置、少误报、内置了大量linter等优点,成为了目前最受欢迎的静态代码检查工具。golangci-lint功能非常强大,支持诸如run、cache、completion、linters等命令。$ golangci-lint run # 对当前目录及子目录下的所有Go文件进行静态代码检查。

2024-04-01 14:44:49 635

原创 15-研发流程实战:IAM项目是如何进行研发流程管理的?

在整个研发流程中,需要开发人员深度参与的阶段有两个,分别是开发阶段和测试阶段。在开发阶段,开发者完成代码开发之后,通常需要执行生成代码、版权检查、代码格式化、静态代码检查、单元测试、构建等操作。我们可以将这些操作集成在Makefile中,来提高效率,并借此统一操作。另外,IAM项目在编写Makefile时也采用了一些技巧,例如make help命令中,help信息是通过解析Makefile文件的注释来完成的;可以通过git-chglog自动生成CHANGELOG;

2024-04-01 11:32:20 678

空空如也

空空如也

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

TA关注的人

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