从 0 到 1,44 个测试全通过,自动化部署上线!这是一次前所未有的开发体验。
亲自体验一下!
👇👇👇 扫码体验小程序 👇👇👇

👇👇👇 扫码关注公众号 👇👇👇

在使用docker的时候,难免会遇到当前主机不支持运行docker的情况,这时可以使用运程ssh的形式连接一个已经创建了docker的主机,本地正常使用docker命令
首先说明一下 Docker Machine Generic驱动
它可以 创建一个machines通过SSH使用已经存在的虚拟机或是主机。
Example
创建一个machine的实例,需要指定–driver generic,主机的IP地址,DNS名和SSH私钥路径去连接它.
1 | docker-machine create \ |
除了上述的命令,你还可以使用的选项如下
1 | Options |
之后 eval $(docker-machine env vm)
注意 这里 vm 是你设置的 docker machine 名字
执行一个 hello world
1 | docker run hello-world |
Docker的安装是非常方便的,但是有一些细节还是要注意一下,下面打开博客了解更多内容吧。
当系统架构使用非单体应用的时候,如采用 面向服务架构、徽服务架构的时候,会将项目拆分为不同的应用服务到单独的运行环境中,应用服务之间通讯使用的如wcf、http、rpc等等远程调用技术、每个服务中都有自己的数据库数据源和本地事务,服务之间互不影响,这种情况下就产生了分布式事务的问题。
CAP定律是指在一个分布式系统中、Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。

