Spiga

CPU的基本原理与存储体系

2018-11-09 17:02:58

摘要:CPU是什么 中央处理器(CPU),是电子计算机的主要设备之一,电脑中的核心配件。其功能主要是解释计算机指令以及处理计算机软件中的数据。CPU是计算机中负责读取指令,对指令译码并执行指令的核心部件。中央处理器主要包括两个部分,即控制器、运算器,其中还包括高速缓冲存储器及实现它们之间联系的数据、控制的总线。电子计算机三大核心部件就是CPU、内部存储器、输入/输出设备。中央处理器的功效主要为处理指令、执行操作、控制时间、处理数据。 [2] 在计算机体系结构中,CPU 是对计算机的所有硬件资源(如存储器、输入输出单元) 进行控制调配、执行通用运算的核心硬件单元。CPU 是计算机的运算和控制核心。计算机系统中所有软件层的操作,最终都将通过指令集映射为CPU的操作。 在计算机体系结构中,CPU 是对计算机的所有硬件资源(如存储器、输入输出单元) 进行控制调配、执行通用运算的核心硬件单元。CPU 是计算机的运算和控制核心。计算机系统中所有软件层的操作,最终都将通过指令集映射为CPU的操作。 在计算机体系结构中,CPU 是对计算机的所有硬件资源(如存储器、输入输出单元) 进行控制调配、执行通用运算的核心硬件单元。CPU 是计算机的运算和控制核心。计算机系统中所有软件层的操作,最终都将通过指令集映射为CPU的操作。 在计算机体系结构中,CPU 是对计算机的所有硬件资源(如存储器、输入输出单元) 进行控制调配、执行通用运算的核心硬件单元。CPU 是计算机的运算和控制核心。计算机系统中所有软件层的操作,最终都将通过指令集映射为CPU的操作。 工作原理 冯诺依曼体系结构是现代计算机的基础。在该体系结构下,程序和数据统一存储,指令和数据需要从同一存储空间存取,经由同一总线传输,无法重叠执行。根据冯诺依曼体系,CPU的工作分为以下 5 个阶段:取指令阶段、指令译码阶段、执行指令阶段、访存取数和结果写回 结构: 运算器:指计算机中进行各种算术和逻辑运算操作的部件, 其中算术逻辑单元是中央处理核心的部分 控制器:控制器是指按照预定顺序改变主电路或控制电路的接线和 改变电路中电阻值来控制电动机的启动、调速、制动与反向的主令装置 寄存器:寄存器是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。其实寄存器就是一种常用的时序逻辑电路,但这种时序逻辑电路只包含存储电路…… 阅读全文

领域驱动开发分享

2018-09-14 21:18:25

摘要:前言 微服务已经成为目前开发的主流设计,我们也要与时俱进不能一直还停留在三层架构的思想层面。微服务设计过程中往往会面临边界如何划定的问题,微服务到底应该拆多小,不同的人会根据自己对微服务的理解而拆分出不同的微服务,如何我们还是不经过设计,只是靠拍脑袋硬完成开发的话,上线后运维的压力将会远大于单体程序。那是否有合适的理论或设计方法来指导微服务设计呢?答案就是DDD。微服务拆分困境产生的根本原因就是不知道业务或者微服务的边界到底在什么地方。换句话说,确定了业务边界和应用边界,这个困境也就迎刃而解了. 2004 年埃里克·埃文斯(Eric Evans)发表了《领域驱动设计》(Domain-Driven Design –Tackling Complexity in the Heart of Software)这本书,从此领域驱动设计(Domain Driven Design,简称 DDD)诞生。DDD 核心思想是通过领域驱动设计方法定义领域模型,从而确定业务和应用边界,保证业务模型与代码模型的一致性。但 DDD 提出后在软件开发领域一直都是“雷声大,雨点小”!直到 Martin Fowler 提出微服务架构,DDD 才真正迎来了自己的时代。利用 DDD 设计方法来建立领域模型,划分领域边界,再根据这些领域边界从业务视角来划分微服务边界。而按照 DDD 方法设计出的微服务的业务和应用边界都非常合理,可以很好地实现微服务内部和外部的“高内聚、低耦合”。于是越来越多的人开始把 DDD 作为微服务设计的指导思想。现在,很多大型互联网企业已经将 DDD 设计方法作为微服务的主流设计方法了。DDD 也从过去“雷声大,雨点小”,开始真正火爆起来。 DDD知识体系 领域 领域不断划分的过程中,领域会细分为不同的子域,子域可以根据自身重要性和功能属性划分为三类子域,它们分别是:核心域、通用域和支撑域。 核心域:系统最核心并有复杂业务逻辑的业务界限上下文,比如OA系统的物资管理。 支撑域:系统支撑其他界限上下文的基础,比如OA系统的员工基础资料。 通用域:需要使用的基础框架或第三方成熟解决方案,比如OA系统工作流引擎。 工作流引擎是个比较大的领域,目前我们的工作流引擎把所有的功能都放在OA系统里面,这就是一个单体系统。假设想引入分布式微服务架构来替换这个单体系统。那分布式微服务架构就需要划…… 阅读全文

