自主实现服务(资源)发现(一)——初步分析以及实现负载均衡

简版服务(资源)发现(一)

首先我们需要知道什么是服务发现?
服务发现是指使用一个注册中心来记录分布式系统中的全部服务信息,以便于其他服务可以快速找到这些已注册的服务。

那么资源发现应该有哪些功能呢?
所有服务器(无论是某一种App的多个服务器,还是不同App的多个服务器),都需要在“注册中心”进行注册;
客户端需要从“注册中心”获取它所属APP的服务器(组)的地址信息;
综上,从客户端角度看,注册中心起到的作用有:
①是否存在某个APP服务器
②获取某个APP服务器(组)的地址信息
从客户端角度看,这是一种“服务发现”机制。

它的适用场景?
假定在一个机房视频系统中,用户通过视频系统提供的“视频选择功能”,首先由服务器端向客户端发送视频信息,再由客户端选择某一视频信息,并向服务器端发送“下载视频”请求,然后,由服务器找到该视频文件,并向客户端发送该视频文件。
在这种环境下,如果用户过多就会产生服务器压力(服务器每向一个客户端发送一个视频文件都需要一个线程支持)过大的情况,为了解决这个问题,我们可以思考可不可以让已经拥有这是视频文件的客户端,参与到视频文件发送过程中?
在此时引入服务发现,让它来处理客户端、服务器端、资源注册中心之间的文件传输等问题。

简版服务发现框架介绍

经过综合考虑,我们要实现资源发现系统,①应在资源发现中先建立一个“资源注册中心”;
②资源发现框架中应该主要有两个身份,即资源拥有者节点和资源请求者节点。
③服务发现需要均衡每个服务器的压力,所以应有一个负载均衡模块。
④应该有一个实时管理,可以将掉线的资源拥有者或者服务器从“池子中”除去。

注册中心的核心功能

我们可以将注册中心的核心功能做一总结,具体应该实现的功能应该有下面五点:
①“资源”管理;
②“资源拥有者”注册;
③“资源拥有者”注销;
④“资源请有者”请求资源;
⑤“资源拥有者”和资源之间的管理关系;
⑥“资源拥有者”管理

资源拥有者应有的功能

①向注册中心注册自己
②向注册中心注销自己
③注册完成后,通过一个心跳检测来告知注册中心其健壮性

资源请求者

①获得资源列表
②资源请求者来负责负载均衡,选择服务对象,进行服务调用。

可配置功能

负载均衡功能(如何使每个“资源拥有者”服务器的压力能均衡些)
资源拥有者实时管理(断开与已掉线服务器的连接等)

资源发现中的资源定义

== 资源定义 ==:
因为资源发现服务器作为工具,可以使用在任何需要的《资源发现》场合,因此,资源的定义绝对不能狭隘,不应将资源这个概念太过于实在化。
在此我们将资源定义如下:
app;
id;
version;

在资源拥有端需要填写上述资源信息;资源拥有者在注册资源时,需要提供上述资源信息;资源注册中心将以上述内容的综合(HashCode)作为资源编号。

关于Version的应用场景:
Version为版本的意思,Version可以用于下面几个场景①APP的自动版本下载。②客户端向服务器请求最新资源,检查版本号,若发现更新版本,则,自动启动新版本资源下载。

资源发现中资源拥有者的管理

管理资源拥有者的目的:主要是保证接入的资源拥有者是可用的,或者说,能及时发现资源拥有者不可用,并将其从资源表中剔除。

所以思考一下,资源拥有者和资源注册中心能否维持“长连接”?
答案是可以,资源注册中心可以通过仅保存其Socket,并通过定期扫描,检查其可用性,来实现上述基本目的。

接下来我们思考,如何解决资源拥有者是否有效?
对于资源拥有者是否有效的问题,我们很容易想到可以让资源请求者加以判断;若该资源拥有者无效,还应该告知资源注册中心,让其从现在的资源列表中剔除。
上述方法虽然可以解决资源拥有者是否有效的问题,但是不采用。
我们还是希望其更“灵敏些“,意思就是,通过资源拥有者维护一个与资源注册中心的长连接,注册中心扫描,可以及时发现无效资源拥有者节点。因为当前是通过”短连接“完成资源注册中心的”,希望不要再混有长连接;在这种考量下,可以让资源拥有者创建一个RMI服务器,供资源注册中心进行有效性问答。那么,上面提到的,资源拥有者需要提供ip和Port,这个可以是资源拥有者的RMI服务器地址!

但是此处我们需要注意一个坑:
无论是CS还是RMI,都需要由“客户端”先连接“服务器”;在连接过程中,如果服务器不存在,则,客户端不会轻易放弃连接。事实情况是,客户端会尽其所能地努力连接服务器,直到“超时”,且通常情况下,超时时间为20秒!
即,Socket = new Socket(ip, port)这个操作,若服务器端不存在,则需要在20秒后才能得到异常消息。

具体实现该框架

讲述了这么多文字性的框架结构,下面我们来看看该如何将其一步步实现。

在做所有事情之前,我们先完成负载均衡功能模块。

负载均衡

在这个模块我主要采用两种方式来实现该模块供用户选择。

用轮询的方式实现负载均衡

在这种方法里,我们将某一个资源的所有服务器节点形成一个如下图所示的环形链,增加该资源的服务器节点时,在链表末尾增加,删除资源服务器节点时,只需将指定的资源服务器节点删除即可,取得一个资源服务器时,通过一个CurrentNode“指针”来对这条链进行轮询,如果只有一个服务器,则选中的就是这个服务器,若有多个服务器,可以通过轮询的方式使得每个服务器的工作量差距不大,实现“负载均衡”。
在这里插入图片描述

用随机数的方式实现负载均衡

该方式的思路为取随机数,用该随机数与服务器的总数取余,最终的结果就是所取的服务器。

负载均衡具体实现代码

先建立一个INetNode接口来规定取得服务器的ip和port方法。

// 
public interface INetNode {
   
 String getIp();
 int getPort();
}

下面是它的实现类:

// 
public class DefaultNetNode implements INetNode {
   
 private String ip;
 private int port;
 
 public DefaultNetNode() {
   
 }

 public DefaultNetNode(String ip, int port) {
   
  this.ip = ip;
  this.port = port;
 }
 
 public void setIp(String ip) {
   
  this.ip = ip;
 }

 public void setPort(int port) {
   
  this.port = port;
 }
 
 @Override
 public String getIp() {
   
  return ip;
 }

 @Override
 public int getPort() {
   
  return port;
 }

 @Override
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值