每天都在谈SOA和微服务,但你真的理解什么是服务吗?

2023-11-19

近几年来,我一直从事着和面向服务相关的底层软件研发工作,逐渐的形成了一些自己的看法,其中我觉得比较重要的看法就是服务需要一个更准确细致的定义。简单来说,服务的本质就是行为(业务活动)的抽象。\

为了更好的阐述新服务的概念,并方便与传统的SOA中定义的服务有所区别,我将新的服务命名为S++(Service Plus Plus),接下来我会通过对比S++与SOA和微服务的区别、S++与面向对象的差异来说明这个新的概念。\

为什么要重新定义服务呢?其中一个原因就是服务从不同的角度看其实是不一样的,我们举个例子。\

a8d2cb970384260f941b872ff88421bd.png

\

服务到底是什么样子的?这个问题很有意思,有点儿横看成岭侧成峰的感觉。是的,传统的无论是SOA定义的服务还是微服务定义的服务,一个服务只会有一个最全面的定义,这样的定义太复杂了,最后只有技术人员能看得懂。那么如何让业务人员也能看得懂呢?一般来说就是文档在起作用,但是文档有个问题就是只能看没法改,任何对业务服务的修改最终必须还要通过技术人员。\

所以,传统的服务定义是业务和技术混杂在一起的,能不能有一种方法让所有人看到的服务都是一个样子而且都能看懂都能修改呢?这就是S++要做的事情,S++通过服务的业务与技术分离彻底将传统服务中和业务无关的技术成分剥离出去,放到服务的外延中去,让服务内涵成为纯粹的业务描述。\

另外一个原因是,从服务流程梳理人员的角度看,传统的服务抽象度是不够的。举个例子,一个业务流程需要完成先在帳户上扣款然后再缴费这样的业务。对于流程编排人员来说,缴费这个服务可不是一个服务,首先有很多种现存的缴费种类(电话费、水费、煤气费….),而且未来还有很多种可能的种类。\

我们不可能在一开始就包含所有的业务可能,但是我们又必须在一开始就包含所有的业务可能,否则我就会陷入不停的修改之中。因此,为解决这个矛盾我们需要一个更加抽象的服务定义,在流程中只需要调用抽象的业务服务,这就是S++需要解决的另一个主要问题。\

S++与传统SOA和微服务的差异

\

在概念和定义上的差异

\

对于SOA,推进结构化信息标准组织(OASIS)和开放团体(Open Group)均给出了正式定义。OASIS将SOA定义为:\

\

A paradigm for organizing and utilizing distributed capabilities that may be under the control of different ownership domains. It provides a uniform means to offer, discover, interact with and use capabilities to produce desired effects consistent with measurable preconditions and expectations.

\

Open Group将SOA定义为:\

\

Service-Oriented Architecture (SOA) is an architectural style that supports service-orientation. Service-orientation is a way of thinking in terms of services and service-based development and the outcomes of services.\

A service:\

  • \

    Is a logical representation of a repeatable business activity that

    \
  • \

    has a specified outcome (e.g., check customer credit, provide weather data, consolidate drilling reports)

    \
  • \

    Is self-contained May be composed of other services

    \
  • \

    Is a “black box” to consumers of the service

\

业界基本的认知是,SOA是一种架构模式,是一种面向服务的思维方式。对于服务的定义,Open Group认为服务是一种可重复的业务活动的逻辑上的描述,是一种自包含的、可组合的“黑盒子”。\

微服务在服务定义上,与传统的SOA差别不大,在实现上强调应用的颗粒度足够小,当然小到什么程度也是争论的一个话题。在我看来,微服务“微”的并不是服务,其实微的是应用(后面我们会谈到,服务的颗粒度是和需求相关的,是不能随意变大变小的)。\

S++认为,服务是一种对行为(业务活动)的抽象,这种抽象不仅仅是简单的屏蔽掉业务活动内部的细节,同时需要对相同类型的活动进行归纳形成统一的行为模型。所以S++包含两个层面的抽象:\

  1. 从具体的业务活动出发,屏蔽业务活动的内部细节,将业务活动中所有与业务表达无关的技术内容剔除掉,从而形成一个纯粹的、与技术实现无关的、与业务细节和流程无关的、自包含的业务描述。我将这个过程称为业务与技术分离的过程。\
  2. 从多个经业务与技术分离后的业务描述进行归纳,剔除非要素的业务描述,抽象合并同类的业务要素,从而形成更加形式化的抽象业务模型。这个过程称之为服务多态建模的过程。

