基于netty实现的高性能可扩展RPC框架
- 支持多种序列化协议,包括java,protobuf,kryo和hessian
- 客户端调用支持多种负载均衡算法,包括随机、轮询、加权轮询和平滑加权轮询
- 支持主流注册中心Nacos和Zookeeper
- 支持泛化调用
- 客户端代理对象生成方式支持JDK动态代理、Javassist字节码和Java动态编译生成
添加maven依赖到你的项目中
<dependency>
<groupId>io.github.2ysp</groupId>
<artifactId>ship-rpc-spring-boot-starter</artifactId>
<version>1.0.4-RELEASE</version>
</dependency>
1. 普通RPC调用
引入接口依赖,使用@InjectService注解注入远程方法
@RestController
@RequestMapping("test")
public class TestController {
@InjectService
private UserService userService;
@GetMapping("/user")
public ApiResult<User> getUser(@RequestParam("id")Long id){
return userService.getUser(id);
}
}
2. 泛化调用
@RestController
@RequestMapping("/GenericTest")
public class GenericTestController {
@GetMapping("/user")
public String getUserString(@RequestParam("id") Long id) {
//cn.sp.UserService.getUserString
GenericService instance = GenericServiceFactory.getInstance("cn.sp.UserService");
Object result = instance.$invoke("getUserString", new String[]{"java.lang.Long"}, new Object[]{id});
return result.toString();
}
@GetMapping("")
public String getUser(@RequestParam("id") Long id) {
//cn.sp.UserService.getUserString
GenericService instance = GenericServiceFactory.getInstance("cn.sp.UserService");
Object result = instance.$invoke("getUser", new String[]{"java.lang.Long"}, new Object[]{id});
return result.toString();
}
}
配置项:
属性 | 含义 | 可选项 |
---|---|---|
sp.rpc.protocol | 消息序列化协议 | java,protobuf,kryo,hessian |
sp.rpc.register-address | 注册中心地址 | 默认localhost:2181 |
sp.rpc.register-center-type | 注册中心类型,默认nacos | nacos zk |
sp.rpc.load-balance | 负载均衡算法 | random round weightRound smoothWeightRound |
sp.rpc.proxy-type | 客户端代理对象生成方式,默认JDK动态代理 | jdk javassist compiler |
建议使用Javassist字节码或Java动态编译的方式,性能更好。
提供远程方法并注入IOC
@Service
public class UserServiceImpl implements UserService{
private static Logger logger = LoggerFactory.getLogger(UserService.class);
@Override
public ApiResult<User> getUser(Long id) {
logger.info("现在是【3】号提供服务");
User user = new User(1L,"XX",2,"www.aa.com");
return ApiResult.success(user);
}
@Override
public String getUserString(Long id) {
logger.info("getUserString");
User user = new User(1L,"XX",2,"www.aa.com");
return JSON.toJSONString(ApiResult.success(user));
}
}
注意: 这里的@Service注解不是Spring的,而是com.github.ship.annotation.Service。
配置项:
属性 | 含义 | 可选项 |
---|---|---|
sp.rpc.protocol | 消息序列化协议 | java,protobuf,kryo |
sp.rpc.register-address | 注册中心地址 | 默认localhost:2181 |
sp.rpc.register-center-type | 注册中心类型,默认nacos | nacos zk |
sp.rpc.server-port | 服务端通信端口号 | 默认9999 |
sp.rpc.weight | 权重 | 默认1 |
启动顺序: 注册中心——> 服务端 ——> 客户端
用法示例: https://github.com/2YSP/rpc-example
文章: https://www.cnblogs.com/2YSP/p/13545217.html
- 执行链动态Filter
- 支持链路追踪
- RPC上下文传递等