自定义特性+AOP实现缓存

2018-08-21 22:37:30

摘要:1. 目标 如下代码:我们要实现缓存,但希望让使用者不用关心缓存的具体实现,只需要使用者在要操作缓存的方法上加上特性标注即可。 [Caching(CachingMethod.Remove, GetLinksQuery)] public class CreateLinkCommand {     } [Caching(CachingMethod.Get)] public class GetLinksQuery : IRequestListLinkViewModel {     } 要实现我们的目标,我们把任务分成2部分,首先实现缓存逻辑,然后将缓存基于特性做AOP实现。 2. 缓存实现 首先我们定义一个缓存接口 public interface ICacheProvider {    /// summary    /// 向缓存中添加一个对象。    /// /summary    /// param name=key缓存的键值,该值通常是使用缓存机制的方法的名称。/param    /// param name=valKey缓存值的键值,该值通常是由使用缓存机制的方法的参数值所产生。/param    /// param name=value需要缓存的对象。/param    void Add(string key, string valKey, object value);    void Put(string key, string valKey, object value);    object Get(string key, string valKey);    void Remove(string key);    bool Exists(string key);    bool Exists(string key, string valKey); } 如上代码,为什么接口中key和valKey2个参数呢?这是因为我们可能会缓存同一个方法不同参数的结果,如在一个获取分页结果的方法中,我们可能会返回不同页的结果。如我们目标中GetLinksQuery方法缓存的值会是一个分页显示结果的字典。key是我们缓存的方法名,valKey这是缓存的字典结果中的字典key,value则是字典的结果。要进一步理解可以查看下面基于内存的默…… 阅读全文

Markdig:.NET Markdown解析器详解

2018-07-21 15:55:07

摘要:在现代开发中,Markdown 已经成为了一种广泛使用的轻量级标记语言,特别是在文档、博客和内容管理系统中,Markdown 为开发者提供了快速、简洁的格式化文本方式。而在 .NET 生态中,Markdig 是一款非常强大的 Markdown 解析器,它不仅支持标准的 Markdown 语法,还提供了许多扩展功能,让开发者能够灵活地定制 Markdown 文本的解析与渲染。 本文将详细介绍 Markdig 的基本用法、扩展功能、定制渲染及自定义扩展等方面,帮助你深入理解 Markdig,并充分发挥它的强大能力。 1. Markdig 简介 Markdig 是一款基于 .NET 平台的 Markdown 解析器,它具有以下特点: 高性能:Markdig 采用了优化的解析方式,在解析大文件时表现出色。 扩展性强:Markdig 支持多种扩展功能,能够满足不同 Markdown 渲染需求。 完全兼容 CommonMark:Markdig 完全兼容 CommonMark 规范,支持大多数标准 Markdown 语法,并且在此基础上提供了额外功能。 易于自定义:Markdig 允许开发者定制解析器和渲染器,甚至可以编写自己的扩展功能。 1.1 安装 Markdig 要在 .NET 项目中使用 Markdig,可以通过 NuGet 包管理器安装: dotnet add package Markdig 安装完成后,你就可以在项目中引用 Markdig 命名空间,开始使用它提供的功能。 2. 基本用法 Markdig 提供了一个简单的接口,用于将 Markdown 文本转换为 HTML。最基础的用法是通过 Markdown.ToHtml() 方法来进行转换: using Markdig; string markdown = # Hello, World!\nThis is a Markdown text!; string html = Markdown.ToHtml(markdown); Console.WriteLine(html); 输出: h1Hello, World!/h1 pThis is a Markdown text!/p 这段代码展示了如何将一个简单的 Markdown 字符串转化为 HTML。在这个例子中,Markdig 自动将 # Hello,…… 阅读全文

微服务落地方案

2018-05-10 10:54:43

摘要:#本方案定义公司实施微服务的开发标准,规定了源码的分层结构、各层次的编码规范;单个微服务采用CQRS架构;微服务间使用gRCP通信;并提供了微服务需要的基础设施,如ELK,下面具体说明: 分层 领域层 基础设施层 应用层 共享层 注意: 领域模型专注业务的设计,不依赖仓储等基础设施层 基础设施的仓储层仅负责领域模型的取出和存储 使用CQRS 模式设计应用层 Web API 是面向前端的交互的接口,避免依赖领域模型 定义Entity,区分内在逻辑和外部行为 将领域模型字段的修改设置为私有 使用构造函数表示对象的创建 使用具有业务含义的动作来操作模型字段 领域模型负责对自己数据的处理 领域服务或命令处理者负责调用领域模型业务动作 工作单元模式(UnitOfWork) 使用同一上下文 跟踪实体的状态 保障事务一致性 使用EF实现仓储 领域事件来实现模块解耦 由领域模型内部创建事件 由专有的领域事件处理类处理领域事件 根据实际情况来决定是否在同一事务中处理(如一致性、性能等因素) 集成事件解决跨服务最终一致性 集成事件是跨服务的领域事件 集成事件一般由领域事件驱动触发 不通过事务来处理集成事件(实现最终一致性) 仅在必要的情况下定义和使用集成事件 用RabbitQM来实现EventBus MediatR实现CQRS IMediator IRequest、IRequest IRequestHandlerin TRequest, TResponse INotification INotificationHandler gRPC实现内部服务间通信 gRPC的特点: 提供几乎所有主流语言的实现,打破语言隔阂 基于HTTP/2 ,开放协议,受到广泛的支持,易于实现和集成 默认使用Protocol Buffers 序列化,性能相较于RESTful Json 好很多 工具链成熟,代码生成便捷,开箱即用 支持双向流式的请求和响应,对批量处理、低延时场景友好 NET 生态对gRPC 的支持情况 提供基于HttpClient 的原生框架实现 提供原生的ASP.NET Core 集成库 提供完整的代码生成工具 Visual Studio 和Visual Stuido Code 提供proto 文件的智能提示 网关区分场景与职责 Polly组…… 阅读全文

kubernetes deployment部署机制详解

2018-04-23 11:27:20

摘要:Deployment 使用 Kubernetes提供了一种更加简单的更新RC和Pod的机制,叫做Deployment。通过在Deployment中描述你所期望的集群状态,Deployment Controller会将现在的集群状态在一个可控的速度下逐步更新成你所期望的集群状态。Deployment主要职责同样是为了保证pod的数量和健康,90%的功能与Replication Controller完全一样,可以看做新一代的Replication Controller。但是,它又具备了Replication Controller之外的新特性:Replication Controller全部功能:Deployment继承了上面描述的Replication Controller全部功能。 事件和状态查看:可以查看Deployment的升级详细进度和状态。 回滚:当升级pod镜像或者相关参数的时候发现问题,可以使用回滚操作回滚到上一个稳定的版本或者指定的版本。 版本记录: 每一次对Deployment的操作,都能保存下来,给予后续可能的回滚使用。 暂停和启动:对于每一次升级,都能够随时暂停和启动。 多种升级方案:Recreate----删除所有已存在的pod,重新创建新的; RollingUpdate----滚动升级,逐步替换的策略,同时滚动升级时,支持更多的附加参数,例如设置最大不可用pod数量,最小升级间隔时间等等。 #创建命令:kubectl create -f deployment.yaml --record #使用rollout history命令,查看Deployment的历史信息:kubectl rollout history deployment cango-demo #使用rollout undo回滚到上一版本: kubectl rollout undo deployment cango-demo #使用–to-revision可以回滚到指定版本: kubectl rollout undo deployment hello-deployment --to-revision=2 1234 ConfigMap 配置 在几乎所有的应用开发中,都会涉及到配置文件的变更,比如说在web的程序中,需要连接数据库,缓存甚至是队列等等。 一些大公司专门开发了自己…… 阅读全文

微服务架构(九):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)工具,其目的在于帮助每一个使用 Kuberente…… 阅读全文

微服务设计(八):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 18.06.1.ce-3.…… 阅读全文

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

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 Collecter:…… 阅读全文

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

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状态 ra…… 阅读全文