基于Spring、redis、netty手写RPC框架

服务结构:

基于Spring、redis、netty手写RPC框架_第1张图片

结构说明:

redis 服务器里面有两种集合,一个集合保存服务器地址信息,另一种集合保存每一台服务所提供的服务名称。如果现在有两台服务器提供服务,则redis注册中心中的数据结构如下:

基于Spring、redis、netty手写RPC框架_第2张图片

server_list保存的是哪些服务器提供远程服务,value值为IP_端口的形式。然后每一个服务器提供哪些服务,由另一个集合保存,并且该集合的有过期时间的,如上面的172.32.4.1_8888集合提供了4个服务,172.32.4.4_9999提供了2个服务。

服务器启动过程:

服务器启动时,应用会把有@Rpcservice注解的SpringBean发布到redis注册中心中,并且把自身服务器信息加入到server_list列表。因为服务器自身的服务列表是有过期时间的,如上面的172.32.4.1_8888集合是有过期时间的,所以服务器需要不断向注册中心发送expire命令以保持服务在线。如果服务器中断了发送expire,redis会自动把该服务移除,我们就认为该服务已经挂掉了。

客户端启动过程:

客户端启动时,会扫描配置文件中的包名下的接口,然获取到redis注册中心中的服务列表信息,查看是否有服务和该接口匹配,如果匹配,会创建和该服务器之间的socket连接,用于后续发起请求,如果有多个服务和该接口匹配,会创建多个连接。客户端启动完成后,还会不断向redis注册中心获取最新的服务列表,然后更新到本地。如果一个服务已经挂掉,发起请求时,会检测到连接已经失效,会移除改连接,并且尝试换一个可用的连接进行请求,如果没有连接可用,会立即向redis更新服务列表,然后创建新的连接进行请求,如果更新服务列表后,还是没有可用的服务,则抛出异常。

 

源码和使用demo,请移步github

你可能感兴趣的:(java,RPC,远程调用,Spring,Redis)