什么是 SOA
面向服务架构(SOA)是一种架构设计模式,包含多个服务,而服务之间互相配合提供一系列功能。
服务的最基本机制就是“问/答”(Request/Response)形式。我提出问题,你给我答案。对“我”来说,“你”就是服务的提供方。SOA 应用的基本形式就是应用程序向不同的服务提出请求,得到答案,根据这些答案,组合成一个想要的结果。
SOA的底层逻辑是为了实现松耦合(Loose Coupling)。松耦合系统中的各个模块互相独立,每个服务对于其他服务来说,就好像是一个黑盒子。使用服务的时候,只要关心提供的服务是什么,而不用关心内部的工作机制。
在程序开发中,这种松耦合的黑盒子,最原始的实现方式就是写一个函数。把经常重复使用的代码段,封装成一个个的函数,取一个有意义的函数名,就可以在不同地方调用。
比如,已知三角形的三条边长度,就可以通过海伦-秦九韶公式计算三角形的面积。如果不写成函数的话,就要这样算:
// -*- compile-command: "g++ -std=c++20 code.cpp && ./a"; -*- #include <iostream> #include <cmath> using namespace std; int main() { double a = 10; double b = 15; double c = 18; double p = (a + b + c) / 2; double S = sqrt((p-a)*(p-b)*(p-c)*p); cout << "三角形三条边为:" << a << ", " << b << ", " << c << endl; cout << "三角形的面积为:" << S << endl; }
三角形三条边为:10, 15, 18 三角形的面积为:74.9996
如果把计算面积的过程写成函数,就可以多次函数,不易出错,代码更精简。
// -*- compile-command: "g++ -std=c++20 code.cpp && ./a"; -*- #include <iostream> #include <cmath> using namespace std; double area(double a, double b, double c) { double p = (a + b + c) / 2; double S = sqrt((p-a)*(p-b)*(p-c)*p); cout << "三角形三条边为:" << a << ", " << b << ", " << c << endl; cout << "三角形的面积为:" << S << endl; return S; } int main() { area(11, 12, 13); area(11, 12, 14); }
三角形三条边为:11, 12, 13 三角形的面积为:61.4817 三角形三条边为:11, 12, 14 三角形的面积为:63.7059
但是,用函数封装服务,并不灵活,如果函数逻辑修改了,所有用到的代码都得重新编译一遍。所以,人们又想出来编译模块、动态库等方法。
然而服务和模块、程序库的区别在于服务与服务之间是互相独立的,通过网络调用的方式进行通信。不同的服务可以运行在不同平台上,用不同的开发语言开发。
这就好像电动汽车里的动力电池。模块就好像是电池模组,服务就好像是电池 Pack。电池模组是整个电池Pack的组成单元,无法独立运作,而电池Pack就是一个完整的产品,能够为电动汽车提供强劲动力。
尽管服务之间是互相独立的,但是服务之间的通信方式必须统一,这种统一的通信机制,就是企业服务总线(Enterprise Service Bus,ESB)。ESB 的通信方式有 SOAP、REST、RPC 等。其中 SOAP 就是服务间通过 HTTP+XML 的形式完成数据交换,REST 就是HTTP+JSON 的形式,RPC 是基于 Socket 的形式。Apache CXF 框架就是 SOAP+REST 框架,Dubbo 是 RPC 框架,而 SpringCloud 是遵守 REST 规范的微服务生态系统。
为了找到特定的服务,SOA ESB 还需要提供服务注册和服务发现功能,新的服务通过服务注册到系统,应用程序就可以通过服务发现找到需要的服务,调用接口实现功能。
总结下 SOA 的优势:
- 重用性。服务和服务之间是松耦合的,所以每个服务可以用于不同的应用场景而不会互相干扰。
- 多平台。服务之间松耦合,只要服务之间ESB通讯的接口明确,服务内部的实现就可以更具实际情况选择,可以是不同的操作系统,不同的开发语言。
- 易维护。部分服务可以临时停下来维护,整个应用可以持续运行。
- 可靠性。服务之间互相独立,某个服务出问题不会影响其他服务。
- 易测试。每个服务可以单独进行测试,确保了整个系统有比较好的运行基础。
- 开发快。因为很多服务可以重用,开发一个新应用只要调用已有的服务。
SOA 也有一些缺点:
- 因为太多的服务调用,可能带来一些性能损耗
- 每个服务需要明确的文件定义,有些繁琐
另外,既然要了解 SOA,还得过一下所谓的 SOA 宣言:
- Business value over technical strategy
业务价值高于技术策略 - Strategic goals over project-specific benefits
战略目标高于项目收益 - Intrinsic interoperability over custom integration
固有的互操作高于相应客户的集成 - Shared services over purpose-specific implementations
共享的服务高于非标实现 - Flexibility over optimization
灵活性高于性能调优 - Evolutionary refinement over pursuit of initial perfection
持续改进高于一开始就追求完美
总结一下:
- SOA 是基于服务和 ESB 的应用开发架构
- 遵循三个原则:松耦合、迟绑定和服务发现
- SOA有高重用性、多平台开发、易维护、高可靠、易测试、开发快等优势
- SOA的缺点是性能损耗、实现略复杂