容器内部的客户端访问外部网络中的服务器
容器是一种比虚拟机更加轻量级的隔离方式,主要通过 namespace 和 cgroup 技术进行资源的隔离,namespace 用于负责看起来隔离,cgroup 用于负责用起来隔离。容器网络连接到物理网络的方式和虚拟机很像,通过桥接的方式实现一台物理机上的容器进行相互访问,如果要访问外网,最简单的方式还是通过 NAT。微服务之间的相互调用 所有 RPC 框架,都是按照这个标准模式来的
当客户端的应用想发起一个远程调用时,它实际是通过本地调用本地调用方的 Stub。它负责将调用的接口、方法和参数,通过约定的协议规范进行编码,并通过本地的 RPCRuntime 进行传输,将调用网络包发送到服务器。服务器端的 RPCRuntime 收到请求后,交给提供方 Stub 进行解码,然后调用服务端的方法,服务端执行方法,返回结果,提供方 Stub 将返回结果编码后,发送给客户端,客户端的 RPCRuntime 收到结果,发给调用方 Stub 解码得到结果,返回给客户端。这里面分了三个层次,对于用户层和服务端,都像是本地调用一样,专注于业务逻辑的处理就可以了。对于 Stub 层,处理双方约定好的语法、语义、封装、解封装。对于 RPCRuntime,主要处理高性能的传输,以及网络的错误和异常。NFS(Network File System)就是网络文件系统。要使 NFS 成功运行,要启动两个服务端,一个是 mountd,用来挂载文件路径;一个是 nfsd,用来读写文件。NFS 可以在本地 mount 一个远程的目录到本地的一个目录,从而本地的用户在这个目录里面写入、读出任何文件的时候,其实操作的是远程另一台机器上的文件。
在 RPC 的调用过程中,所有的数据类型都要封装成类似的格式。而且 RPC 的调用和结果返回,也有严格的格式。 XID 唯一标识一对请求和回复。请求为 0,回复为 1。RPC 有版本号,两端要匹配 RPC 协议的版本号。如果不匹配,就会返回 Deny,原因就是 RPC_MISMATCH。程序有编号。如果服务端找不到这个程序,就会返回 PROG_UNAVAIL。程序有版本号。如果程序的版本号不匹配,就会返回 PROG_MISMATCH。一个程序可以有多个方法,方法也有编号,如果找不到方法,就会返回 PROC_UNAVAIL。调用需要认证鉴权,如果不通过,则 Deny。最后是参数列表,如果参数无法解析,则返回 GABAGE_ARGS。基于 XML 的最著名的通信协议就是SOAP了,全称简单对象访问协议(Simple Object Access Protocol)。它使用 XML 编写简单的请求和回复消息,并用 HTTP 协议进行传输。
UDDI(Universal Description, Discovery, and Integration),也即统一描述、发现和集成协议。它其实是一个注册中心,服务提供方可以将上面的 WSDL 描述文件,发布到这个注册中心,注册完毕后,服务使用方可以查找到服务的描述,封装为本地的客户端进行调用。原来的二进制 RPC 有很多缺点,格式要求严格,修改过于复杂,不面向对象,于是产生了基于文本的调用方式——基于 XML 的 SOAP。SOAP 有三大要素:协议约定用 WSDL、传输协议用 HTTP、服务发现用 UDDL。RESTful 可不仅仅是指 API,而是一种架构风格,全称 Representational State Transfer,表述性状态转移。主要面向资源,提供无状态服务,有利于横向扩展应对高并发。
你知道的越多,你不知道的越多。 有道无术,术尚可求,有术无道,止于术。 如有其它问题,欢迎大家留言,我们一起讨论,一起学习,一起进步