前言
近期项目都是和SOA相关的内容,笔者刚接手这个项目的时候也挺懵圈的。就对这个SOA框架进行了一番探索。
SOA(面向服务架构)_百度百科面向服务架构(SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)进行拆分,并通过这些服务之间定义良好的接口和协议联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种各样的系统中的服务可以以一种统一和通用的方式进行交互。https://baike.baidu.com/item/SOA/2140650 SOA就是面向服务架构,是个啥意思呢,通俗的来说就是函数功能接口化,客户端可以调用接口得到相应的功能。这么说可能还是有点抽象。举个例子:一个板子能控制IO口的高地电平,我发个{"id":1,"s":0}数据给这个板子,就能将引脚1设置为低电平。这个数据解析并实现引脚控制这样的功能就是板子对于我所开放出来的功能。我发送这样的数据格式,就是我对这个功能服务的调用方式,也就是通讯协议。对于SOA也一样,它也有自己的一套类似的通讯协议。
SOA作为服务架构,有诸多实现方法,例如SOAP、XML-RPC、DDS等等。
进一步探索
库准备
单纯从概念上,作为程序员估计得不到直观的体验。这里,我选取了XML-RPC作为探索方向。因为SOAP库没安装成功,DDS库结构繁琐,对于上手及其不友好。XML-RPC其实python有自带库,所以不用自行安装。
代码准备
为了更方便的体现服务的可增减效果,我专门用一个.py文件来存放服务内容:
# servelist.py::
__all__ = ['ground_server_add', 'ground_server_sub']
def ground_server_add(a,b):
print(a+b)
return a+b
def ground_server_sub(a,b):
print(a-b)
return a-b
这里呢,我实现了两个服务,一个是加法,一个是减法。运行过程中会进行print打印结果。
再来写个服务端:
# server.py::
from xmlrpc.server import SimpleXMLRPCServer
from servelist import *
server = SimpleXMLRPCServer(("localhost", 8123)) # 服务端口localhost:8123
# 对servelist.py中的文件进行服务注册
d = dict(globals()) # 获取全局的变量或者函数
for key in d: # 遍历这些变量或者函数
if 'ground_server_' in key: # 寻找以ground_server_开头的变量或者函数
server.register_function(d[key]) # 进行注册
print(key) # 打印被注册的函数
print()
print()
server.serve_forever() # 保存心跳
再来写个客户端:
# client.py::
import xmlrpc.client
server=xmlrpc.client.ServerProxy("http://localhost:8123") # 设置访问接口
print(server.ground_server_add(1,2)) # 服务调用并打印结果,加法
print(server.ground_server_sub(1,2)) # 服务调用并打印结果,减法
运行效果展示
先运行服务端:
可以看到,打印出了被注册的服务。
再运行客户端:
顺利的打出了运行结果。
再看看服务端是否有啥变化呢:
也打出了运行结果,因为我们在服务功能中做了结果打印的。如果我们把其中一个方法做一下改进:
# servelist.py::
__all__ = ['ground_server_add', 'ground_server_sub']
def ground_server_add(a,b):
# print(a+b)
return a+b
def ground_server_sub(a,b):
print(a-b)
return a-b
将加法的打印注释掉,重新运行服务端和客户端,可以看到客户端也不会再打印加法的结果:
由此可见,服务的运行实际上也就是在服务端上运行。因此,调用服务,可以理解为给服务端发送操作指令。
遇到问题
测试过的同学就会发现,每次调用的速度都很慢,一两秒,根本不适合实时控制。那么怎么解决呢?
原来问题出现在 localhost!
python解析localhost的地址需要较长的时间,因此,我们只需要把localhost改成已知的ip地址就行。
就像笔者本机局域网内ip是 192.168.0.109(使用①WIN+R ②cmd ③回车 ④ipconfig ⑤回车 查看):
经过测试,调用的速度非常的快,“秒回”。到此问题解决。
PS:如果确定只是本机内建立服务端和客户端,可以ip直接设为 127.0.0.1
简评
服务动态化是SOA架构的一大特色,在这个框架下,能够注册各种各样的服务,说白了就是开放各种各样的功能,客户端需要什么功能就调用什么功能,实现模块黑箱化,也促进了模块化开放的理念。
把这框架技术放到Jetson Nano上又会碰撞出怎样的火花呢!
相关代码已打包上传,免积分: