这样基于Netty重构RPC框架你不可能知道

原创申明:本文由公众号【猿灯塔】原创,转载请说明出处标注

今天呢!灯塔君跟大家讲:

基于Netty重构RPC框架

一.CyclicBarrier方法说明
在这里插入图片描述
1.单一应用架构

当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。。(最开始58 同城的站点架构用一个词概括就是“ALL IN ONE”。就像一个单机系统,所有的东西都部署在一台机器 上,包括站点、数据库、文件等等。而工程师每天的核心工作就是CURD,前端传过来一些数据,然后 业务逻辑层拼装成一些CURD访问数据库,数据库返回数据,数据拼装成页面,最终返回到浏览器。此 时,用于简化增删改查工作量的数据访问框架(ORM)是关键)

2、垂直应用架构

当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提 升效率。应用拆分为不相干的几个应用,前后端分离,此时用于加速前端页面开发的Web MVC框架是 关键

3、分布式服务服务架构

当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定 的服务中心,使前端应用能更快速的响应多变的市场需求。同时将公共能力API抽取出来,作为独立的 公共服务供其他调用者消费,以实现服务的共享和重用,降低开发和运维成本。应用拆分之后会按照模 块独立部署,接口调用由本地API演进成跨进程的远程方法调用,此时RPC框架应运而生。此时,用于 提高业务复用及整合的分布式服务框架(RPC)是关键。

4、流动计算架构

当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问 压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是 关键。面向服务的架构(SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)进行拆 分,并通过这些服务之间定义良好的接口和协议联系起来。

没有RPC框架之前,我们的服务调用是这样的:
在这里插入图片描述
看出接口的调用完全没有规律可循,想怎么调,就怎么调。这导致业务发展到一定阶段之后,对接口的 维护变得非常困难。于是有人提出了服务治理的概念。所有服务间不允许直接调用,而是先到注册中心 进行登记,再由注册中心统一协调和管理所有服务的状态并对外发布,调用者只需要记住服务名称,去 找注册中心获取服务即可。这样,极大地规范了服务的管理,可以提高了所有服务端可控性。整个设计思想其实在我们生活中也能 找到活生生的案例。例如:我们平时工作交流,大多都是用IM 工具,而不是面对面吼。大家只需要相 互记住运营商(也就是注册中心)提供的号码(如:腾讯QQ)即可。再比如:我们打电话,所有电话 号码有运营商分配。我们需要和某一个人通话时,只需要拨通对方的号码,运营商(注册中心,如中国 移动、中国联通、中国电信)就会帮我们将信号转接过去。

二.RPC介绍

1、RPC简介:

Remote Procedure Call远程过程调用

  • RPC就是从一台机器(客户端)上通过参数传递的 方式调用另一台机器(服务器)上的一个函数或 方法(可以统称为服务)并得到返回的结果。
  • RPC 会隐藏底层的通讯细节(不需要直接处理Socket通讯或Http通讯) RPC 是一个请求响应模 型。
  • 客户端发起请求,服务器返回响应(类似于Http的工作方式) RPC 在使用形式上像调用本地函数 (或方法)一样去调用远程的函数(或方法)。

2、RPC通信原理
在这里插入图片描述
RPC的主要作用有三方面:

1、进程间通讯

2、提供和本地方法调用一样的机制

3、屏蔽用户对远程调用的细节实现

RPC框架的好处首先就是长链接,不必每次通信都要像http一样去3次握手,减少了网络开销;其次就 是RPC框架一般都有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等,对调用方来说是无 感知,统一化的操作。

3、RPC通过过程

1)服务消费方(client)调用以本地调用方式调用服务;

2)client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;

3)client stub找到服务地址,并将消息发送到服务端;

4)server stub收到消息后进行解码;

5)server stub根据解码结果调用本地的服务;6)本地服务执行并将结果返回给server stub;7)server stub将返回结果打包成消息并发送至消费方;

8)client stub接收到消息,并进行解码;

9)服务消费方得到最终结果。

4、常用的分布式RPC框架

dubbo:国内最早开源的RPC框架,由阿里巴巴公司开发并于2011年末对外开源,仅支持java语言