注意
1、这里说的是在一个分布式系统中才会出现的问题,在单体应用中不会出现CAP三者不可兼得的问题。
2、关于权衡,不要以为在所有时候都只能选择两个特性。在不存在网络失败的情况下(分布式系统正常运行时的必要条件),C和A能够同时保证。只有当网络失败时,才会在C和A之间做出选择。
接下来我们具体来了解CAP具体是什么?
Consistency(一致性)
对于客户端的每次读操作,要么读到的是最新的数据,要么读取失败。换句话说,一致性是站在分布式系统的角度,对访问本系统的客户端的一种承诺:要么我给您返回一个错误,要么我给你返回绝对一致的最新数据,不难看出,其强调的是数据正确。
Availability(可用性)
任何客户端的请求都能得到响应数据,不会出现响应错误。换句话说,可用性是站在分布式系统的角度,对访问本系统的客户的另一种承诺:我一定会给您返回数据,不会给你返回错误,但不保证数据最新,强调的是不出错。
Partition tolerance(分区容错性)
由于分布式系统通过网络进行通信,网络是不可靠的。当任意数量的消息丢失或延迟到达时,系统仍会继续提供服务,不会挂掉。换句话说,分区容忍性是站在分布式系统的角度,对访问本系统的客户端的再一种承诺:我会一直运行,不管我的内部出现何种数据同步问题,强调的是不挂掉。
C、A、P三个特性只能满足其中两个,那么取舍的策略共有3种:
一般的大型互联网应用采用多主机,集群化部署的方式。这种多节点的架构方式下,对于P的容错是分布式系统架构下一定要面对的问题,于是只能在C和A之间做取舍,但是有时对于一些对C强一致性要求极高的场景中,如银行转账可以在A和P之间取舍,如果出现网络故障,宁可停止服务。
具体可以根据实际的业务场景选择适合的架构设计。
参考:
设计模式是软件开发中常用的解决方案,而设计模式的六大原则则是指导我们创建可维护、可扩展、可重用的高质量软件的基本准则。在本文中,我们将深入探讨这六大原则,并为每个原则提供具体的例子。
1. 单一职责原则(Single Responsibility Principle - SRP)
单一职责原则要求一个类应该只有一个引起变化的原因。这意味着一个类应该只负责一项职责。
例子:
1 | public class FileManager |
在上述例子中,FileManager类分别负责保存文件和解析文件,遵循了单一职责原则。
2. 开放封闭原则(Open-Closed Principle - OCP)
开放封闭原则要求软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。即通过添加新的代码来扩展现有功能,而不是修改已有代码。
例子:
1 | public interface IShape |
在上述例子中,通过添加新的实现类(如Triangle),我们可以轻松扩展支持新的形状,而不需要修改IShape接口及其现有实现类。
3. 里氏替换原则(Liskov Substitution Principle - LSP)
里氏替换原则要求子类能够替换其父类而不影响程序的正确性。即如果一个类型是父类型,那么它应该能够被子类型替代。
例子:
1 | public class Rectangle |
在上述例子中,Square类继承自Rectangle类,并重写了SetWidth和SetHeight方法,保证了子类能够替换父类而不破坏程序的正确性。
4. 依赖倒置原则(Dependency Inversion Principle - DIP)
依赖倒置原则要求高层模块不应该依赖于低层模块,而是应该依赖于抽象。同时,抽象不应该依赖于细节,细节应该依赖于抽象。
例子:
1 | public interface IWriter |
在上述例子中,MessageProcessor高层模块依赖于抽象IWriter接口,而不直接依赖于具体的ConsoleWriter实现,符合依赖倒置原则。
5. 接口隔离原则(Interface Segregation Principle - ISP)
接口隔离原则要求一个类不应该强迫其它类实现它们用不到的方法。接口应该小而专一。
例子:
1 | public interface IWorker |
在上述例子中,通过接口隔离原则,Programmer和Janitor只需实现与自己相关的方法,避免了强迫实现不需要的方法。
6. 合成复用原则(Composite Reuse Principle - CRP)
合成复用原则要求尽量使用对象组合,而不是继承。通过组合现有的对象来实现新的功能,而不是通过继承现有的类。
例子:
1 | public class Engine |
在上述例子中,Car类通过组合Engine类来实现汽车的启动功能,而不是通过继承Engine类。
通过理解和遵循这六
大原则,开发人员可以更好地设计出灵活、可维护的软件系统。这些原则为面向对象设计提供了指导方针,有助于构建更加健壮和可扩展的应用程序。
状态模式 - 行为型模式的状态切换之旅
在软件设计中,状态模式是一种行为型设计模式,它允许一个对象在其内部状态改变时改变其行为。状态模式的核心思想是将对象的行为与其状态分离,使得在不同的状态下可以选择不同的行为。本文将深入讨论状态模式的概念、实现方式以及在实际应用中的使用场景。
状态模式(State Pattern)是一种行为型设计模式,其核心思想是允许一个对象在其内部状态改变时改变其行为。状态模式将对象的状态和行为分离,使得对象在不同的状态下可以选择不同的行为。状态模式主要包括三个角色:上下文(Context)、抽象状态(State)和具体状态(ConcreteState)。
classDiagram
class Context {
- state: State
+ Request(): void
+ SetState(state: State): void
}
class State {
+ Handle(context: Context): void
}
class ConcreteStateA
class ConcreteStateB
Context --> State
State <|.. ConcreteStateA
State <|.. ConcreteStateB
1 | using System; |
状态模式适用于以下情况:
1 | class Program |
状态模式是一种行为型设计模式,通过将对象的状态和行为分离,使得对象在不同的状态下可以选择不同的行为。状态模式适用于一个对象的行为取决于其内部状态,并且需要在运行时根据状态改变行为的场景。在实际应用中,状态模式常用于处理有限状态机、状态切换等场景。
中介者模式 - 行为型模式的协调调停者
在软件设计中,中介者模式是一种行为型设计模式,它定义了一个中介者对象,该对象封装了一组对象之间的交互方式。中介者模式使得对象之间不直接相互通信,而是通过中介者对象进行协调,降低了对象之间的耦合性。本文将深入讨论中介者模式的概念、实现方式以及在实际应用中的使用场景。
中介者模式(Mediator Pattern)是一种行为型设计模式,其核心思想是定义一个中介者对象,该对象封装了一组对象之间的交互方式。中介者模式使得对象之间不直接相互通信,而是通过中介者对象进行协调。这样的设计降低了对象之间的耦合性,使得系统更加灵活和易于维护。
classDiagram
class Mediator {
+ RegisterColleague(colleague: Colleague): void
+ SendMessage(colleague: Colleague, message: string): void
}
class Colleague {
- mediator: Mediator
+ Send(message: string): void
+ Receive(message: string): void
}
class ConcreteMediator {
- colleagues: List
+ RegisterColleague(colleague: Colleague): void
+ SendMessage(colleague: Colleague, message: string): void
}
class ConcreteColleagueA
class ConcreteColleagueB
Mediator <|.. ConcreteMediator
Colleague <|.. ConcreteColleagueA
Colleague <|.. ConcreteColleagueB
1 | using System; |
中介者模式适用于以下情况:
1 | class Program |
中介者模式是一种行为型设计模式,通过定义一个中介者对象,封装了一组对象之间的交互方式,降低了对象之间的耦合性。中介者模式使得对象之间不直接相互通信,而是通过中介者对象进行协调。在实际应用中
职责链模式 - 行为型模式的责任传递者
在软件设计中,职责链模式是一种行为型设计模式,它通过一系列处理对象组成的链条,依次处理请求,直到找到合适的处理者。职责链模式可以有效地解耦发送者和接收者,并允许多个对象处理同一个请求。本文将深入讨论职责链模式的概念、实现方式以及在实际应用中的使用场景。
职责链模式(Chain of Responsibility Pattern)是一种行为型设计模式,其核心思想是将处理对象组成一条链,依次处理请求,直到找到合适的处理者。每个处理对象都包含一个指向下一个处理对象的引用,形成一个处理链。请求从链的头部开始,沿着链条传递,直到有一个处理对象能够处理该请求。
classDiagram
class Handler {
- successor: Handler
+ SetSuccessor(successor: Handler): void
+ HandleRequest(request: int): void
}
class ConcreteHandlerA {
+ HandleRequest(request: int): void
}
class ConcreteHandlerB {
+ HandleRequest(request: int): void
}
Handler <|-- ConcreteHandlerA
Handler <|-- ConcreteHandlerB
1 | using System; |
职责链模式适用于以下情况:
1 | class Program |
职责链模式是一种行为型设计模式,通过将处理对象组成一条链,依次处理请求,实现了请求的发送者和接收者的解耦。职责链模式在需要多个对象处理同一个请求,且具体处理对象在运行时确定的情景中有广泛的应用。在实际应用中,职责链模式需要注意设计链上处理对象的逻辑,以确保请求能够正确地被处理。
模板方法模式 - 行为型模式的骨架定义者
在软件设计中,模板方法模式是一种行为型设计模式,它定义了一个算法的骨架,将算法中的一些步骤延迟到子类中实现。模板方法模式允许子类在不改变算法结构的情况下重新定义算法中的某些步骤。本文将深入讨论模板方法模式的概念、实现方式以及在实际应用中的使用场景。
模板方法模式(Template Method Pattern)是一种行为型设计模式,其核心思想是定义一个算法的骨架,将算法中的一些步骤延迟到子类中实现。模板方法模式在父类中定义算法的结构,而将具体步骤的实现交给子类。这样,子类可以在不改变算法结构的情况下重新定义算法的某些步骤。
classDiagram
class AbstractClass {
# PrimitiveOperation1(): void
# PrimitiveOperation2(): void
+ TemplateMethod(): void
}
class ConcreteClass {
+ PrimitiveOperation1(): void
+ PrimitiveOperation2(): void
}
AbstractClass <|-- ConcreteClass
1 | using System; |
模板方法模式适用于以下情况:
1 | class Program |
模板方法模式是一种行为型设计模式,通过定义一个算法的骨架,将算法中的一些步骤延迟到子类中实现。模板方法模式允许子类在不改变算法结构的情况下重新定义算法的某些步骤,提高了代码的复用性和灵活性。在实际应用中,模板方法模式常用于多个子类有共同的算法骨架,但其中某些步骤的实现可能不同的场景。
命令模式 - 行为型模式的请求发送者与接收者分离者
在软件设计中,命令模式是一种行为型设计模式,它将请求封装为一个对象,使得可以参数化客户端对象,队列中存储请求,并且支持撤销操作。命令模式将请求的发送者和接收者解耦,使得系统更加灵活。本文将深入讨论命令模式的概念、实现方式以及在实际应用中的使用场景。
命令模式(Command Pattern)是一种行为型设计模式,其核心思想是将请求封装为一个对象,使得可以参数化客户端对象,队列中存储请求,并支持撤销操作。命令模式将请求的发送者和接收者解耦,使得系统更加灵活,能够支持命令的合成和扩展。
classDiagram
class Command {
+ Execute(): void
+ Undo(): void
}
class ConcreteCommand {
- receiver: Receiver
+ Execute(): void
+ Undo(): void
}
class Receiver {
+ Action(): void
}
class Invoker {
- command: Command
+ SetCommand(command: Command): void
+ ExecuteCommand(): void
+ UndoCommand(): void
}
class Client
Command <|.. ConcreteCommand
ConcreteCommand --> Receiver
Invoker --> Command
1 | using System; |
命令模式适用于以下情况:
1 | class Program |
命令模式是一种行为型设计模式,通过将请求封装为一个对象,实现了请求的发送者和接收者的解耦。命令模式支持撤销操作,并且易于扩展和维护。在实际应用中,命令模式常用于实现撤销、排队、记录日志等功能。