实现方法差异

\

从实现上看,SOA允许各种不同的技术来表达SOA的架构理念包括WebServices、REST、DCOM、CORBA、JAVA RMI等等,其中业界比较流行的方法是WebServices方法。从理论上讲,架构的实现是与技术无关的,但是从实践上看并不是所有技术都能很好的实现某种架构的。\

以WebServices为例,WebServices事实上属于传统的面向对象技术的一种衍生技术,即所谓面向接口的技术(类似的比如Java的Interface概念)。这会导致在实现过程中系统间依然是以对象为载体的交互模式,这就必然带来系统间的耦合。\

从S++的定义看,由于引入了更高层次的抽象,完全采用传统的面向对象的技术来实现势必就行不通了。所以,必须有专用的S++容器承载S++服务以及处理S++的多态模型转换。当然,S++同时必然也兼容了传统的面向对象的技术,对于用传统技术构造的业务系统而言,S++化的过程是透明的无需做针对性的改造。\

微服务更强调实现的轻量化,架构上采用点对点去中心化,在协议上尽量选择更轻量的协议,以便提高系统的性能,这与微服务架构的颗粒度有很大关系。在S++看来,任何协议都属于服务的外延部分,并不影响服务内涵的定义,就像我们从不同角色去看骑大象一样,对于不同的服务访问者和实现者来说,采用不同的协议和技术手段都是可能的。从这个角度看,SOA和微服务都是S++的一种实例或实现。\

从架构上看,S++认为只要有需求,那么中心点是必然也必须存在的,性能问题不能成为借口。架构是为应用服务的,不同的应用适用不同的架构,比如服务组合必然会引入一个局部的中心节点,不能为了技术需要而牺牲应用的需求和架构的平衡性。这一点上,S++与传统的SOA和微服务都是有差异的,S++推荐的架构是介于SOA与微服务之间的多中心架构,根据业务需求划分不同的区域,在每一个区域中根据自己应用的特点选择不同的技术。\

耦合性差异

\

传统的SOA虽然在服务的定义上与面向对象有很大差异,但并没有自己专门的实现方法,所以真正去实现SOA架构的时候依然使用的是面向对象的方法。现存的SOA实现方法,大抵是基于远程对象来进行服务的封装和调用的。\

我们知道,要访问远程对象的客户端必须在编译时刻引入远程对象的stub类,而且由于面向对象中多态的实现必须由调用者来决定,所以服务访问者必须包含所有可能的stub类才能够在运行时刻实现多态。一旦服务提供者增加了一种新的派生对象,服务消费者必须在编译时刻引入这个新类的stub才能访问,这就导致了服务提供者与服务消费者之间的紧耦合。举个例子:\

一个消费者需要调用 Person.hello()服务,Person是个抽象的类,服务提供者实现了Man和Women两个具体类。对于服务消费者来说,多态的实现必须在消费者端进行确定,必须在程序中明确指明Person p = new Man();或者Person p = new Women();如果服务提供者增加了OldPerson这样一个新的对象时,服务消费者是无法访问的,因为此时的运行时刻不包含OldPerson的stub类。\

反之,对于S++来说,服务的定义是不需要依附于对象的,上述例子中服务消费者只需要引入hello服务的抽象定义hello(Sting personID)。当这个抽象的服务访问发送到ESB(如果没有ESB就需要服务提供者具备多态容器的功能)上以后,ESB会根据预先约定好的服务定义和服务Cast规则进行运行时刻服务实例的选择。对于传统IT开发人员来说,这一过程更像业务的过程(通过一个业务字段的内容来判断调用哪个业务流程),其实对于SOA服务的开发人员来说,这个过程是透明的,因为服务定义人员在定义服务的时候已经约定了多态的规则,因此这一部分业务已经被技术化从而可以被技术平台直接实现。在SOA架构中,类似的业务功能技术化的必备功能还有一些,比如传统的冲正被用于全局事务一致性以后就必须技术化。\

S++相对于微服务,在耦合性上也是有很大差异的。由于微服务将应用拆分到足够小,甚至可以小到一个对象一个应用,这样原本存在于对象间的业务逻辑必然就会造成微服务之间相互调用,从而形成应用间耦合性;S++认为对象间组合逻辑应该交由一个S++容器去完成,这样就将微应用之间的耦合消除掉了,但是同时也产生了一个业务逻辑调度中心。\

S++与面向对象的差异

\

关注范畴的差异

\

