分享在Linux下使用OSGi.NET插件框架快速实现一个分布式服务集群的方法

在这篇文章我分享了如何使用分层与模块化的方法来设计一个分布式服务集群。这个分布式服务集群是基于DynamicProxy、WCF和OSGi.NET插件框架实现的。我将从设计思路、目标和实现三方面来描述。

1 设计思路

首先,我来说明一下设计思路。我们先来看看目前OSGi.NET插件框架的服务。在这里,服务不是远程服务,它是轻量级的服务,由接口和实现类组成,如下图所示。服务契约插件定义了服务接口,服务实现插件向服务总线注册服务,服务调用插件利用服务契约(接口)从服务总线获取实现的服务并调用,服务实现插件和服务调用插件都依赖于服务契约,但二者并未有依赖。服务是插件间松耦合的调用方式。

我们希望在不改变代码的情况下,在不改变现有通信机制的情况下,将同一框架下先前定义的服务变成远程服务。此时,基于远程服务的通信方式如下图所示。

[En]

We hope that the previously defined services under the same framework can be turned into remote services without changing the code without changing the existing communication mechanism. At this point, the communication mode based on the remote service becomes the way shown in the following figure.

这时候,在不更改服务定义、服务注册的代码下,在OSGi.NET框架中安装一个远程服务宿主插件,它直接将服务总线的服务暴露成远程服务;OSGi.NET插件框架安装一个远程服务客户端插件,就可以使用服务契约来获取并调用远程服务。

接下来,我们希望更进一步,在不更改服务定义和注册码的情况下实现透明的集群支持。

[En]

Next, we hope to go a step further to achieve transparent cluster support without changing the service definition and registration code.

在这里,我们引入了负载均衡插件。首先,一个OSGi.NET插件框架安装了远程服务负载均衡插件,它管理所有远程服务的负载状况,并为集群提供了统一的访问和负载均衡支持;接着,所有安装了远程服务宿主插件的OSGi.NET框架,会安装一个负载均衡客户端插件,它用于将远程服务注册到负载均衡器;服务调用端安装了远程服务客户端插件,它通过负载均衡器来调用远程服务。

这个思路可以简单描述如下:

A)本地服务 = OSGi.NET插件框架 + 服务契约插件 + 服务实现插件 + 服务调用插件;服务实现和服务调用在同一个OSGi.NET插件框架内,在同一个进程。

B)远程服务实现 = OSGi.NET插件框架 + 服务契约插件 + 服务实现插件 + 远程服务宿主插件,远程服务调用 = OSGi.NET插件框架 + 服务契约插件 + 远程服务客户端插件;服务实现和服务调用可以在不同的OSGi.NET插件框架,在不同进程内。

C)负载均衡器 = OSGi.NET插件框架 + 远程服务负载均衡插件,负载均衡远程服务实现 = OSGi.NET插件框架 + 服务契约插件 + 服务实现插件 + 远程服务宿主插件 + 负载均衡客户端插件,远程服务调用 = OSGi.NET插件框架 + 服务契约插件 + 远程服务客户端插件; 负载均衡器、远程服务、服务调用均可以在不同OSGi.NET插件框架和不同进程,远程服务可以在多台机器中,注册到负载均衡器。

2 设计目标

远程服务和负载均衡的实现基于模块化思路,如下图所示。

(1)不更改本地服务的定义、注册和使用方法;

(2)在本地服务的基础上,安装远程服务宿主插件,服务就暴露成远程服务;

(3)在远程服务的基础上,安装负载均衡客户端插件和负载均衡器,远程服务就支持集群及负载均衡。

以一个简单的服务ISayHelloService为例,下面将描述如何通过以上方式来实现远程服务和服务集群。

2.1 远程服务示例

2.1.1 远程服务注册及实现

如下图所示,SayHelloServiceContract插件定义了一个ISayHelloService服务接口,SayHelloService定义了SayHelloServiceImpl服务实现,在OSGi.NET插件框架安装了UIShell.RemoteServiceHostPlugin插件,这样我们就将本地服务暴露成远程服务了。

下图是SayHelloServiceImpl服务的实现和服务注册。

下图则是服务注册。

如您所见,为了支持远程服务,我们只安装了一个远程服务托管插件,而没有更改服务的实现和注册方法。

[En]

As you can see, in order to support remote services, we only installed a remote service hosting plug-in without changing the implementation and registration method of the service.

2.1.2 远程服务调用

远程服务调用如下所示,在OSGi.NET插件框架安装了远程服务客户端插件。服务调用插件使用服务契约,来调用远程服务。

调用远程服务的步骤为:

1 使用远程服务客户端插件的IRemoteServiceProxyService来获取远程服务;

2 直接调用远程服务的方法。

因此,您可以发现远程服务的定义和使用非常简单。接下来,让我们看看负载平衡远程服务的使用。

[En]

Therefore, you can find that the definition and use of remote services are very simple. Next, let’s look at the use of load balancing remote services.

2.2 负载均衡远程服务示例

2.2.1 负载均衡器

负载均衡器相当于远程服务注册表,用于注册所有公开远程服务的机器以及每台机器和每项服务的负载均衡状态,并提供负载均衡支持。下图显示了负载均衡器的实现。

[En]

The load balancer is equivalent to the remote service registry, which is used to register all machines that expose remote services and the load balancing status of each machine and each service, and to provide load balancing support. The following figure shows the implementation of the load balancer.

负载均衡器向外暴露一个固定的IP地址和端口号,用于注册远程服务,并提供负载均衡。

2.2.2 负载均衡远程服务

