背景及简介
在微服务架构大行其道的今天,服务发现及rpc通信框架扮演的“戏份”也越来越重,业界使用较广泛的有阿里系的dubbo,或者为中小型项目而生的spring cloud全家桶等等,都得到了实践与认可。大部分初学者的学习往往只能停留在使用层面,为了更深入的了解服务发现机制以及rpc的原理,后续的文章《徒手编写服务发现框架》系列,我们一起揭开它的神秘面纱,自己动手实现一款简单的服务发现框架!
我们目标是要编写一款集服务发现、rpc通信于一体的框架,通信层基于netty实现,底层原理基于反射、动态代理实现。 纯基于Javaconfig方式配置,无xml。配置中心基于redis。
特性
- 传输方式:TCP长连接,NIO异步通信
- 序列化:json
- 适用场景:服务间高性能、低延迟调用
注意事项
- 注册中心目前采用redis实现,注册中心可用性暂不保证
进阶篇(待实现)
- 心跳检测
- 负载均衡
- 链路监控
- 熔断
服务提供端配置:
@Configuration
public class RpcConfig {
@Bean
public RegistryConfig registryConfig(){
RegistryConfig registryConfig = new RegistryConfig();
registryConfig.setRegistryHost("127.0.0.1");
registryConfig.setRegistryPort(6379);
registryConfig.setPort(3333);
registryConfig.setServerName("spring-boot-demo");
registryConfig.setProviderConfigs(providerConfig());
return registryConfig;
}
private Set<ProviderConfig> providerConfig(){
Set<ProviderConfig> providerConfigs = new HashSet<>();
ProviderConfig<IUserServiceApiImpl> providerConfig = new ProviderConfig<>();
providerConfig.setApiName("com.zxm.rpc.api.IUserServiceApi");
providerConfig.setImplementsClass(IUserServiceApiImpl.class);
providerConfigs.add(providerConfig);
return providerConfigs;
}
@Bean
public RegistryHandler registryHandler() throws UnknownHostException{
RegistryHandler registryHandler = new RegistryHandler(registryConfig());
registryHandler.registry();
return registryHandler;
}
@Bean
public ProviderProxyInvoker providerProxyInvoker()throws UnknownHostException{
return new ProviderProxyInvoker(registryConfig(),registryHandler());
}
}
服务消费端配置:
@Configuration
public class RefConfig {
@Bean
public IUserServiceApi referenceConfig() {
ReferenceConfig<IUserServiceApi> referenceConfig = ReferenceConfig
.instance()
.apiName("com.zxm.rpc.api.IUserServiceApi")
.providerName("spring-boot-demo")
.registryHost("10.13.1.210")
.registryPort(6379)
.timeout(5000)
.build();
return referenceConfig.register();
}
}
项目地址: https://github.com/zhangxiaomin1993/rpc-server-sdk
声明:文章和项目不以商业盈利为目的,仅作为本人技术积累的沉淀,分享给大家,有兴趣的朋友欢迎访问交流,共同学习和进步!大佬和专家路过,不喜勿喷!