面向对象关注的是对象的内在属性,只要内在属性一致,我们在建立对象模型的时候都将其抽象成一类对象,所以内在属性的是描述对象的不可更改要素。这种特性使得OOAD的方法非常适合用于建立系统内部数据模型,通过对系统内部实体的抽象和描述,我们可以获得系统完整的数据结构和模型,而系统的功能就通过对这些对象的增删改查和计算等动作来完成。\

而面向服务则不然,面向服务并不关心服务的内在逻辑,反而更关心服务的外在表象,只要对外的表现是一致的,我们在建立服务模型的时候就将其抽象为一类服务。比如缴费类服务,无论是缴水费还是缴电费,其外在的表象都是一致的,从行为模式上我们就可以抽象一个缴费的服务。面向对象中对象内在的属性是不可更改的要素,那么面向服务中构成行为的输入输出内容则成为不可更改的要素,比如打球这种行为,必须要有球也必须要有参与者。服务的这种特性使得SOAD的方法更适合于在系统间建立交互模型,这样通过一个外在的流程引擎就可以通过合理的组织行为的顺序就达成了业务的目标。\

从这一点上来看,现在的IT系统存在着大量的冗余。比如开户这个行为,各行各业的业务系统都有,都是不同的实现,但是其实有差异吗?肯定有,但是我要说的是这种差异都是人为造成的,或者说都是系统内部的差异,从外在行为上来看,不都是一个人来到你的柜台或虚拟柜台认证注册一下吗?从行为的抽象角度看,我管你内部是填一张表还是两张表吗?我管你需要多少环节审批吗?其实一旦面向服务的观念被更广泛和深入的认知后,一定会有专业的账户管理机构出现,所有行业的应用需要开户的时候都会直接调用公共的开户服务,这是社会分工的必然趋势。我在这里大胆的预测一下,未来垂直行业的应用提供商一定会逐步消失,取而代之的是各种专业服务提供商+跨行业应用(或服务)提供商。\

5b7ceffd31cb5202ca63aa98f28aaf52.png

\

上图建立了一个理想的云端企业IT模型,其中大部分的应用系统都来自专业的公司提供的公共云服务,企业通过自己的服务建模对云服务进行裁剪,并建立自己可能存在的独特内部应用。然后,通过对内外部的服务能力进行编排组合,从而快速形成自己的业务。\

多态性的差异

\

我们都知道,OOAD之所以能成为现今软件界广为接受的一种方法论,有一个关键点在于对象的多态性对系统稳定性带来的好处。\

多态性解决了业务流程中不断变化的业务分支产生的代码维护的代价,在面向过程的一段代码中,任何实体发生增加和改变都会导致这段代码需要被修改,于是随着系统的快速膨胀,这种修改变得成本巨大甚至无法承受;而OO的方法巧妙的通过多态性解决了这个问题,所以才会有越来越多的超大系统出现,用于解决更加灵活变化的复杂业务需求。\

面向对象的多态主要解决对象实体属性的扩展和操纵方式的差异,也就是说对象属性是不可修改(或重载)但可以增加,对象的方法(操纵方法)可以重载。\

那么类似的,S++的方法也希望为跨系统的应用带来稳定性。比如,在传统BPM的一段流程中,任何行为本身发生增加和改变都会导致流程本身的修改,成本也会随着系统的增大而变得不可忍受。\

举个例子,通过一个简单的流程去完成查余额然后缴费,传统的BPM需要对所有的缴费方式设立相应的业务分支,一旦有新增的缴费方式出现就必须修改这个流程,增加新的分支;而服务多态性则只需要调用缴费的抽象服务,具体的缴费服务是根据运行时刻的数据由服务的多态性自动完成匹配的。\

在服务多态性中,与OO不同的是,由于服务本身就是行为所以没有所谓方法的重载,服务被重载的只有服务对外表达的属性。比如缴费服务中,待缴账号是抽象服务的属性,而被实际服务重载后,就变成电话号码(缴电话费)、水表序号(缴水费)等等实际的行为参与者了。\

假如实现了服务的多态性,就可能解决传统的组合流程会随着业务变化而需要修改的问题,从而可能改变传统的业务开发方式,使得大规模使用组合流程引擎开发业务逻辑成为一种可能的选择。\

小结

\

S++通过对传统服务的定义进行扩展,重新定义了服务这个最基本的概念,第一个plus加入业务与技术分离,第二个plus加入服务多态这两个新的特点。这使得S++继承了SOA和微服务的优点,更进一步的降低了服务的复杂度、提高了服务的抽象度,使得服务更加易于管理和使用。后面我们会看到,基于S++定义衍生出的各种特点在业务和架构层面对传统技术造成的巨大冲击和改进,必然使S++替代传统的SOA和微服务,成为未来企业应用开发和集成技术的主流。\

