Code Monkey home page Code Monkey logo

rpc-spring-boot-starter's Introduction

ship-rpc-spring-boot-starter

基于netty实现的高性能可扩展RPC框架

一、特性

  • 支持多种序列化协议,包括java,protobuf,kryo和hessian
  • 客户端调用支持多种负载均衡算法,包括随机、轮询、加权轮询和平滑加权轮询
  • 支持主流注册中心Nacos和Zookeeper
  • 支持泛化调用
  • 客户端代理对象生成方式支持JDK动态代理、Javassist字节码和Java动态编译生成

二、使用方法

2.1 pom.xml

添加maven依赖到你的项目中

       <dependency>
           <groupId>io.github.2ysp</groupId>
           <artifactId>ship-rpc-spring-boot-starter</artifactId>
           <version>1.0.4-RELEASE</version>
       </dependency>

2.2 客户端

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动态编译的方式,性能更好。

2.3 服务端

提供远程方法并注入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

三、TODO List

  • 执行链动态Filter
  • 支持链路追踪
  • RPC上下文传递等

rpc-spring-boot-starter's People

Contributors

2ysp avatar jahjahwei avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

rpc-spring-boot-starter's Issues

netty请求处理器v2的问题

为什么不直接在channelRead方法里面读取数据,反而搞了一个future。本来不就是异步的吗,这一步是不是多此一举了

粘包拆包问题

请问作者粘包和拆包情况有考虑吗?代码里面目前没看到有Encoder和Decoder

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.