-
基于 netty4 手写 rpc-17-interceptor 拦截器
拦截器
说明
有时候我们需要统计方法的耗时,需要知道统计出参/入参的相关信息。
通过拦截器都可以非常方便的实现。
设计思路
无论是客户端还是服务端,只需要在方法执行前后,加入拦截器相关的方法调用,加入对应的上下文信息即可。
客户端实现
个人理解
目前主要在客户端添加拦截器,其实服务端是类似的。
代码实现
接口定义
package com.github.houbb.rpc...
2018-08-24 08:23:15 |
Java
-
基于 netty4 手写 rpc-16-gracefully shutdown 优雅关闭
优雅摘除服务
说明
我觉得这可以说是 rpc 最需要的一个功能。
因为他的实际意义非常重大,就是可以任意时间发布应用,而对业务无损。
以前发布应用都要等到半夜,很累也容易出问题。
思路
结合 java 的 ShutdownHook 以及 linux 的 kill PID 来达到这个目的。
ShutdownHook 讲解
服务提供方
停止时,先标记为不接收新请求,...
2018-08-24 08:23:15 |
Java
-
基于 netty4 手写 rpc-15-generic 泛化调用
generic 泛化调用
说明
泛化接口调用方式主要用于客户端没有 API 接口及模型类元的情况,参数及返回值中的所有 POJO 均用 Map 表示,通常用于框架集成,比如:实现一个通用的服务测试框架,可通过 GenericService 调用所有服务实现。
GenericService barService = (GenericService) applicationContext....
2018-08-24 08:23:15 |
Java
-
基于 netty4 手写 rpc-14-fail 失败策略
fail 失败策略
说明
当我们调用服务失败的时候,有很多策略。
比如:
FailFast
快速失败
FailOver
尝试下一次调用
等等其他各种策略。
实现思路
不同的失败策略方式只是处理失败的方式不同而已。
这个主要放在客户端,当调用失败的时候,重新进行尝试即可。
代码实现
接口
首先,是失败策略的接口定义。
package com.git...
2018-08-24 08:23:15 |
Java
-
基于 netty4 手写 rpc-13-callType 调用方式
callType 调用方式
说明
不同的场景我们会希望有不同的调用方式。
常见的有三种调用方式:
(1)sync 同步调用
(2)async 异步调用
(3)oneWay 单向调用
个人感觉(1)(3)是最常见的需求,所以本次优先实现了这两种。
实现思路
不同的调用方式只是处理的行为不同而已。
可以将这个配置传递,分别在 client/server 的端进行相应的处理。
...
2018-08-24 08:23:15 |
Java
-
基于 netty4 手写 rpc-12-load balance 负载均衡
load balance
当我们有多个服务端时,就需要负载均衡进行选择。
策略
负载均衡的策略有很多,比如随机选择,权重选择,最小负载等等。
实现思路
直接将所有可以选择的服务端列举出来,通过实现对应的策略,选择一个即可。
代码实现
接口
为了便于拓展,我们定义一个接口。
/*
* Copyright (c) 2019. houbinbin Inc.
* rpc Al...
2018-08-24 08:23:15 |
Java
-
基于 netty4 手写 rpc-11-register center 注册中心
register 注册中心
上一节我们实现了 register 注册中心的基本实现,当然客户端和服务端也需要相关的实现调整。
服务端
ServiceRegistry
接口
调整如下:
package com.github.houbb.rpc.server.registry;
/**
* 服务注册类
* (1)每个应用唯一
* (2)每个服务的暴露协议应该保持一致
* 暂...
2018-08-24 08:23:15 |
Java
-
基于 netty4 手写 rpc-10-register center 注册中心
register 注册中心
需求
服务的注册与发现,是一个很常见也很有用的需求。
可以让我们不关心服务端的 ip 信息,只关心服务本身。
思路
实现的方式
SimpleRpcRegister 为 rpc 提供的默认实现方案。
实际可以结合 redis,zk 等常见的成熟框架实现。
其实可以把 register 当做是服务端,此时的 server/client 都是客户端。
...
2018-08-24 08:23:15 |
Java