自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(227)
  • 资源 (1)
  • 问答 (1)
  • 收藏
  • 关注

原创 模拟实现.net中的Task机制:探索异步编程的奥秘

回顾开头的两个问题,现在可以尝试给出答案了。Task是什么,Task是一种有状态的操作(Created,Scheduled,Running,Completed),是对耗时操作的抽象,就像现实中的一项任务一样,它的执行需要相对较长的时间,它也有创建(Created),安排(Scheduled),执行(Running),完成(Completed)的基本过程。任务完成当然需要拿到结果的,这里的Job比较简单,没有模拟具体的结果;

2023-11-01 23:06:42 681

原创 《如何阅读一本书》笔记

书不同于衣服或家具,付钱购买一本书只是真正拥有这本书地前奏而已,要真正完全拥有一本书,必需把这本书变成你自己地一部分。

2023-02-27 12:18:22 386

原创 记一次Prometheus监控下的“内存飙升”事件

错误的表达式+重叠的时间序列”共同造成了内存飙升的假象,为了找出时间序列重叠的原因,我们了解到了Prometheus的联邦集群、高可用机制,以及这些特性的局限和特点;而针对错误的表达式的修改,则需要兼顾去除重叠时间序列的影响,为此可以通过合理使用PromQL的sum/max聚合函数来达到去重的目的。

2022-09-23 17:28:42 3188

原创 初识GraphQL

最近项目上接触到了GraphQL,但由于对其的理解很不足,应用的时候出现了很多问题和困扰。此外,GraphQL据说是为了替代RestFul,但在为数不多的实践中,GraphQL并没有像Docker、K8S那样带给人直观的颠覆性体验,可能随着使用经历的增加,会有新的体会吧。本文属入门性质,分两部分:GraphQL与RestFul、SQL、BFF的对比GraphQL基础。......

2022-08-05 16:43:14 637

原创 Prometheus的一些基础知识

核心组件任务和实例时间序列PromQL核心组件Prometheus是一个开源的监控告警系统,它支持按多个维度存储监控数据,配套的PromQL可以对数据进行灵活的查询。下图为其整体的架构:主要包含四部分:Prometheus Server,Prometheus Server用于从Exporters拉取数据,将采集到的监控数据按照时间序列的方式存储在本地磁盘当中(Prometheus Server本身也是一个时序数据库);并支持通过PromQL和通过API Client对数据进行查询; 它还负责通过服务发现或者

2022-05-31 08:33:22 1426

原创 领域驱动设计(3) DDD设计流程

战略设计产品愿景与场景分析领域建模微服务拆分战术设计分析微服务领域对象设计微服务代码结构DDD整体包含战略设计和战术设计两部分。战略设计过程会从业务视角出发,进行场景分析、领域建模,并划分领域边界、建立通用语言、确定限界上下文;战术设计则关注如何将模型转化为软件实现,涉及聚合根、实体、值对象、领域服务、应用服务等概念。所以战略设计重在把控方向、建立模型,战术设计重在软件实现,战略设计的好坏直接决定了DDD能否成功实施。所以除了关注DDD战术设计中用到的工具集、思想(比如四层架构、CQRS等)之外,更应该关注

2022-04-10 12:08:13 1368

原创 领域驱动设计(2) 领域事件、DDD分层架构

领域事件什么是领域事件为什么需要领域事件微服务场景下的领域事件领域事件的实现DDD的分层架构DDD分层架构如何推动微服务演进领域事件什么是领域事件在事件风暴过程中,会识别出命令、业务操作、实体等,此外还有事件。比如当业务人员的描述中出现类似“当完成...后,则...”,“当发生...时,则...”等模式时,往往可将其用领域事件来实现。领域事件表示在领域中发生的事件,它会导致进一步的业务操作。如电商中,支付完成后触发的事件,会导致生成订单、扣减库存等操作。为什么需要领域事件领域事件的最终目的是为了实现聚合之间

2022-03-27 18:20:31 3868

原创 领域驱动设计(1) DDD的一些基础概念

