an rpc framework
- 注册中心
- zookeeper
- redis
- 负载均衡
- Random
- RoundRobin
- WeightRandom
- WeightRoundRobin
- idc负载
- 失败重试策略
- fastfail
- fastover
- 序列化协议
- protobuf
- jackson
- fastjson
- hessian2
- 应用协议兼容
- dubbo(还存在问题)
- http
- brpc
- 集成spring boot starter
- 限流
- 计数器算法
- 令牌桶算法
- 漏桶算法
- 熔断
- prpc管理后台
demo详情可查看prpc-example
- java8及以上
- 依赖zookeeper
服务端和客户端都需要依赖prpc-spring-boot-starter
<dependency>
<groupId>com.weaponlin.inf.prpc</groupId>
<artifactId>prpc-spring-boot-starter</artifactId>
<version>${latest-version}</version>
</dependency>
public interface HelloApi {
HelloResponse hello(Long userId, HelloRequest request);
}
(1) 引用api依赖并实现
<dependency>
<groupId>com.weaponlin.inf.prpc</groupId>
<artifactId>api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
public class HelloApiImpl implements HelloApi {
public HelloResponse hello(Long userId, HelloRequest request) {
HelloResponse res = HelloResponse.builder().greeting(RandomStringUtils.random(request.getSize(), true, true))
.build();
return res;
}
}
(2) 在application.yml添加server配置
prpc:
server: # 标识为服务端配置
protocol: prpc # 全局配置
registryCenter:
naming: zookeeper
address: 127.0.0.1:2181
codec: protobuf
timeout: 30000
groups: # 服务分组配置
- group: default # 服务分组名称
registryCenter: # 注册中心
naming: zookeeper # 命名方式,eg: zookeeper、redis(待支持)
address: 127.0.0.1:2181 # 注册中心地址
codec: protobuf # 编解码,eg: protobuf、fastjson、jackson、
protocol: prpc # 通信协议,eg: prpc、dubbo(待优化)、brpc(待支持)
timeout: 30000
basePackage: com.weaponlin.inf.prpc.api # api所在的包,多个包以逗号分割(待支持)
(3) 启动应用
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
(1) 引用api
<dependency>
<groupId>com.weaponlin.inf.prpc</groupId>
<artifactId>api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
(2) 创建controller调用api
引用api需要标注 @ReferenceService 注解
@RestController
@RequestMapping("")
public class HelloController {
@ReferenceService
private HelloApi helloApi;
@GetMapping("/hello")
public HelloResponse hello() {
HelloRequest req = new HelloRequest();
req.setSize(111);
req.setMessage("asdfasdfadsf");
return helloApi.hello(1L, req);
}
}
(3) 在application.yml添加client配置
prpc:
client: # 标识为客户端配置
protocol: prpc # 全局配置
registryCenter:
naming: zookeeper
address: 127.0.0.1:2181
codec: protobuf
loadBalance: roundrobin
cluster: failfast # 容错机制
groups:
- group: default
registryCenter:
naming: zookeeper
address: 127.0.0.1:2181
codec: protobuf
loadBalance: roundrobin # 负载均衡
protocol: prpc
timeout: 30000
basePackage: com.weaponlin.inf.prpc.api
# web 服务端口
server:
port: 8081
(4) 启动应用
@SpringBootApplication
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
一些待优化的事情记录
- 协议优化,分别读写meta、request、response等
- shutdown hook,在服务关闭的时候及时清理zk节点
- zookeeper server节点优化,定义prpc协议,例如: prpc://127.0.0.1:9999?idc=nj&weight=10
- 心跳检测
- 添加filter机制,用来支持限流、熔断等功能
- naming service,支持命名方式解析
- config数据结构优化,清晰一些
- 支持多端口启动,例如服务同时需要支持dubbo和prpc协议,需要启动两个端口,分别接收请求
- prpc协议添加magic num
- client请求进行管理,例如:超时直接抛异常
- 预置系统变量,例如:idc等
- ServiceLoader优化,静态代码块,在使用的时候采取加载初始化,导致获取service太慢了
- 限制请求大小
- meta里添加rpc version等信息,方便后续扩展
- 支持dubbo协议,但是没调用几次provider就会关闭,consumer提示provider关闭了
- 支持标注@ExportService注解的服务发布
- 支持多包发布或引用
- 服务端口可配置化(感觉意义不大)