Web Analytics
yangyang

码农兼一个普普通通小青年

DotNet Framework


解决Windows上Docker Desktop中Kubernetes一直处于starting的问题

前面三篇文章已经了解了Docker的基本用法,后面应该是要继续看Docker Swarm的,结果发现这个已经不流行了,流行的是Kubernetes,所以这篇文章开始就开始学习Kubernetes了。 遇到的问题     电脑的操作系统是Windows 10,安装的是最新的Docker Desktop,这个里面本来就有单节点的Kubernetes,所以想着把环境搭建一下,默认情况下,Kubernetes是没有启动的。在设置里可以启动。     目前Kubernetes的最新版本是v1.19.7,在设置里面Kubernetes项目里,可以开启,然而,并不顺利。     勾选“Enable Kubernetes”之后,一直状态一直显示"Starting...",等待很久很久,最后就会失败,左下角第二个图标也是黄色或者红色,表示遇到错误。 解决办法     “出师未捷身先死”,环境启动不起来,于 …

Docker kubernetes

在Docker中运行ASP.NET Core MVC程序:使用docker-compose

在前面一篇文章中,演示了一个ASP.NET Core MVC应用程序,这个程序使用了MySQL,负载均衡,涉及到要创建多个容器,Volume卷以及自定义网络。这种纯手工的方式很容易出错,不仅每一个命令必须输入正确,并且每个步骤还要按照先后顺序来输入,比如再创建MySQL容器的时候,必须事先把其依赖的卷创建好。如果漏了某个步骤,或者某个步骤顺序发送错误,则程序就运行不起来。如果应用程序架构比较简单,这种问题不大,但当应用程序设计模块比较多时,可能会想到自己编写一些脚本来实现自动化,而Docker为我们提供了docker-compose功能,利用这以功能可以实现对复杂应用的管理,包括容器,Volume,自定义网络中。 准备工作     在开始之前,我们将之前创建的容器,网络和Volume都删掉,这些我们在后续都可以通过docker-compose来创建。 docker rm -f $( …

Docker HAProxy Load Balance Docker Compose

在Docker中运行ASP.NET Core MVC程序:Docker卷、自定义网络和负载均衡

在前面一篇中,我们使用了模拟的数据DummyRepository,数据是存储在内存中的,然而在实际应用中,一般数据是存放在数据库中,所以数据库应该也有单独的容器来承载,那数据库文件呢?这里就用到了Volume, 在这一篇我们会接触到Docker里的两个重要概念:Volume 卷和Software-define Network自定义网络。     Volume是卷的意思,我们能够将数据库或者应用程序产生的重要数据,存放在单独的Volume,而不是容器内,这样容器删除或者变更不会对这些数据产生影响。     Software-define Network,软件自定义网络是一种Docker内的网内协议,允许容器内的应用程序能够相互通讯。 了解Volume     应用程序可能会用到两只类型的文件:运行应用程序所需的文件,包括常见的dll,资源文件等等;应用程序所产生的文件,比如由于用户操作,所产 …

Docker HAProxy Load Balance Volume SDN

在Docker中运行ASP.NET Core MVC程序:Docker基本用法

Docker是一系列创建和管理容器的工具,它能够将服务器上的应用程序相互隔离起来。这一系列文章是我学习在ASP.NET Core MVC中使用Docker实践的学习笔记,参考《Essential Docker for ASP.NET Core MVC》这本书。 Docker能解决什么问题? Docker能解决ASP.NET Core MVC项目中存在的两个复杂性问题:一致性问题和响应性问题。 一致性问题     大部分的ASP.NET Core MVC应用都由多个组件组成,比如至少需要一个服务器来运行MVC应用,以及一个数据库用来持久化数据。     一些复杂的应用可能还需要其他的一些组件,比如多应用服务器来共享工作量,负载均衡用来在多个服务器之间分发HTTP请求、数据缓存组件用来提供性能。随着组件的增加,额外的服务器可能会被加入进来,这就需要网络将这些组件连接起来,命名服务器用来提供服务 …

ASP.NET Core MVC Docker Visual Studio Code Docker Image Docker Container

C#设计模式之观察者模式

观察者模式,简单来说就是一个组件在状态发生变化的时候,可以通知其它组件。观察者模式用途很广,比如在UI界面中,当绑定的数据对象发送改变,UI会跟着发送改变。观察者模式是一种很常见和必要的模式,C#的设计者通过关键字event来简化对观察者模式的使用。它的基本用法是,首先使用event关键字定义事件,然后注册事件回调方法EventHandler,回调方法通常包含两个参数,一个object类型的sender和一个继承自EventArgs的参数,该参数携带一些触发事件的必要信息。     event事件其实是对委托的包装,就像Action和Func是对lamda表达式的包装一样。对event的包装成为EventHandler,有泛型和非泛型版本,泛型主要是继承自EventArgs的类型。     下面举个例子说明:假设人病了需要去看医生。首先要定义看医生时要提供的信息,在这个例子中只需要告诉医生 …

Design Pattern Observer Pattern Event Stream

C#设计模式之中介者模式

大部分应用程序通常包含多个组件,这些组件之间通常通过直接引用来进行通讯。但是在某些情况下,并不想某个组件知道其他组件的存在,或者即使知道,也不要通过直接引用的方式来进行通讯或交互,因为这种直接引用的方式就会产生依赖,从而会扩展对象的生命周期,除非通过弱引用的方式来进行。     中介者模式是一种遍历多个组件之间通讯或交互的模式。他用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互。     使用中介模式,对象之间的交互将封装在中介对象中。对象不再直接相互交互(解耦),而是通过中介进行交互。这减少了对象之间的依赖性,从而减少了耦合。     中介者模式的优点就是减少类间的依赖,把原有的一对多的依赖变成了一对一的依赖,同事类只依赖中介者,减少了依赖,当然同时也降低了类间的耦合;缺点就是中介者会膨胀得很大,而且逻辑复杂,原本 …

Design Pattern Mediator Pattern MediatR

C#设计模式之访问模式

Visitor 是面向对象设计模式中一个很重要的设计模式,这个模式是一种将数据操作和数据结构分离的一种方法,它能够在不修改结构的情况下向现有对象结构添加新操作,是遵循开放/封闭原则的一种方法。上述这个定义很枯燥抽象,那就以例子来说明吧。     假设我们要打印四则运算表达式,比如(1.0+(2.0+3))的字符串表示,或者对其求值,这是两个需求,一个是打印,一个是求值。为了简化,这里仅对加号括号进行处理,其他的可以类推。在写任何代码之前,一定要考虑一下是否面向对象,针对上面的字符串,可以将数字和操作符抽象为两个对象,并实现同一抽象类Expression。 public abstract class Expression { }     目前上述Expression抽象类没有任何成员或方法,后续我们会添加。接着添加表示doule类型数字的具体类DoubleValueExpression,和 …

Design Pattern Visitor Pattern Double Dispatch

C#设计模式之状态模式

状态模式是一种行为设计模式, 让你能在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。状态模式与有限状态机的概念紧密相关。其主要思想是程序在任意时刻仅可处于几种有限的状态中。 在任何一个特定状态中, 程序的行为都不相同, 且可瞬间从一个状态切换到另一个状态。 不过, 根据当前状态, 程序可能会切换到另外一种状态, 也可能会保持当前状态不变。 这些数量有限且预先定义的状态切换规则被称为转移。      其实在之前的文章熔断器设计模式中,就是状态模式的很典型应用,系统有三种状态,闭合状态,此时系统能正常运行,当发生错误,且错误次数达到阈值时,会进入到断开状态,当断开状态持续一定时间,系统会进入到半闭合状态,此时能运行请求处理,当请求处理成功,成功次数达到阈值,则进入闭合状态,否则如果仍然失败,则会退回断开状态,系统不处理请求,直接返回错误,在那篇文章里,有详细代码演 …

Design Pattern State Pattern

C#设计模式之备忘录模式

在之前的命令模式中,我们可以保存所有的对系统的状态修改的命令,通过按顺序执行命令的方式,使得系统能够回滚到之前的任何一个时点,这种回滚是累积式的。     但是在某些情况下,我们并不关心这种“回放”,我们只关心如何将系统回滚到特定的某一个状态即可。备忘录模式非常像快照,我们给系统在某一时刻进行拍照,保存其所以需要的状态,从而在后续某个需要的时间点可以进行恢复。 ▲ 图片来自 https://refactoring.guru/design-patterns/memento     以前面在讨论命令模式的银行账户的例子来看,我们需要保存的状态为银行账户的余额,所以需要将资金字段balance保存起来,但是这里有个问题,资金应该是银行账户BankAccount的内部字段,不应该提供给外部直接访问,因为这样会破坏封装性,但是要保存快照就必须要能访问到这个私有字段。一个解决方法是,使用内部类来实现 …

Design Pattern Memento Pattern

C#设计模式之策略模式

策略模式是一种行为设计模式, 它能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。这么说还有点抽象,这里就举个例子。假设我们需要输出一个字符串列表,比如以如下列表方式输出: just like this     随着需求的变更,可能需要输出不同的格式,比如增加一些特殊符号,比如如果要输出列表,则需要在用"<ul>"或者"<li>"来对字符串进行包装,再比如在HTML或者JSON格式中,需要输出一些起始标签或者结束标签。     所以我们可以抽象出一种输出列表格式的策略: 渲染开始标签或者元素 渲染列表中的每一个对象 渲染结束标签或者元素     不同的策略,可能有不同的格式,但是流程是通用的。     根据策略能否在运行时动态替换,策略模式有两种形式,分别是动态策略和静态策略模式。 动态策略模式     我们的目标是以两种格式输出列表: …

Design Pattern Strategy Pattern