作者介绍

\

李东,14岁开始学习计算机语言,作为课外兴趣自学了BASIC和汇编,利用放假期间编写了贪吃蛇、打飞碟等游戏。高中、大学期间继续自学软件编程,曾将C和汇编结合使得从高级语言中能够调用绘图功能,并模仿Borland C++开发了一套适合学校机器的图形化开发环境的原型。\

93年大学毕业后在西门子合资公司作为交换机软件安装人员工作两年,然后来到JInfonet公司先后参与4GL的研发和JReport的研发。作为JReport的第一代主要研发人员,编写了从原型一直到3.0版本的核心引擎部分。2000年与合伙人一起创建了Bi-Soft公司,主营业务是商业智能软件Bi-Pilot,负责整个产品的研发及管理工作,从最基本的查询一直到多维分析模型和引擎都是产品的涵盖范围。\

2007年Bi-Pilot被神州信息收购合并,李东开始在神州信息研发SmartESB产品,用SOA的方法论为客户提供底层产品服务。\\


感谢郭蕾对本文的审校。

\

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ@丁晓昀),微信(微信号:InfoQChina)关注我们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

每天都在谈SOA和微服务,但你真的理解什么是服务吗? 的相关文章

  • 读取文件并获取 key=value 而不使用 java.util.Properties

    我正在构建一个 RMI 游戏 客户端将加载一个包含一些键和值的文件 这些键和值将用于多个不同的对象 它是一个保存游戏文件 但我不能为此使用 java util Properties 它符合规范 我必须读取整个文件并忽略注释行和与某些类不相关
  • 如何用Java写入OS系统日志?

    Mac OS 有一个名为 Console 的应用程序 其中包含记录的消息 错误和故障 我相信 Windows 中的等效项是事件查看器 我想 Linux 上也有一个 但我不知道它是什么 也不知道它在哪里 是否可以像这样从 Java 输出获取消
  • 如何在java中压缩/解压tar.gz文件

    谁能告诉我在java中压缩和解压缩tar gzip文件的正确方法我一直在搜索 但我能找到的最多的是zip或gzip 单独 我写了一个包装器公共压缩 http commons apache org compress called jarchi
  • 如何降低圈复杂度?

    我正在开发一个将 RequestDTO 发送到 Web 服务的类 我需要在发送请求之前验证该请求 请求可以从 3 个不同的地方发送 并且每个 请求类型 有不同的验证规则 例如请求1必须有姓名和电话号码 请求2必须有地址等 我有一个 DTO
  • 如何使用 Java 创建多个模式连接?

    我必须使用两个数据库 DB2 Oracle 我在 DB2 数据库中有一个名为NAVID 我想使用 Java 为 Oracle 中的所有表创建相同的架构 public class automateExport static String va
  • Java中定义类型后同时初始化多个变量?

    这里需要一些语法方面的帮助 我正在尝试在定义类型后重新初始化多个变量 例如 int bonus sales x y 50 这工作正常 但是我想稍后在程序中将不同的值放入其中一些变量中 但我收到语法错误 bonus 25 x 38 sales
  • 如何在Mac上使用eclipse安装jetty

    我是一个新手 jetty 和 RESTful API 我想使用 Jetty 创建 REST 服务 并希望将嵌入式 jetty 与 eclipse 一起使用 任何人都可以建议我在 Mac OS 中使用 Eclipse 安装 Jetty Jet
  • 代码编译期间遇到警告消息“使用或覆盖已弃用的 API”

    我编译了我的程序并收到以下错误 我该如何解决呢 Note ClientThreadClients java uses or overrides a deprecated API Note Recompile with Xlint depre
  • 动画图像视图

    目前我正在开发一款游戏 这是我的游戏的详细信息 用户应选择正确的图像对象 我希望图像从左到右加速 当他们到达终点时 他们应该再次出现在活动中 这是我正在处理的屏幕截图 我有 5 个图像视图 它们应该会加速 您有此类动画的示例代码吗 非常感谢
  • 如何屏蔽 Protobuf 中的某些字段

    我找不到一种方法来屏蔽 protobuf 结构中的某些字段 我确实阅读了有关 FieldMaskUtil 的内容并尝试了几个示例 但它似乎做了相反的操作 即复制 FieldMask 中提到的字段 这与我想要的不同 这是示例结构和相应的测试代
  • 带有面板的 Java Swing JToolbar:外观和感觉

    我有一个JToolbar其中包含多个JPanels 需要 因为我希望每个都有特定的边界 不幸的是 外观管理器无法识别JPanels属于工具栏和JButtons因此 渲染器与普通按钮一样 即没有工具栏上的特殊鼠标悬停效果 更换JPanels
  • 更改 JTextPane 的大小

    我是Java新手 刚刚在StackOverflow中找到了这段代码 ResizeTextArea https stackoverflow com questions 9370561 enabling scroll bars when jte
  • 删除 ArrayList 对象问题

    我在处理作业时遇到从 ArrayList 中删除对象的问题 如果我使用 正常 for 循环 它的工作原理如下 public void returnBook String isbn for int i 0 i lt booksBorrowed
  • 膨胀类片段 InflateException 二进制 XML 文件时出错

    我正在使用 Material Design 和 NavigationDrawer 布局等设计我的第一个应用程序 但我遇到了一个问题 该应用程序非常简单 它只显示文本 并且基于 Android Studio 中提供的模板 尝试启动我的应用程序
  • 在 netBeans 中运行程序时,字体看起来非常奇怪

    我在我的新 MacBook M1 上设置了 netBeans 和 SceneBuilder 除了运行程序时的字体外 一切正常 它看起来像这样 我不知道为什么 按钮应显示 Click me 标签应显示 Hello 我收到的错误消息是 M rz
  • setKeyListener 将覆盖 setInputType 并更改键盘

    大家好 我在两个设备之间遇到问题 在实践中使用InputType和KeyListener我正在操纵一个EditText让它从数字键盘接收逗号和数字 有关更多背景信息 请检查我之前的question https stackoverflow c
  • 设计抽象类时是否应该考虑序列化问题?

    一般来说这个问题来自Eclipse建议在抽象类上添加串行版本UID 由于该类是抽象类 因此该类的实例永远不会存在 因此它们永远不会被序列化 只有派生类才会被序列化 所以我的问题是放置一个安全 SuppressWarnings serial
  • Java中的媒体播放器库[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在评估用于在 Java 中播放音频 视频的库 它不需要 100 Java Java 与本机库的绑定
  • Java:基于 Web 的应用程序中的单例类实例

    我在 Web Application 中有这个 Singleton 类 public class MyDAO private static MyDAO instance private MyDAO public static MyDAO g
  • RecyclerView 不调用 onCreateViewHolder 或 onBindView

    没有收到任何错误 所有数据似乎都有效 由于某种原因 没有调用与视图相关的方法 我已确定以下事项 getItemCount 是唯一被调用的适配器方法 并且返回一个正整数值 我知道这将是你们将要查看的区域 构造函数正在被调用 成员变量有效 Pa

随机推荐

  • 2023年上半年BSP工程师年度总结报告

    尊敬的领导和团队成员 大家好 我是BSP工程师XXX 在这里向大家汇报2023年上半年的工作总结 在过去的半年里 我所负责的BSP工程师职责是支持和维护嵌入式系统的硬件和软件平台 我与团队密切合作 共同努力以确保我们的产品能够在各种嵌入式设
  • 怎样选择好的数字货币来进行投资?

    对区块链行业来说 2018年可以说是非常萧条的一年 因为许多投资者目睹并经历了非理性繁荣和泡沫破裂 对于普通投资者来说 投资数字现金通常面临两种风险 一是数字现金本身是否存在投机风险 二是数字现金交易平台存在的相关风险没有监管 数字货币自身
  • 碧蓝航线8.20服务器维护,碧蓝航线半人马来袭 8.20更新公告

    半人马来袭 碧蓝航线将于8月20日9 00 11 00对安卓 iOS全港区进行为期2小时的改造建设 维护后将开启限时活动 盛夏的半人马座 一起来看看吧 一 内容新增 1 开启限时活动 盛夏的半人马座 活动时间8月20日维护后 8月30日 完
  • List的size为1,没有内容,解决:stream过滤空值

    List
  • 精选

    作者 Joseph Rickert 翻译 黄小伟 先后从事游戏 社交及金融数据研究及应用 目前就职杭州有赞 9月份 共有126个R新包收录于CRAN 8月份收录R新包160个 增幅连续下降 当然 这是R包经历过数量上快速增长后的正常变化 本
  • pyg与graphgym

    一 配置问题 我用的显卡是ti3090 为驱动算力 cuda用11 0 软件环境是torch1 8 0 此时注意 graphgym需要安装版本为0 3 0 否则会由于版本过高 导致各种出错 如果要使用pyg 那么会容易遇到一个报错 File
  • Android usb通信 实现app与arduino通信demo

    Android usb通信 一 前言 二 开始 1 AndroidManifest xml清单文件 2 创建权限广播接收者 3 枚举usb设备 4 获取usb接口以及输入 输出端点 5 打开设备 6 设置波特率 7 创建接收数据的线程 8
  • 微信小程序如何将表单的数据发送到数据库,云开发,并实现将数据渲染到页面中

    一 表单数据发送到数据库 1 利用bindsubmit来写一个函数
  • 漏洞常规专业术语

    基础漏洞条例 VUL Vulnerability 漏洞 POC Proof of Concept 漏洞证明 漏洞报告中 通过一段描述或一个样例来证明漏洞确实存在 EXP Exploit 漏洞利用 某个漏洞存在EXP 意思就是该漏洞存在公开的
  • ubuntu 硬盘操作

    查看移动硬盘的文件系统名 以及空间使用情况 df hl 查看硬盘的格式类型 以及挂载位置 df T 挂载硬盘 fdisk l 查看磁盘信息 mount o rw dev sdb1 home test 挂载硬盘 o 指定挂载文件系统时的选项
  • 单选框互斥且可同时取消选中

    单选框互斥且可同时取消选中 div class b div
  • 你值得拥有——流星雨下的告白(Python实现)

    目录 1 前言 2 霍金说移民外太空 3 浪漫的流星雨展示 4 Python代码 1 前言 我们先给个小故事 提一下大家兴趣 然后我给出论据 得出结论 最后再浪漫的流星雨表白代码奉上 还有我自创的一首诗 开始啦 2 霍金说移民外太空 霍金说
  • 最新版FreeRTOS的移植------STM32F103c8t6

    系列文章目录 用FlyMcu和USB转TTL给stm32中烧录程序 stm32C8 C6 文章目录 系列文章目录 前言 一 先决条件 二 使用步骤 1 获取FreeRTOS源码 2 将freeRTOS相关文件移植进keil工程 3 修改相关
  • 如何在ubuntu上安装gcc

    首先查一下 有没有gcc 如下 然后准备安装gcc 1 sudo是授权 apt是一个应用管理工具 apt是本地存了一份软件包信息的列表 包括依赖 大小 vesion等 目的是为了在安装软件的时候快速检测依赖 并自动安装相关依赖 但在安装之前
  • 数据库原理及应用(MySQL版)MySQL实验指导参考答案(实验一到实验八)

    点赞 收藏 慢慢看 lt 一 gt 实验一 CREATE DATABASE STUDENTSDB USE STUDENTSDB CREATE TABLE STUDENT INFO 学号 CHAR 4 NOT NULL PRIMARY KEY
  • 百度文库免费复制word文档的纯文字

    2022年5月11日测试过 以下方法能正常使用 1 在页面中安F12或者从浏览器的设置中找到开发人员工具 2 切换到控制台 然后点击右上角图标进入更多设置 3 在设置 首选项中 找到 调试程序 然后勾选 禁用javascript 4 做完上
  • 微信支付的收款功能被限制了怎么办,收款受限制怎么解除?

    使用小程序做电商 商城的微信支付的收款功能会遇到被限制的情况 直接影响用户下单后的付款操作 其实也不单单是小程序 商城APP中也会冒出类似的提示 遇到这种事情不要慌 根据具体的异常提示给出不同的解决方案 微信支付被限制的错误提示 我们列举两
  • 浅析数据库连接池(二)

    上一篇博客 主要是简单的介绍了普通数据库连接的过程以及耗费的资源 并且简单的谈了下连接池 这篇我们主要来看看数据库连接池的使用以及它最优的配置 总目录 1 数据库连接过程是怎样的 2 连接所占用的资源有哪些 3 连接池简介 4 连接池的使用
  • 用python画星空源代码

    from turtle import from random import random randint screen Screen width height 800 600 screen setup width height screen
  • 每天都在谈SOA和微服务,但你真的理解什么是服务吗?

    近几年来 我一直从事着和面向服务相关的底层软件研发工作 逐渐的形成了一些自己的看法 其中我觉得比较重要的看法就是服务需要一个更准确细致的定义 简单来说 服务的本质就是行为 业务活动 的抽象 为了更好的阐述新服务的概念 并方便与传统的SOA中