# 基于Java + Etcd + Vert.x的自定义RPC框架
## 项目简介
本项目是一个基于Java、Etcd和Vert.x框架实现的自定义RPC(远程过程调用)框架。开发者可以通过引入Spring Boot Starter,使用注解和配置文件快速使用该框架,实现像调用本地方法一样轻松调用远程服务。框架支持通过SPI机制动态扩展序列化器、负载均衡器、重试和容错策略等。
## 项目的主要特性和功能
- **核心架构**:包括消费方调用、序列化器、网络服务器、请求处理器、注册中心、负载均衡器、重试策略、容错策略等模块。
- **全局配置加载**:使用双检锁单例模式维护全局配置对象,并通过snakeyaml实现多环境yaml配置文件的加载。
- **接口Mock**:通过JDK动态代理 + 工厂模式实现,为指定服务接口类生成返回模拟数据的Mock服务对象,便于开发者测试。
- **多种序列化器实现**:定义序列化器接口,实现了基于JSON、Kryo和Hessian的序列化器,并通过ThreadLocal解决了Kryo序列化器的线程安全问题。
- **消费方调用**:基于JDK动态代理 + 工厂模式实现消费方调用模块,为指定服务接口类生成可发送TCP请求的代理对象,实现远程方法的无感知调用。
- **可扩展设计**:使用工厂模式 + 单例模式简化创建和获取序列化器对象的操作。并通过扫描资源路径 + 反射自实现了SPI机制,用户可通过编写配置的方式扩展和指定自己的序列化器。
- **注册中心**:基于Etcd云原生中间件实现了高可用的分布式注册中心,利用其层级结构和Jetcd的KvClient存储服务和节点信息,并支持通过SPI机制扩展。
- **注册中心优化**:利用定时任务和Etcd Key的TTL实现服务提供者的心跳检测和续期机制,节点下线一定时间后自动移除注册信息。
- **消费者服务缓存**:使用本地对象维护已获取到的服务提供者节点缓存,提高性能;并通过Etcd的Watch机制,监听节点的过期并自动更新缓存。
- **自定义协议**:由于HTTP协议头信息较多,基于Vert.x TCP服务器 + 类Dubbo的紧凑型消息结构(字节数组)自实现了RPC协议,提升网络传输性能。
- **半包粘包**:基于Vert.x的RecordParser完美解决半包粘包问题,并使用装饰者模式封装了TcpBufferHandlerWrapper类,一行代码即可对原有的请求处理器进行增强,提高代码的可维护性。
- **负载均衡器**:为提高服务提供者集群处理能力,实现了一致性Hash、轮询、随机等不同算法的负载均衡器,并通过SPI机制支持开发者自行扩展。
- **重试机制**:为提高消费端调用的稳定性,基于Guava Retrying实现了包括fixedWait等多种重试策略,并通过SPI机制支持开发者自行扩展。
- **容错机制**:为提高系统的稳定性和可用性,设计实现了FailOver、FailBack、FailSafe、FailFast等多种重试策略,并通过SPI机制支持开发者自行扩展。
- **注解驱动**:为降低开发者的使用成本,封装了服务提供者和消费者启动类;并开发了基于注解驱动的Spring Boot Starter,一个注解就能快速注册Bean为服务、以及注入服务调用代理对象。
## 安装使用步骤
### 非Spring Boot项目
#### 服务提供端
1. **引入依赖**:
```xml
<dependency>
<groupId>com.han.rpc</groupId>
<artifactId>my-rpc-core</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
```
2. **启动Etcd**:
本地启动Etcd,端口2379。
3. **编写配置文件**(application.yml 或 application.yaml):
```yaml
rpc:
name: my-rpc
version: 1.0
serverHost: localhost
serverPort: 9090
mock: false
serializer: kryo
registryConfig:
registry: etcd
address: http://localhost:2379
```
4. **编写要提供的服务**:
```java
public class UserServiceImpl implements UserService {
public User getUser(User user) {
System.out.println("用户名为" + user.getName());
return user;
}
}
```
5. **编写服务提供者示例**,运行后会在指定端口启动一个服务器:
```java
public class ProviderExample {
public static void main(String[] args) {
List<ServiceRegisterInfo<?>> serviceRegisterInfoList = new ArrayList<>();
ServiceRegisterInfo<UserService> service = new ServiceRegisterInfo<>(UserService.class.getName(), UserServiceImpl.class);
serviceRegisterInfoList.add(service);
ProviderBootstrap.init(serviceRegisterInfoList);
}
}
```
6. **利用SPI机制自行扩展**(以扩展序列化器为例):
- 实现Protobuf序列化器,创建一个类 `ProtobufSerializer` 实现 `com.han.rpc.serializer.Serializer` 接口,实现其中的 `serialize` 和 `deserialize` 方法。
- 在 my-rpc-core 的 META-INF/rpc/custom 目录下创建名为 com.han.rpc.serializer.Serializer 的文件,内容为 `protobuf=com.han.rpc.serializer.ProtobufSerializer`。
- 在服务提供者和服务消费者的配置文件中修改序列化器为自定义的。
#### 服务消费端
1. **引入依赖**:
```xml
<dependency>
<groupId>com.han.rpc</groupId>
<artifactId>my-rpc-core</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
```
2. **编写配置文件**(application.yml 或 application.yaml):
```yaml
rpc:
name: my-rpc
version: 1.0
mock: false
serializer: kryo
loadBalancer: roundRobin
retryStrategy: fixedInterval
tolerantStrategy: failFast
registryConfig:
registry: etcd
address: http://localhost:2379
```
3. **编写服务消费者示例**:
```java
public class EasyConsumerExample {
public static void main(String[] args) {
ConsumerBootstrap.init();
UserService userService = ServiceProxyFactory.getProxy(UserService.class);
User user = new User();
user.setName("小明");
User newUser = userService.getUser(user);
}
}
```
### Spring Boot项目
#### 服务提供端
1. **引入依赖**:
```xml
<dependency>
<groupId>com.han.rpc</groupId>
<artifactId>my-rpc-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
```
2. **编写配置文件**:
```yaml
rpc:
name: my-rpc
version: 1.0
serverHost: localhost
serverPort: 9090
mock: false
serializer: kryo
registryConfig:
registry: etcd
address: http://localhost:2379
```
3. **在服务实现类上加上 `@RpcService` 注解**:
```java
@Service
@RpcService
public class UserServiceImpl implements UserService {
@Override
public User getUser(User user) {
System.out.println("springboot.provider.UserServiceImpl 用户名:" + user.getName());
return user;
}
}
```
4. **启动类上加上 `@EnableRpc` 注解**:
```java
@SpringBootApplication
@EnableRpc
public class SpringbootProviderApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootProviderApplication.class, args);
}
}
```
#### 服务消费端
1. **引入依赖**:
```xml
<dependency>
<groupId>com.han.rpc</groupId>
<artifactId>my-rpc-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
```
2. **编写配置文件**:
```y
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
基于Java Etcd Vert.x的自定义RPC框架 项目简介 本项目是一个基于Java、Etcd和Vert.x框架实现的自定义RPC(远程过程调用)框架。开发者可以通过引入Spring Boot Starter,使用注解和配置文件快速使用该框架,实现像调用本地方法一样轻松调用远程服务。框架支持通过SPI机制动态扩展序列化器、负载均衡器、重试和容错策略等。 项目的主要特性和功能 核心架构包括消费方调用、序列化器、网络服务器、请求处理器、注册中心、负载均衡器、重试策略、容错策略等模块。 全局配置加载使用双检锁单例模式维护全局配置对象,并通过snakeyaml实现多环境yaml配置文件的加载。 接口Mock通过JDK动态代理 工厂模式实现,为指定服务接口类生成返回模拟数据的Mock服务对象,便于开发者测试。
资源推荐
资源详情
资源评论
收起资源包目录
基于Java Etcd Vert.x的自定义RPC框架.zip (119个子文件)
.gitignore 428B
.gitignore 428B
EtcdRegistry.java 9KB
ZooKeeperRegistry.java 9KB
ServiceProxy.java 8KB
SpiLoader.java 7KB
VertxTcpClient.java 6KB
HttpServerHandler.java 4KB
TcpServerHandler.java 4KB
HttpServerHandler.java 4KB
RegistryTest.java 4KB
ProtocolMessageDecoder.java 4KB
LoadBalancerTest.java 4KB
RpcProviderBootstrap.java 4KB
JsonSerializer.java 4KB
ConsistentHashLoadBalancer.java 4KB
ConfigUtils.java 3KB
TcpBufferHandlerWrapper.java 3KB
LeastActiveLoadBalancer.java 3KB
ProviderBootstrap.java 3KB
FixedIntervalRetryStrategy.java 3KB
RpcApplication.java 3KB
ExponentialBackoffRetryStrategy.java 3KB
MockServiceProxy.java 3KB
ProtocolMessageEncoder.java 3KB
ProtocolMessageTest.java 3KB
RpcInitBootstrap.java 3KB
KryoSerializer.java 3KB
ServiceProxy.java 3KB
JdkSerializer.java 3KB
VertxTcpServer.java 3KB
RpcConsumerBootstrap.java 2KB
EasyConsumerExample.java 2KB
ProtocolMessageSerializerEnum.java 2KB
Registry.java 2KB
ConsumerExample.java 2KB
RpcConfig.java 2KB
ProtocolMessage.java 2KB
RandomLoadBalancer.java 2KB
ServiceMetaInfo.java 2KB
RegistryServiceCache.java 2KB
RpcReference.java 2KB
EasyProviderExample.java 2KB
JdkSerializer.java 2KB
ServiceProxyFactory.java 2KB
RpcRequest.java 2KB
EtcdTest.java 2KB
RpcResponse.java 2KB
RegistryFactory.java 2KB
RetryStrategyTest.java 2KB
RoundRobinLoadBalancer.java 2KB
RpcService.java 2KB
UserServiceImpl.java 2KB
TolerantStrategyFactory.java 2KB
HessianSerializer.java 2KB
EnableRpc.java 2KB
LocalRegistry.java 2KB
ProtocolMessageStatusEnum.java 2KB
LocalRegister.java 2KB
SerializerFactory.java 2KB
RetryStrategyFactory.java 2KB
VertxHttpServer.java 2KB
SpringbootConsumerApplication.java 2KB
LoadBalancer.java 2KB
FailBackTolerantStrategy.java 2KB
ProviderExample.java 2KB
VerxHttpServer.java 2KB
RpcResponse.java 2KB
RpcRequest.java 2KB
SpringbootConsumerApplicationTests.java 2KB
ProtocolMessageTypeEnum.java 2KB
UserService.java 1KB
ServiceProxyFactory.java 1KB
LoadBalancerFactory.java 1KB
FailFastTolerantStrategy.java 1KB
ProtocolConstant.java 1KB
Serializer.java 1KB
SpringbootProviderApplication.java 1KB
RegistryConfig.java 1KB
ServiceRegisterInfo.java 1KB
LoadBalancerKeys.java 1KB
FailSafeTolerantStrategy.java 1KB
RetryStrategyKeys.java 1KB
TolerantStrategy.java 1KB
Serializer.java 1KB
ConsumerExample.java 1KB
RpcConstant.java 1KB
RetryStrategy.java 1KB
NoRetryStrategy.java 1001B
TolerantStrategyKeys.java 969B
UserServiceImpl.java 837B
RegistryKeys.java 826B
SpringbootProviderApplicationTests.java 822B
FailOverTolerantStrategy.java 777B
User.java 760B
SerializerKey.java 750B
ConsumerBootstrap.java 729B
HttpServer.java 573B
HttpServer.java 440B
com.han.rpc.loadbalancer.LoadBalancer 178B
共 119 条
- 1
- 2
资源评论
t0_54coder
- 粉丝: 2462
- 资源: 4756
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功