Spiga

分类为框架设计的文章

Go学习笔记(九):实现Micro-Kernel(微内核模式)

2020-05-01 20:44:02

摘要:什么是微内核架构 微内核架构(Microkernel Architecture),也被称为插件化架构(Plugin-in Architecture),是一种面向功能进行拆分的可扩展架构。例如 VS Code、Eclipse 这一类 IDE 软件、UNIX 操作系统等等,都是参照微内核架构设计实现的。 微内核架构的两个核心组件 微内核架构包含两类核心的组件:核心系统(Core System)和插件模块(Plug-in modules)。核心系统负责与具体功能无关的通用功能,例如应用生命周期的管理、插件模块的管理(包括:插件模块的注册、载入、卸载等等);插件模块负责实现具体的功能,例如一个 Web 框架基本上会按照功能模块拆分成如下的插件模块:路由模块、安全模块、HTTP 编解码模块等等,每个模块都通过插件实现,每一个插件都只做一件事情。 微内核基本架构示意图如下所示: 核心系统功能尽量保持稳定,不要因为插件模块的扩展而不断修改,插件模块可以根据功能需求进行不断扩展。 特点与要点 特点 易于扩展 错误隔离 保持架构⼀致性 要点 内核包含公共流程或通⽤逻辑 将可变或可扩展部分规划为扩展点 抽象扩展点⾏为,定义接⼝ 利⽤插件进⾏扩展 实例 如下图,我们希望实现Agent在系统主机上,这个Agent可以手机文件信息、进程信息、应用信息,以及提供一个扩展点,可以扩展未来其他要收集的信息,因此我们需要提供一个Extension Point。 1.接口Collector定义 type Collector interface { Init(evtReceiver EventReceiver) error Start(agtCtx context.Context) error Stop() error Destory() error } type Event struct { Source string Content string } type EventReceiver interface { OnEvent(evt Event) } 2.定义Agent结构体 type Agent struct { collectors map[string]Collector evtBuf chan Event cancel c…… 阅读全文

Go学习笔记(八):实现Pipe-Filter(管道过滤器)

2020-04-27 22:50:03

摘要:Pipe-Filter 模式,即管道过滤器模式,这是一种非常经典的架构模式,这种模式与工业制造生产流水线非常类似,就像薯片的生产过程,从土豆的清洗、去皮、切片、烘干、油炸,到最后打包完成,整个生产过程被拆分成了多个环节,每个环节处理完成之后,通过传送带传送到下一个环节的机器。整个生产过程每个环节都是独立的,但又环环相扣,只要有一个环节出问题了,生产出来的薯片就会有质量问题。 适用的场景 ⾮常适合与数据处理及数据分析系统 Filter封装数据处理的功能 Pipe⽤于连接Filter传递数据或者在异步处理过程中缓冲数据流 进程内同步调⽤时,pipe演变为数据在⽅法调⽤间传递 松耦合:Filter只跟数据(格式)耦合 Filter 和组合模式 23 个经典设计模式里面有一个设计模式叫组合模式,当 Pipe-Filter 遇上组合模式时,多个 Filter 又可以再组合成一个新的 Filter,如下图所示,组合出来的 Filter 接收的数据与第一个 Filter 保持一致,返回的数据与最后一个 Filter 保持一致。通过组合,就可以将多个简单的 Filter 可以组合成一个更复杂的 Filter。应用这一套理论去实践,我们会发现,Filter 既可以做的很轻便,也可以做得很强大。 实例 接下来我们用Go语言实现上图实例: 1.定义filter接口 // Package pipefilter is to define the interfaces and the structures for pipe-filter style implementation package pipefilter // Request is the input of the filter type Request interface{} // Response is the output of the filter type Response interface{} // Filter interface is the definition of the data processing components // Pipe-Filter structure type Filter interface { Process(data Request) (Respons…… 阅读全文

微软云平台Microsoft Azure

2019-09-13 17:27:26

摘要:持续集成、继续部署、继续交付 持续集成(Continuous integration) 是一种软件开发实践,即团队开发成员经常集成它们的工作, 通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。 每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。 持续部署(continuous deployment) 是通过自动化的构建、测试和部署循环来快速交付高质量的产品。 某种程度上代表了一个开发团队工程化的程度,毕竟快速运转的互联网公司人力成本会高于机器, 投资机器优化开发流程化相对也提高了人的效率,让 engineering productivity 最大化。 持续交付(英语:Continuous delivery,缩写为 CD) 是一种软件工程手法, 让软件产品的产出过程在一个短周期内完成,以保证软件可以稳定、 持续的保持在随时可以释出的状况。它的目标在于让软件的建置、 测试与释出变得更快以及更频繁。这种方式可以减少软件开发的成本与时间,减少风险。 DevOps DevOps(Development和Operations的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。 它是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。透过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。 它的出现是由于软件行业日益清晰地认识到:为了按时交付软件产品和服务,开发和运维工作必须紧密合作。 Jenkins Jenkins是实现DevOps的工具 Jenkins是一款开源 CICD 软件,用于自动化各种任务,包括构建、测试和部署软件。 Jenkins 支持各种运行方式,可通过系统包、Docker 或者通过一个独立的 Java 程序。 特点: 易于安装,只要把jenkins.war部署到servlet容器 易于配置-所有配置都通过其提供的web界面实现。 集成RSS/E-mail通过RSS发布构建结果或当构件完成是通过e-mail通知。 生成JUnit/TestNG测试报告。 分布式构建支持Jenkins能够让多台计算机一起构建/测试。 文件识别:Jenkins能够跟…… 阅读全文

微服务架构(九):k8s

2018-04-20 16:07:57

摘要:k8s介绍 什么是k8s k8s是一个舵手,专门用来进行给docker掌管方向的,换句话说,就是用来控制docker运行容器的 和docker 是一样的功能。所以就有一个概念cluster 为什么要使用k8s 因为当docker容器异常的时候,docker无法将容器进行重启,如果容器数量比较大 swarm 优点 架构简单,部署运维成本低 docker swarm 集群模式由于原生态集成到docker-engine中,所以首先学习成本低,对于使用docker-engine 1.12版本及以上可以平滑过渡,service服务可以满足动态增减容器个数,同时具备自身的负载均衡,swarm管理者多台设定保证了机器在出错后有一个良好的容灾机制 启动速度快 swarm集群只会有两层交互,容器启动是毫秒级 swarm缺点 1 无法提供更精细的管理 swarm API兼容docker API,所以使得swarm无法提供集群的更加精细的管理 2 网络问题 在网络方面,默认docker容器是通过桥接与NAT和主机外网络通信,这样就出现2个问题,一个是因为是NAT,外部主机无法主动访问到容器内(除了端口映射),另外默认桥接IP是一样的,这样会出现不同主机的容器有相同的IP的情况。这样两容器更加不能通信。同时网络性能方面,有人测试经过桥接的网络性能只有主机网络性能的70%。当然以上问题可以通过其他工具解决,比如用 Flannel 或者 OVS网桥 3 容器可靠性 在容器可靠性方面,相较于Kubernetes的Replication Controllers可以监控并维持容器的生命,swarm在启动时刻可以控制容器启动,在启动后,如果容器或者容器主机崩溃,swarm没有机制来保证容器的运行。 kubernetes优点: 1 管理更趋于完善稳定 kubernetes 集群管理更趋于完善稳定,同时pod功能上比swarm的service更加强大 2 健康机制完善 Replication Controllers可以监控并维持容器的生命 3 轻松应对复杂的网络环境 kubernetes默认使用Flannel作为overlay网络。 Flannel是CoreOS 团队针对 Kubernetes 设计的一个覆盖网络(OverlayNetwork)工具,其目的在于帮助每一个使用 Kuberen…… 阅读全文

微服务设计(八):docker

2018-04-15 10:53:53

摘要: Docker版本 17.03版本之后 1、CE(Community Edition: 社区版) ---- 免费 2、EE(Enterprise Edition: 企业版)---- 收费 windows 安装 条件 1、windows 10 2、开启Hyper-V 3、安装Toolbox 最新版 Toolbox 下载地址: https://www.docker.com/get-docker 点击 Download Desktop and Take a Tutorial,并下载 Windows 的版本 linux安装 1. centos7.0 以上的版本 ​ 2. 安装docker 版本仓库 docker版本 ​ 2.1 设置仓库 ​       sudo yum install -y yum-utils device-mapper-persistent-data lvm2 ​ 2.2 稳定仓库 ​     sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo ​ 3. 安装docker(默认安装最新版本) ​ sudo yum install docker-ce docker-ce-cli containerd.io ​ 如果要安装其他版本 ​       要安装特定版本的 Docker Engine-Community,请在存储库中列出可用版本,然后选择并安装: ​       1、列出并排序您存储库中可用的版本。此示例按版本号(从高到低)对结果进行排序。 ​         yum list docker-ce --showduplicates | sort -r ​               docker-ce.x86_64 3:18.09.1-3.el7                     docker-ce-stable               docker-ce.x86_64 3:18.09.0-3.el7                     docker-ce-stable               docker-ce.x86_64 1…… 阅读全文

微服务架构(七):链路监控

2018-04-09 11:32:52

摘要:什么是链路监控 APM 什么是链路 在分布式系统中,完成一个功能 ,需要涉及到许多服务协作,连接这些服务的请求组合起来就是链路, 例如:就好比一台自行车,我想让自行车跑起来,必须使用链条,那么这个链条就是链路。 什么是链路监控 就是用来记录服务之间的请求过程,就是链路监控 为什么要使用链路监控 见图,微服务不使用链路监控 微服务系统正常运行,时间正常情况下,不需要使用监控中心 在微服务调用过程中比较耗时情况 2.1 如何知道是什么地方导致耗时,无法排查是哪一个节点出现了问题 在微服务调用过程中,涉及到哪些微服务情况 3.1 无法知道微服务的调用过程。 在这两个问题的情况下,所以我们需要使用知道微服务之间的调用过程和每一个微服务掉调用过程所需要的时间。 根据场景中出现的问题,来引出链路监控 那么如何解决这两种问题呢,所以出现了链路监控 链路监控框架 Cat :大众点评开发,基于java的实时应用监控平台,包括实时应用监控,业务是监控 Zipkin :java 开发Zipkin是Twitter开源的调用链分析工具,目前基于springcloud sleuth得到了广泛的使用,特点是轻量,使用部署简单 :代码嵌入性强,基于中间件实现, Pinpoint:java开发 Pinpoint是韩国人开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI功能强大,接入端无代码侵入 SkyWalking:java 开发 SkyWalking是本土开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI功能较强,接入端无代码侵入。目前已加入Apache孵化器。全链路追踪,配置极其简单。没有任何代码入侵。 Naver的Pinpoint、Apache的HTrace、阿里的鹰眼Tracing、京东的Hydra、新浪的Watchman,美团点评的CAT,skywalking等。 根据优点和缺点(也是框架内部的一些配置和对比)进行比较得出结论 两方面考虑 结合框架特点,结合业务场景特点 所以我们选择SkyWalking 微服务系统中如何使用SkyWalking SkyWalking概念 Skywalking Agent: SkyWalking客户端,用来发送链路数据到Collecter SkyWalking Collect…… 阅读全文

微服务架构(六):事件总线

2018-04-04 14:27:26

摘要:什么是事物 例如:事物 所有看到的一切都是事物,不能看到的也是事物 例如:团队微服务,成员微服务,聚合微服务,网关api,认证中心等等包括类,对象 所有的事件都是事物变化的结果 大家接触事件最早就是在js 或者是c#高级特性。大家对于事件不默认,但是对于事件不是很好理解 什么是事件 事件就是指事物状态的变化,每一次事物变化的结果都称作为事件 什么是事件总线 就是用来管理所有的事件的一种机制就称作为事件总线 包括事件发布,事件存储,事件订阅,事件处理的统称 作用: 事件总线是一种机制,它允许不同的组件彼此通信而不彼此了解。 组件可以将事件发送到Eventbus,而无需知道是谁来接听或有多少其他人来接听。 组件也可以侦听Eventbus上的事件,而无需知道谁发送了事件。 这样,组件可以相互通信而无需相互依赖。 同样,很容易替换一个组件。 只要新组件了解正在发送和接收的事件,其他组件就永远不会知道. 为什么要使用事件总线 将微服务系统各组件之间进行解耦 使用业务的发展来说 事件总线框架 CAP masstransit CAP内部概念 事件 : 就是一些状态信息 发布者:发布事件的角色 cap 订阅者:订阅消费事件的角色 cap 消息传输器:传输事件 消息存储器:存储事件 CAP存储事件消息队列类型Transport Azure rabbitmq kafaka In Memory Queue CAP存储事件持久化类型 SQL Server MySQL PostgreSQL MongoDB InMemoryStorage CAP事件监控 Dashboard 微服务系统中如何使用CAP 条件 微服务系统 RabbitMQ SqlServer CAP 步骤 微服务系统准备 微服务系统全部准备完毕 RabbitMQ准备 2.1 环境准备 Erlang下载地址:https://www.erlang.org/downloads RabbitMQ下载地址:https://www.rabbitmq.com/download.html 2.2 RabbitMQ 启动 1、在安装目录下添加可视化插件 rabbitmq-plugins enable rabbitmq_management 在安装目录下启动 rabbitmq-server 查看rabbitmq状态 …… 阅读全文

微服务架构(五):配置中心

2018-03-27 13:48:22

摘要:什么是配置中心 配置是用来动态修改程序执行的一种行为的机制 为什么要使用配置中心 安全性:配置跟随源代码保存在代码库中,容易造成配置泄漏。 时效性:修改配置,需要重启服务才能生效。 局限性:无法支持动态调整:例如日志开关、功能开关。 因此,分布式配置中心应运而生! 配置中心类型方式 Apollo,java开发 ----- 运维成本比高 Apollo分为MySQL,Config Service,Admin Service,Portal四个模块,MySQL存储Apollo元数据和用户配置数据; Config Service提供配置的读取、推送等功能,客户端请求都是落到Config Service上; Admin Service提供配置的修改、发布等功能,Portal操作的服务就是Admin Service; Portal提供给用户配置管理界面;功能强大,社区活跃,但较为复杂,部署组件较多,运维成本比高 Consul, go开发 依赖:不依赖其他组件 应用内/外:属于外部应用,侵入性小 ACP原则:遵循CP原则(一致性+分离容忍) 服务注册稍慢,由于其一致性导致了在Leader挂掉时重新选举期间真个consul不可用。 版本迭代:目前仍然进行版本迭代 集成支持:支持SpringCloud K8S集成 访问协议:HTTP/DNS 雪崩保护:不支持雪崩保护 集成:SpringCloud集成,K8S集成 自动注销实例:不支持 界面:英文界面,不符合国人习惯 上手:复杂一点 Nacos,依赖:mysql ----- 依赖:mysql 应用内/外:属于外部应用,侵入性小 ACP原则:通知遵循CP原则(一致性+分离容忍) 和AP原则(可用性+分离容忍) 版本迭代:目前仍然进行版本迭代,最近的提交是几天前 集成支持:支持Dubbo 、SpringCloud、K8S集成 访问协议:HTTP/动态DNS/UDP 雪崩保护:支持雪崩保护 Spring cloud config java开发 ----- Net支持比较差 自动注销实例:支持 界面:国产服务,中文界面,符合国人习惯 上手:极易,中文文档,案例,社区活跃 Consul实际上是和Nacos比较相似的产品,虽然Consul目前的主要发展方向放在了Service Mesh,但是Consul最初支持的服务发现和配置管理,也是Naco…… 阅读全文

微服务架构(四):身份验证与授权

2018-03-23 21:30:31

摘要:什么是身份认证 身份认证是指当客户端访问服务端资源时,验证客户端是否合法的一种机制 什么是授权 授权就是指当客户端经过身份认证后,能够有限的访问服务端资源的一种机制 为什么要使用身份验证和授权 为了保证服务端资源的安全,我们要理解必须从真实项目中去理解 身份认证和授权方式有哪些 Base认证 Base64编号认证 == https Digest认证 MD5消息摘要认证 == https Bearer认证 就是基于token(电子身份证)认证,讲用户信息等其他信息转换成为token,然后以token进行认证 token认证是一种无状态的认证方式,能够无限扩展,特别适合做单点登录 3.1 OAuth 2.0 ==== 授权方式的认证 3.2 JWT的也是一种身份认证 token 分两种类型 引用类型token == OAuth 2.0 无用户相关信息 自包含token 有用户相关信息 JWT === 地址,电话,id,等 在实际分布式项目中,大部分都是使用Bearer来进行身份认证和身份授权 在分布式项目或者微服务项目中,为了保证系统统一登录(SSO登录), 使用OpenID协议标准来规范身份认证功能 === 规范 同时使用OAuth 2.0协议标准来规范权限访问 === 规范 为了将身份认证(单点登录)和授权结合起来,所以出现了OpenID Connect协议标准 === 接口 OpenID Connect = OpenID + OAuth 2.0 SSO+OAuth 2.0可以实现单点登录和授权 IdentityServer4 也可以实现单点登录和授权 然后综合实现了这些框架就是今天要讲的IdentityServer4 身份认证服务器 如何在项目中使用IdentityServer4 IdentityServer4 是什么 IdentityServer是基于OpenID Connect协议标准的身份认证和授权程序,它实现了OpenID Connect 和 OAuth 2.0 协议。 IdentityServer4 功能 保护你的资源 使用本地帐户或通过外部身份提供程序对用户进行身份验证 提供会话管理和单点登录 管理和验证客户机 向客户发出标识和访问令牌 验证令牌 IdentityServer4 内部概念 下面对以下几个转用术语进行解释 用户…… 阅读全文

微服务架构(三):API网关

2018-03-18 18:31:04

摘要:什么是API网关 就是用来限制客户端访问服务端api一到门槛,在图例中已经进行了展示 什么是API API是Application Programming Interface缩写,翻译成中文就是应用程序接口。在实际微服务中可以理解一个个功能方法。就比如你一个用户服务的微服务,可以对外提供 API 接口为,查找用户,创建用户等。 什么是网关 网关, wiki 上定义。 在计算机网络中,网关(英语:Gateway)是转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,它就像自己拥有资源的源服务器一样对请求进行处理 为什么要使用微服务网关 大概有4四种情况 聚合微服务增多,导致客户端不好维护 聚合微服务进行集群 2.1 增加和修改聚合微服务集群,都要修改客户端,导致客户端不稳定 2.2 服务集群,无法解决复杂均衡的问题 客户端访问多个聚合微服务 3.1 如果需要对客户端身份验证和授权,会导致每个服务都进行授权 3.2 如何客户端访问过大,无法限制客户端流量,导致系统宕机 3.3 如果客户端访问微服务系统,每个微服务之间进行调用。会导致耗时操作很难统计。 3.4 如果客户端访问微服务系统,如何统计客户端的调用日志 总结 路由 负载均衡 限流 认证 授权 链路监控 熔断降级 Service Fabric 如何在项目中使用API网关 API网关类型 Netflix Zuul +java实现 Kong nginx +lua脚本实现 Tyk go语言开发,收费版本 Ocelot aspnetcore开发的 如何在项目中使用Ocelot Ocelot是什么 简单的来说Ocelot是一堆的asp.net core middleware组成的一个管道。当它拿到请求之后会用一个request builder来构造一个HttpRequestMessage发到下游的真实服务器,等下游的服务返回response之后再由一个middleware将它返回的HttpResponseMessage映射到HttpResponse上。 Ocelot内部概念 上游 Ocelot为上游:Upstream 下游 Ocelot下面映射的服务为下游:Downstream 主要功能 路由 1.1 接受客户端请求 1.2 奖客户端请求转换成下游地址 1.3 调用下游服务,并返回…… 阅读全文