什么是DDDDDD的特点战略设计、战术设计DDD在微服务中解决的问题DDD的好处与局限领域领域、子域核心域、通用域、支撑域通用语言、限界上下文通用语言限界上下文实体、值对象实体值对象聚合和聚合根聚合聚合根如何设计聚合聚合的设计原则什么是DDD看了一些DDD的介绍、教程,这些教程无一例外都会讲一个关于美好邂逅的故事,故事的情节大概是这样的:DDD是2004年出现的,但一直不温不火,直到十来年后出现了微服务,大家在落地微服务的时候遇到了各种各样的问题,其中就有一个很让人头疼的:“微服务到底要多微”?,大家总说纷

2022-03-20 21:08:11 608

原创 如何落地业务建模(5) 云时代的挑战

弹性边界还是业务边界弹性边界拆分微服务,弹性优先还是业务优先弹性优先对业务建模的挑战如何保持弹性边界的独立性弹性边界间的依赖与耦合如何避免弹性耦合默认异步对业务建模的挑战弹性边界还是业务边界前面的内容可以看做对DDD打的两个大补丁:通过不同的上下文对象,弥补原生对象模型从单体架构过渡到多层架构时的各种水土不服;通过不同的建模方法,从业务维度展开入手,以不同的角度寻找可以被建模成对象的领域概念。如果希望达成如下诉求:采用DDD设计的两关联一循环作为主要沟通协作的方式;将模型作为统一语言,并用于提炼知识的循环;

2022-02-25 12:36:44 2050

原创 如何落地业务建模(4) 将模型实现为RESTful API