4、常用的分布式RPC框架

  • dubbo:国内最早开源的RPC框架,由阿里巴巴公司开发并于2011年末对外开源,仅支持java语言
  • motan:微博内部使用的RPC框架,于2016年对外开源,仅支持java语言
  • Thrift:轻量级的跨语言RPC通信方案,支持多大25种变成语言

gRPC:Google于2015年对外开源的跨语言PRC框架,支持常用的C++、java、Python、Go、 Ruby、PHP等多种语言。

目前流行的RPC 服务治理框架主要有Dubbo 和Spring Cloud,
在这里插入图片描述
下面我们以比较经典的Dubbo 为例。

Dubbo 核心模块主要有:

Registry:注册中心(主要负责保存所有可用的服务名称和服务地址。)

Provider:服务中心(实现对外提供的所有服务的具体功能)

Consumer:消费端(调用远程服务的服务消费方)

Monitor:监控中心(统计服务的调用次数和调用时间的监控中心)

Container:服务运行容器

api:主要用来定义对外开放的功能与服务接口。protocol:主要定义自定义传输协议的内容

蓝色方框代表业务有交互,绿色方框代表只对Dubbo内部交互。蓝色虚线为初始化时调用,红色虚线为 运行时异步调用,红色实线为运行时同步调用

0、服务在容器中启动,加载,运行Provider

1、Provider在启动时,向Registry注册自己提供的服务

2、Consumer在启动时,向Registry订阅自己所需的服务

3、Registry给Consumer返回Provider的地址列表,如果Provider地址有变更(上线/下线机器), Registry将基于长连接推动变更数据给Consumer

4、Consumer从Provider地址列表中,基于软负载均衡算法,选一台进行调用,如果失败,重试另一 台调用

5、Consumer和Provider,在内存中累计调用次数和时间,定时每分钟一次将统计数据发送到Monitor

4.具体实现

1、api


```java
package com.rpc.api; 

/**

* API模块,provider和Consumer都遵循API模块的

规范 * 用来定义对外开放的功能与服务接口 

*/ 

public interface IRpcHelloService {
    

String hello(String name); 

}

package com.rpc.api; 

public interface IRpcService {
    

/*增加用户*/ 

public String addUser(); 

/*删除用户*/ 

public String deleteUser(Integer id); 

/*修改用户*/ 

public String updateUser(Integer id); 

/*查询用户*/ 

public String queryUser(Integer id); 

}

2、Provider:服务中心

```java
package com.rpc.provider; 

import com.rpc.api.IRpcService; 

public class RpcServiceImpl implements 

IRpcService { 

@Override 

public String addUser() { 

return "增加用户"; 

}

@Override 

public String deleteUser(Integer id) { 

return "删除了编号为"+id+"的用户"; 

}

@Override 

public String updateUser(Integer id) { 

return "修改了编号为"+id+"的用户"; 

}

@Override 

public String queryUser(Integer id) { 

return "查询到了编号为"+id+"这个用户的信息"; 

} 

}
package com.rpc.provider; 

import com.rpc.api.IRpcHelloService; 

/**

* 服务中心,实现对外提供的所有服务的具体功能 

*/ 

public class RpcHelloServiceImpl implements IRpcHelloService {
    

public String hello(String name) {
    

return "Hello " + name + "!"; 

} 

}
3、protocol传输协议内容

ackage com.rpc.protocol; 

import java.io.Serializable; 

/**

* 自定义传输协议内容 

*/ 

public class InvokerProtocol implements 

Serializable {
    

private String className;//类名 

private String methodName;//函数名称 

private Class<?>[] parames;//形参列表

private Object[] values;//实参列表 

public String getClassName() {
    

return className; 

}

public void setClassName(String className)

 {
    

this.className = className; 

}

public String getMethodName() {
    

return methodName; 

}

public void setMethodName

(String methodName)

 {
    

this.methodName = methodName; 

}

public Class<?>[] getParames() {
    

return parames; 

}

public void setParames(Class<?>[] parames) 

{
    

this.parames = parames; 

}

public Object[] getValues() {
    

return values; 

}

public void setValues(Object[] values) {
    

this.values = values; 

} 

}

4、Registry注册中心

package com.rpc.registry; 

import io.netty.bootstrap
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值