V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
pwh19920920
V2EX  ›  分享创造

怎么就想不开了,自己手撸了 RPC 框架

  •  
  •   pwh19920920 · 2020-05-29 09:49:33 +08:00 · 3967 次点击
    这是一个创建于 1638 天前的主题,其中的信息可能已经有所发展或是发生改变。

    项目真正启动是在 19 年 5 月吧,因为懒,中间停了起码半年,最近又开始拾了起来,撸起袖子接着干,终于在这几天撸出来了,别说了,我又要去养养身子了。。。。

    项目名字 Xmutca-rpc

    项目地址: https://github.com/pwh19920920/xmutca-rpc

    Xmutca-rpc 是一个基于 netty 开发的分布式服务框架,提供稳定高性能的 RPC 远程服务调用功能,支持注册中心,服务治理,负载均衡等特性,开箱即用。

    模块介绍

    • 1.xmutca-rpc-core rpc 核心模块
    • 2.xmutca-rpc-example rpc 示例
    • 3.xmutca-rpc-local 本地容器实现
    • 4.xmutca-rpc-registry-nacos nacos 注册中心
    • 5.xmutca-rpc-spring spring 容器实现

    实现功能

    • 1.核心实现:SPI 扩展,支持动态加载拓展实现,具体可以看实现类 ExtensionLoader
    • 2.负载均衡:现在已支持轮训负载,随机负载,也可自定义
    • 3.集群容错:FailFast 快速失败、FailOver 故障切换,FailSafe 故障安全, FailBack 失败恢复,Broadcast 广播调用
    • 4.注册发现:目前支持接入 nacos
    • 5.容器支持:支持本地 java 容器,支持 spring 容器
    • 6.注解拓展:支持注解加载提供者,注解获取远程 rpc 对象
    • 7.序列方式:支持 fastJson, Kryo, protostuff 序列化,默认走 protostuff 序列化
    • 8.极速拓展:允许加载自定义的过滤器,自定义容器,自定义注册中心等等。

    快速开始

    1. maven 配置
    <dependency>
        <groupId>com.xmutca</groupId>
        <artifactId>xmutca-rpc-core</artifactId>
        <version>0.0.1-SNAPSHOT </version>
    </dependency>
    
    <dependency>
        <groupId>com.xmutca</groupId>
        <artifactId>xmutca-rpc-spring</artifactId>
        <version>0.0.1-SNAPSHOT </version>
    </dependency>
    
    <dependency>
        <groupId>com.xmutca</groupId>
        <artifactId>xmutca-rpc-registry-nacos</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
    
    2. 定义接口
    public interface HelloService {
    
        /**
         * test
         * @param msg
         * @return
         */
        String sayHello(String msg);
    }
    
    3. 提供者实现接口
    @Component
    @Provider(interfaceClass = HelloService.class)
    public class HelloServiceImpl implements HelloService {
    
        @Autowired
        private TestService testService;
    
        @Override
        public String sayHello(String msg) {
            return testService.test() + " -> " + msg;
        }
    }
    
    4. 提供者配置
    rpc:
      registry: nacos://localhost:8848 # 注册中心地址
      provider: # 提供者配置
        corePoolSize: 60       # 核心线程数
        maxPoolSize: 300       # 最大线程数
        port: 8886             # 提供者端口
        scanPackage: com.xmutca.rpc.provider.facade   # 扫描提供者包路径
        metadata:              # 服务元数据
          group: "order"       # 服务分组
          serviceName: "test"  # 服务名称
          version: "v1.0.0"    # 服务版本
    
    
    5. 启动提供者
    @EnableXmutcaRpc
    @SpringBootApplication
    public class XmutcaSpringProviderApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(XmutcaSpringProviderApplication.class, args);
        }
    }
    
    6. 消费者引用
    @RestController
    @RequestMapping
    public class ControllerTest {
    
        @Reference(serviceName = "test", group = "order", interfaceClass = HelloService.class)
        private HelloService helloService;
    
        @RequestMapping("/test")
        public Object test() {
            return helloService.sayHello("test");
        }
    }
    
    7. 消费者配置
    rpc:
      registry: nacos://localhost:8848
      consumer:
        - timeout: 1000               # 超时配置
          metadata:
            group: "order"            # 服务分组
            serviceName: "test"       # 服务名称
            version: "v1.0.0"         # 服务版本
    
    8. 启动消费者
    @EnableXmutcaRpc
    @SpringBootApplication
    public class XmutcaSpringConsumerApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(XmutcaSpringConsumerApplication.class, args);
        }
    }
    

    作者题外话

    此项目欢迎各位 v 友试用,互相学习,如有 bug 及时反馈,谢谢。

    7 条回复    2020-06-01 13:26:53 +08:00
    zzmFina
        1
    zzmFina  
       2020-05-29 17:57:22 +08:00
    居然没人回复
    Cmxxx
        2
    Cmxxx  
       2020-05-29 18:38:15 +08:00
    好厉害
    pomelotea2009
        3
    pomelotea2009  
       2020-05-30 07:46:49 +08:00 via Android
    为楼主的毅力点赞
    labulaka521
        4
    labulaka521  
       2020-05-30 09:57:38 +08:00 via Android
    OctopusGO
        5
    OctopusGO  
       2020-06-01 00:20:32 +08:00 via iPhone
    厉害,学习了
    ala2008
        6
    ala2008  
       2020-06-01 10:03:12 +08:00
    可以写个教程,菜鸟搞不定啊
    pwh19920920
        7
    pwh19920920  
    OP
       2020-06-01 13:26:53 +08:00
    @ala2008 小哥你说的教程是这个 rpc 框架的实现原理吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2687 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 00:04 · PVG 08:04 · LAX 16:04 · JFK 19:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.