什么风格的API适合作为模型API行为角度数据角度将模型映射为RESTful API1.通过URI表示领域模型2. 根据URI设计API3.使用分布式超媒体设计API中涉及的资源4. 使用得到的API去覆盖业务流程,验证API的完整性DDD受到行业热捧的一个原因是:它设法寻找到一个在软件系统生命周期内稳固不变的点,由它构成架构、协同、交流的基础,帮助我们更好的应对软件中的不确定性。而API作为对外暴露的接口,也是需要保持高稳定性的组件。最好能像领域模型一样稳定。于是通过领域模型驱动获得API的设计(Doma

2022-01-22 21:39:55 2950

原创 如何落地业务建模(3) 将模型作为统一语言

统一语言可以是模型本身吗事件建模法的基本原则1:通过事件表示交互事件建模法的基本原则2:通过时间线划分不同事件业务是模型的隐藏维度催化剂建模法角色-目标-实体法(Role-Goal-Entity)事件建模法(Event-Based modeling)事件风暴法怎么才能更有效地获得事件流四色建模法的核心逻辑:从收入流与成本结构中寻找事件四色建模法的具体操作流程头脑风暴法的不足四色建模法(4 color modeling)统一语言可以是模型本身吗前面讨论过统一语言的必要性,因为业务维度在领域模型中被隐藏了,而且

2022-01-15 16:19:03 1784

原创 如何落地业务建模(1) 业务建模、DDD

业务建模如何定义问题并让所有人接受如何在特定架构下实现模型解决问题还是定义问题业务建模的难点学习业务建模的建议领域驱动设计从贫血模型到富含知识的模型通过聚合关系表达业务概念修改模型就是修改代码知识消化的五个步骤领域模型对于业务系统是更好的选择知识消化模型与软件实现关联统一语言是必要的吗统一语言是基于领域模型的共同语言修改代码就是改变统一语言一个简单的统一语言提案如何理解DDD迭代式试错建模法具有协同效应的工作方式价值观体系示例将提炼知识的循环看做开发流程研发方与业务方的协同效应当讨论DDD时,我们到底在说什

2022-01-15 13:32:26 4126

原创 Nginx基础学习

Nginx介绍Nginx是一款高性能的Web服务器,最初由俄罗斯程序员Igor Sysoev开发,自2004年问世以来,凭借其高性能、高可靠、易扩展等优点,在反向代理、负载均衡、静态文件托管等主流场合得到了广泛的应用。Nginx具有以下优点。高性能:相比于其他Web服务器如Apache,在正常请求以及高峰请求期,可以更快地响应请求。高可靠:Nginx采用多进程模型,分为主进程和工作进程。主进程负责监视工作进程,当工作进程异常退出时,可以快速拉起一个新的工作进程,从而为用户提供稳定服务高并发:Ng

2021-11-30 20:53:14 2078

原创 Kubernetes笔记(10) - Helm

应用微服务化后虽然便于部署和扩展,实现了敏捷开发和运维,但另一方面,在将单体应用微服务化后,往往又导致了应用管理复杂度的增加,例如,在Kubernetes系统之上,每个应用基本上都有着不止一个资源,而每个应用又有不同的环境(如qa、test和prod等),这会使得配置清单数量变得非常多而且维护起来非常复杂,而借助Helm可以简化资源的管理。Helm基础简单来说,Helm就是Kubernetes的应用程序包管理器,类似于Linux系统之上的yum或apt-get等,可用于实现帮助用户查找、分享及使用Kub

2021-07-17 11:18:53 161 1

原创 Kubernetes笔记(9) - 认证、授权与准入控制

访问控制概述用户账号与服务账号用户组认证授权Service Account的管理与应用Service Account自动化创建服务账户调用imagePullSecret资源对象RBAC:基于角色的访问控制Role和RoleBindingClusterRole和ClusterRoleBinding准入控制器LimitRanger准入控制器ResourceQuota资源与准入控制器访问控制概述API Server作为Kubernetes集群系统的网关,.

2021-06-19 21:25:06 290

原创 Kubernetes笔记(8) - ConfigMap和Secret

ConfigMap创建ConfigMap对象基于字面值创建基于文件创建基于目录创建使用配置清单创建通过环境变量传递ConfigMap数据envFrom通过ConfigMap存储卷传递数据挂载整个存储卷挂载存储卷中的部分键值Secret创建Secret资源命令式创建基于配置清单创建Secret存储卷imagePullSecret资源对象ConfigMap和Secret是Kubernetes系统上两种特殊类型的存储卷,ConfigMap.

2021-06-12 22:39:06 179

原创 Kubernetes笔记(7) - 存储卷与数据持久化

存储卷的使用方式临时存储卷emptyDir节点存储卷hostPath网络存储卷NFS存储卷RBD存储卷GlusterFS存储卷Cinder存储卷PersistentVolumeClaim创建PV创建PVC在Pod中使用PVCdownwardAPI存储卷环境变量式元数据注入存储卷式元数据注入Pod被销毁时,其内部容器的数据也无法持久存在。与Docker类似,K8S也支持配置容器使用存储卷将数据持久存储于容器自身文件系统之外的存储空间中,它们可以是节点文件系统.

2021-06-06 21:02:29 413

原创 Kubernetes笔记(6) - Service和Ingress

Service资源概述创建Service资源向Service对象请求服务Service会话粘性服务发现服务暴露Ingress和Ingress ControllerIngress资源Ingress控制器Service资源概述Service是Kubernetes的核心资源类型之一,它通过规则定义出由多个Pod对象组合而成的逻辑集合,以及访问这组Pod的策略。由Deployment等控制器管理的Pod对象在中断或扩缩容后,Pod组合的IP地址都会发生变化,而引入Service.

2021-05-16 07:55:05 277 1

原创 Kubernetes笔记(5) - Pod控制器

ReplicaSet控制器创建ReplicaSetReplicaSet管控下的Pod对象更新ReplicaSetDeployment控制器创建Deployment更新策略升级Deployment金丝雀发布扩容、缩容DaemonSet控制器Job控制器串行、并行控制删除JobCornJob控制器Pod中断预算自主式Pod对象由调度器绑定至目标工作节点后即由相应节点上的kubelet负责监控其容器的存活性,容器主进程崩溃后,kubelet能够自动重启相应的容.

2021-05-04 21:52:48 193

原创 Kubernetes笔记(4) - Pod

容器与Pod的关系Sidecar pattern(边车模式)管理Pod对象的容器定义镜像的获取策略暴露端口自定义运行的容器化应用环境变量标签与标签选择器标签的管理标签选择器资源注解Pod对象的生命周期PhasePod的创建过程Pod生命周期中的重要行为用于初始化的容器生命周期钩子函数容器的重启策略Pod的终止过程Pod存活性探测exechttpGettcpSocket存活性探测行为属性Pod就绪性探测资源需求及资源限制.

2021-04-08 08:43:43 166

原创 Kubernetes笔记(3) - 资源管理基础

Kubernetes系统将一切事物都抽象为API资源,其遵循REST架构风格组织并管理这些资源及其对象,同时还支持通过标准的HTTP方法(POST、PUT、PATCH、DELETE和GET)对资源进行增、删、改、查等管理操作。Kubernetes的资源对象大体可分为工作负载(Workload)服务发现和负载均衡(Discovery & LB)配置和存储(Config & Storage)集群(Cluster)元数据(Metadata)资源对象及API群组工作负载Pod是

2021-04-02 21:03:18 343 1

原创 Kubernetes笔记 (2) - 资源对象、kubectl

Kubernetes集群将所有节点上的资源都整合到一个大的虚拟资源池里,以代替一个个单独的服务器。如果把集群类比为一台传统的服务器,那么Kubernetes(Master)就好比是操作系统内核,其主要职责在于抽象资源并调度任务,而Pod资源对象就是那些运行于用户空间中的进程。资源对象API Server提供了RESTful风格的编程接口,其管理的资源是Kubernetes API中的端点,用于存储某种API对象的集合。Pod、Deployment和Service等都是最常用的核心对象。Pod资源对象

2021-03-27 21:23:22 275

原创 Kubernetes笔记 (1) - 系统概述

Kubernetes概述Kubernetes由google开源,它的开发和设计都深受Google内部久负盛名的系统Borg的影响,而且,它的许多顶级贡献者之前也是Borg系统的开发者。Borg是Google内部使用的大规模集群管理系统。Kubernetes吸取了Borg在过去十数年间积累的经验和教训,刚刚面世就立即广受关注和青睐,目前已经成为容器编排领域事实上的标准。很多人将Kubernetes视为Borg系统的一个开源实现版本。Kubernetes使用共享网络将多个物理机或虚拟机汇集到一个集群中,在

2021-03-21 08:43:04 142 1

原创 《深入浅出React和Redux》(4) - 服务器通信、单元测试

与服务器通信与服务器通信的时长不可控,需要采用异步的形式,可以使用js的fetch函数来调用api。fetch函数fetch函数的基本使用形式为:fetch(apiUrl).then((response) => { if (response.status !== 200) { throw new Error('Fail to get response with status ' + response.status); } response.json().then((res

2021-02-23 21:13:06 161

原创 《深入浅出React和Redux》(3) - Export & Import, 高阶组件

Export & Importexport可以导出函数、class等,有两种导出方式:默认导出(default export)命名导出(named export)默认导出(default export)default export不需要指定名称,但每个文件中只能有一个default export// 导出纯值或表达式结果export default 1;const a = 1;export default a;// 导出函数export default function(

2021-02-19 07:24:14 153

原创 《深入浅出React和Redux》(2) - Redux

Redux是Flux理念的一种实现。关于Flux理念可以通过类比MVC模式来做简单理解。MVC模式中,用户请求先到达Controller,由Controller调用Model获得数据,然后把数据交给View,按照这种模式,MVC应该也是一个controller->model->view的单向数据流,但是,在实际应用中,由于种种原因,往往会让view直接操作Model,随着应用的演进、逻辑变得越来约复杂,view与model之间的关系就会变得错综复杂、难以维护。在MVC中让View和Model

2021-02-08 20:48:45 122

原创 《深入浅出React和Redux》(1) - React基础

create-react-appReact技术依赖的技术栈比较多,比如,转译JavaScript代码需要使用Babel,模块打包工具要使用Webpack,定制build过程需要grunt或者gulp。create-react-app命令可以免去配置这些技术栈的麻烦,自动生成一个基本的react-app模版项目,让开发者可以基于这个模版快速开始React应用的开发。首先要安装create-react-app命令:npm install --global create-react-app然后就可以创建

2021-02-06 09:06:31 183 1

原创 《Effective C#》笔记(5) - 异常处理

程序总是会出错的,因为即便开发者做得再仔细,也还是会有预料不到的情况发生。令代码在发生异常时依然能够保持稳定是每一位C#程序员所应掌握的关键技能。.NET Framework Design Guidelines建议,如果方法不能完成调用者所请求的操作,那就可以考虑抛出异常,此时必须提供各种信息,使得调用者能够据此诊断问题。此外,还必须保证如果应用程序能够从错误中恢复,那么必须处在某种已知的状态。考虑在方法约定遭到违背时抛出异常如果方法不能够履行它与调用者所订立的契约,那就应该让它其抛出异常。这些无法

2021-02-02 21:12:38 98

原创 《Effective C#》笔记(4) - Linq

优先考虑提供迭代器方法,而不要返回集合在创建这种返回一系列对象的方法时,应该考虑将其写成迭代器方法,使得调用者能够更为灵活地处理这些对象。迭代器方法是一种采用yield return语法来编写的方法,采用按需生成(generate-as-needed)的策略,它会等到调用方请求获取某个元素的时候再去生成序列中的这个元素。类似下面这个简单的迭代器方法,用来生成从0到9的int序列:public static IEnumerable<int> GetIntList() { var

2021-02-01 22:17:20 101

原创 《Effective C#》笔记(3) - 泛型

只定义刚好够用的约束条件泛型约束可以规定一个泛型类必须采用什么样的类型参数才能够正常地运作。设定约束条件的时候,太宽或太严都不合适。如果根本就不加约束,那么程序必须在运行的时候做很多检查,并执行更多的强制类型转换操作。而且在编译器为这个泛型类型的定义生成IL码的时候,通过约束还可以为提供更多的提示,如果你不给出任何提示,那么编译器就只好假设这些类型参数所表示的都是最为基本的System.Object,也就是假设将来的实际类型只支持由System.Object所公布的那些方法,这使得凡是没有定义在Syst

2021-01-31 22:24:21 83

原创 《Effective C#》笔记(2) - .NET的资源管理

理解并善用.NET的资源管理机制.NET环境会提供垃圾回收器(GC)来帮助控制托管内存,这使得开发者无须担心内存泄漏等内存管理问题。尽管如此,但如果开发者能够把自己应该执行的那些清理工作做好,那么垃圾回收器会表现得更为出色。非托管的资源是需要由开发者控制的,例如数据库连接、GDI+对象、IO等;此外,某些做法可能会令对象在内存中所待的时间比你预想的更长,这些都是需要我们去了解、避免的。GC的检测过程是从应用程序的根对象出发,把与该对象之间没有通路相连的那些对象判定为不可达的对象,也就是说,凡是无法从应用

2021-01-30 22:39:50 116

原创 《Effective C#》笔记(1) - 编程习惯

1.优先使用隐式类型的局部变量推荐优先使用隐式类型的局部变量,即用var来声明,因为这可以令人把注意力放在最为重要的部分,也就是变量的语义上面,而不用分心去考虑其类型.有时隐式类型比自己指定类型表现更好用var来声明的变量不是动态变量,隐式类型的局部变量的类型推断也不等于动态类型检查。只是编译器会根据赋值符号右侧的表达式来推断变量的类型。var的意义在于不用专门指定变量的类型,而是交给编译器来判断,所以局部变量的类型推断机制并不影响C#的静态类型检查。有时隐式类型会有比专门指定类型更好的表现,比如下

2021-01-29 22:08:42 138

原创 Serilog在 ASP.NET CORE的使用

初始化要用Serilog替换原生的Log,需要做如下配置:添加Nuget:dotnet add package Serilog.AspNetCore修改Main方法public static void Main(string[] args){ Log.Logger = new LoggerConfiguration() .MinimumLevel.Information() .MinimumLevel.Override("Microsoft", LogEventLevel.

2021-01-09 08:38:55 1800

原创 设计模式(23) 访问者模式

由于应用开发过程中先前完成的类型会因为需求变化(无论是业务功能,还是技术实现或是出于集成的需要)增加新的方法,如果直接在基类中增加新的方法,其派生类型可能需要相应进行比较繁琐的处理。而使用访问者模式可以做到在不改变既有类型层次的前提下,运行时动态为类型层次的每个类增加新的操作。访问者模式GOF对策略模式的描述为:Represent an operation to be performed on the elements of an object structure. Visitor lets you

2020-09-24 21:41:35 89

原创 设计模式(22) 策略模式

在策略模式中,一个类的行为或算法可以在运行时动态更改。GOF对策略模式的描述为:Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients.— Design Patterns : Elements of Reusable Object-Oriented SoftwareUML

2020-09-19 20:44:58 99

原创 设计模式(21) 状态模式

状态模式允许一个对象在其内部状态改变时改变它的行为。用电梯来举例,电梯可以认为具有开门、关门、运行、停止四种状态,这四种状态之间的切换具有多种限制,比如在开门状态下不电梯不能运行,只能转为关门状态;在运行状态下,电梯只能转为停止状态…设想一下,如果要常规的if-else或者switch-case描述电梯的这几种状态间的切换,将生成非常复杂的、逻辑相互交织的代码,可读性差且不易维护。而如果用状态模式来实现,会是怎样的呢?首先创建LiftState,代表抽象的电梯状态,包含了电梯的四个动作(方法),通过这

2020-09-07 21:31:26 567

原创 设计模式(20) 观察者模式

观察者模式是一种平时接触较多的模式。它主要用于一对多的通知发布机制,当一个对象发生改变时自动通知其他对象,其他对象便做出相应的反应,同时保证了被观察对象与观察对象之间没有直接的依赖。GOF对观察者模式的描述为:Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically…— D

2020-08-29 21:53:31 108

原创 设计模式(19) 备忘录模式

备忘录模式可以在不破坏封装的前提下,将一个对象的状态捕捉(Capture)住,并在外部存储,从而可以在需要的时候把这个对象还原到存储起来的状态。备忘录模式常常与命令模式和迭代器模式一同使用。GOF对备忘录模式的描述为:Without violating encapsulation, capture and externalize an object’s internal state so that the object can be restored to this state later.— Des

2020-08-24 21:33:02 123

原创 设计模式(18) 中介者模式

一个软件系统中往往包含了很多的类,这些类之间会存在互相的调用,随着系统的升级、功能的扩展,这些相互调用关系会变得非常复杂,,大量的相互连接使得这样一个类型系统不太可能在没有其他类支持的情况下独立完成工作,久而久之这些类将变得像一个不可分割的整体,内部有着错综复杂的关联。这会导致后期维护特别困难,对系统或模块的任何较大的变动都可能造成无法预知的问题。中介者模式中介者模式可以解决这种问题。它通过提供一个中介类,来处理不同类之间的通信,这样可以降低多个类之间的通信复杂度,使代码更易于维护。中介者模式属于行为型

2020-08-23 21:26:43 109

原创 设计模式(17) 迭代器模式

迭代器模式基于IEnumerable的实现使用场景迭代器模式的优缺点迭代器模式迭代器模式用于顺序访问集合对象的元素,而不需要知道集合对象的底层表示。Java和.Net等语言已经将迭代器作为其内部语法元素,比如在C#中,集合对象只需要实现IEnumberable接口,然后就可以用foreach来遍历了。迭代器模式提示我们要从使用者的角度考虑如何设计接口,如何对外提供访问内部对象的方式。即便我们组织的对象系统内部结构很复杂,但对于客户程序而言最简单的方式莫过于通过for /foreach循环依次.

2020-08-11 21:26:38 83

S7-GRAPH编程手册

西门子STEP7的顺序功能图语言编程指导

2013-03-18

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

TA关注的人

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