支持负载均衡的远程服务需要安装负载均衡客户端插件,如下所示。负载均衡客户端插件用于向负载均衡器注册远程服务,以便负载均衡器管理远程服务的负载,并在出现故障时实现负载转移和负载均衡。

[En]

Remote services that support load balancing need to install a load balancing client plug-in, as shown below. The load balancing client plug-in is used to register the remote service with the load balancer, so that the load balancer can manage the load of the remote service, and realize load transfer and load balancing in case of failure.

在这里,远程负载均衡器客户端插件连接到负载均衡器服务器,并向其注册机器的远程服务。

[En]

Here, the remote load balancer client plug-in connects to the load balancer server and registers the remote service of the machine with it.

2.2.3 负载均衡远程服务调用

调用负载均衡远程服务与直接调用远程服务方法类似,如下图所示。它使用GetFirstOrDefaultLoadBalancerService接口来访问负载均衡器,获取经过负载均衡的远程服务。

如您所见,调用负载平衡远程服务的方法也非常简单。接下来,让我介绍一下它是如何实现的。

[En]

As you can see, the method of invoking load balancing remote services is also very simple. Next, let me introduce how to implement it.

3 设计实现

首先,我们先来看看远程服务的实现。

3.1 远程服务的实现

远程服务的实现可以归结为以下几点:(1)远程服务宿主插件用于暴露一个WCF服务,这个WCF服务相当于本地服务的Bridge,即客户端对远程服务的调用先中专到这个WCF服务,再由WCF服务来调用本地服务,然后返回给客户端;(2)客户端使用DynamicProxy为服务契约生成一个代理,对这个代理的方法调用将会被拦截,然后调用远程服务宿主插件的WCF服务,将调用结果再返回。

3.1.1 远程服务宿主插件实现

该插件首先定义了一个IRemoteServiceInvoker的WCF服务接口,这个接口及参数的定义如下。

它的作用就是通过调用这个WCF远程服务来调用OSGi.NET框架本地服务,达到将本地服务暴露成远程服务的目的。

这个WCF的实现代码如下所示,其目的就是对WCF的调用转换成对本地服务方法的调用并返回。

3.1.2 远程服务客户端插件的实现

接下来,我们看看远程服务客户端插件的实现。它定义了一个IRemoteServiceProxyService服务,暴露了两个接口分别用于对远程服务和负载均衡远程服务的调用。

该服务的远程服务获取实现如下所示。

它仅仅时通过DynamicProxy创建远程服务代理类,此时,对代理类方法的调用会转换成远程服务调用。下面看看拦截机的实现。

拦截机的代码很简单,对远程服务代理类方法的调用将直接转换成对远程服务宿主插件的WCF服务的调用。下面看看负载均衡远程服务的实现。

3.2 负载均衡远程服务的实现

通过以上技术,实现远程服务的负载均衡变得容易得多。负载均衡远程服务的目的是将所有远程服务注册到负载均衡服务器中,实现动态负载管理。因此,需要创建基于远程服务的负载均衡服务器和负载均衡客户端。负载均衡服务器用于管理所有远程服务和提供远程服务的机器,管理所有远程服务的负载,实现负载均衡和故障转移;负载均衡客户端的目的是向负载均衡器注册远程服务,并在远程服务关闭时将其从负载均衡器中卸载。接下来,看看负载均衡器的实现。

[En]

With the above technologies, the implementation of load balancing remote services is much easier. The purpose of load balancing remote service is to register all remote services in the load balancing server and realize dynamic load management. Therefore, it is necessary to create a load balancing server and a load balancing client based on the remote service. The load balancing server is used to manage all remote services and machines that provide remote services, manage the load of all remote services, and achieve load balancing and failover; for the purpose of the load balancing client, register the remote service with the load balancer and unload it from the load balancer when the remote service is shut down. Next, take a look at the implementation of the load balancer.

3.2.1 负载均衡器实现

负载均衡服务器暴露了如下WCF服务。这个服务用于提供远程服务注册和卸载以及负载均衡请求。

这个服务的实现如下所示。

它使用远程服务注册表来实现远程服务的管理和负载均衡的实现。

3.2.2 负载均衡客户端的实现

负载均衡客户端的目的是实现远程服务的注册和卸载,并通过插件将远程服务公开给负载均衡服务器。这允许服务调用者通过负载均衡器调用远程服务。

[En]

The purpose of the load balancing client is to realize the registration and uninstallation of the remote service, and expose the remote service to the load balancing server through the plug-in. This allows the service caller to invoke the remote service through the load balancer.

3.2.3 负载均衡远程服务调用

负载均衡远程服务的调用方式的实现和远程服务类似。它由远程服务代理服务的GetFirstOrDefaultLoadBalancerService接口来实现。

该接口的实现如下所示,主要时创建代理和方法拦截机。

这个方法调用拦截机会将方法调用转化为:(1)从负载均衡服务器获取均衡的远程服务主机;(2)直接调用该远程服务主机的服务,如果调用失败则尝试进行重新负载均衡。其实现如下所示。

4 小结

在本文中,我将详细描述支持集群的远程服务的实现。您可以发现,整个实现完全是模块化的。您还可以考虑通过模块化组装来实现远程服务集群。谢谢您一直鼓励我。

[En]

In this article, I describe in detail the implementation of remote services that support clustering. You can find that the overall implementation is completely modular. You can also try to consider implementing a remote service cluster by modular assembly. Thank you for your support.

Original: https://www.cnblogs.com/baihmpgy/p/3765525.html
Author: 道法自然
Title: 分享在Linux下使用OSGi.NET插件框架快速实现一个分布式服务集群的方法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/10070/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

最近整理资源【免费获取】:   👉 程序员最新必读书单  | 👏 互联网各方向面试题下载 | ✌️计算机核心资源汇总