痛点

1. bsf底层依赖springcloud,影响bsf更新springboot新版本和整体最新技术版本升级。
2. eureka已经闭源,且框架设计较重,同时引入eureka会自行引入较多springcloud相关包和组件。

方案

1. 自研轻量级rpc框架Bsf APIRegistry。

目标

Bsf APIRegistry需要解决的关键痛点:
1. 代码简单,简单,简单!框架实现要轻量,容易扩展,这样性能扩展也会很高。
2. 要兼容旧项目@FeignClient,业务开发零改造代码,实现业务零感知无缝迁移。
3. 引入的第三方组件越少越好,以后bsf组件冲突问题也会少。(本地服务启动时间应该也会比eureka注册中心快很多)
4. 高性能,高扩展能力,可以支持未来服务上万节点在线。
5. 解决现有本地调试痛点。(开发环境在阿里云容器中,要实现多人开发本地测试在线联调!)
6. 支持无注册中心方式使用和无缝迁移。(可以借助k8s自带负载均衡网关,兼容场景并使用无注册中心架构)

技术要求

Bsf APIRegistry需要具备几个关键技术点:
  • 支持HttpUrlConnection,HttpClient建立的连接池及扩展。
  • 支持轮训模式负载均衡及扩展。
  • 支持消费者端检测故障,临时转移到可用服务,待服务故障恢复后恢复调用。
  • 支持redis注册中心及扩展,以及无注册中心架构。
  • 支持protobuf协议,整体rpc性能会有较大提升。

架构示意图

整体参考按照eureka的技术原理,以bsf-core框架(https://gitee.com/chejiangyi/free-bsf-all/)为核心,优先扩展实现redis注册中心方案。同时整体架构考虑eureka注册中心的兼容性使用,@feignClient注解的feign的兼容性api协议编写,支持双注册中心部署和无缝迁移方案,从而达到开发人员零改动,无感知的目标。
同时redis单机可以支持上万客户端链接,同样redis也支持主从高可用分布式部署,故采用redis做注册中心也可以支持上万的分布式服务节点同时在线和注册中心高可用支持。在框架层面注册中心抽象剥离实现可扩展,也可以为更好更高性能的注册中心实现做扩展能力支持。
 

消费者端RPC调用生命周期图

整体rpc调用会经历客户端@ApiClient(兼容@FeignClient注解)协议解析为RPC Request信息,通过RPC负载均衡器获取服务列表的可用节点(排除故障节点),进行RPC编码器进行编码(json或者protobuf等),再通过RPC 连接池(http连接池)获取可用tcp连接调用远程rpc结果,然后对rpc结果进行RPC解码器解码,最终返回RPC对象结果。
 

消费者端RPC启动初始化

整体rpc框架启动时会经历一次初始化,通过包扫描@ApiClient(兼容@FeignClient注解)相关的协议接口类,会对协议接口类进行透明代理,并注册代理实例到springboot bean中。
 

兼容eureka模式的无缝迁移方案

为了保证无缝迁移和开发人员无感知,在bsf sdk层面对@FeignClient(feign调用)做协议兼容支持,这样理论上开发人员无需改动旧代码;同时2.1 版本bsf sdk层面实现双注册中心兼容(支持eureka server和bsf ApiRegistriy同时在线)去确保平滑迁移;在bsf sdk中加入“测试模式”,通过apollo配置中心动态修改模式,支持框架层面随时切换使用eureka server和ApiRegistry任意注册中心调用rpc,也可以对rpc结果进行同步核对结果集校验+动态报警(确保协议兼容验证)来确保可以兼容稳定迁移和迁移实时回滚。
 

ApiRegistry开源地址

包含源码,更多详细配置,实践和场景支持记录。

源码核心模块

其中核心类就两三个,源码总共也就10几个类,代码简单,逻辑简单(核心就是为了轻量!!!),一般在10分钟就可以看明白整体结构和代码。
 

小白快速上手

  • 引用包
<dependency>
<artifactId>free-bsf-api</artifactId>
<groupId>com.free.bsf</groupId>
<version>2.2-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>free-bsf-core</artifactId>
<groupId>com.free.bsf</groupId>
<version>2.2-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>free-bsf-apiregistry</artifactId>
<groupId>com.free.bsf</groupId>
<version>2.2-SNAPSHOT</version>
</dependency>
free-bsf-api:为协议包,包含ApiRegistry通用协议,用在业务项目协议层。
free-bsf-core:为bsf核心包,一般为工具类为主。
free-bsf-apiregistry:为bsf ApiRegistry实现包。
 
  • properties配置:
#springboot 应用名
spring.application.name=free-demo-provider
#一键启用开关,默认false,重启后生效
bsf.apiRegistry.enabled=true
#支持ApiClient/FeignClient注解方式的Rpc拦截,重启后生效,默认false
bsf.apiRegistry.apiClientAspect.enabled=true
#rpcClient 扫描@ApiClient/@FeignClient注解的包,以逗号分割多个【rpc调用必填】
bsf.apiRegistry.rpcClient.basePackages=com.xxxx.xxxx
#注册中心redis实现的,redis地址格式:127.0.0.1:6379(无密码登陆)
bsf.apiRegistry.registry.redis.host=XXX.XXX.XXX.XXX:6379
  • api协议代码示例
//兼容@FeginClient
@ApiClient(name = "lmc-test-provider",path = "/")
public interface CustomerProvider {
/*接口协议定义*/
//支持GetMapping,PostMapping
@PostMapping("/test")
//支持@RequestParam,@RequestBody
ApiResponseEntity<String> test(@RequestParam("str") String str);
}

总结

ApiRegistry 为近期技术问题解决的随手之作,虽自测无太大问题,但目前还需要真实迁移落地和技术升级(包括可能的bug修复)。
技术无捷径,勤做笔记,点滴进步,与君共勉!!!
 
 
by 车江毅
技术vp
2022-12-15
 
 
其他博文:
高效能全链路性能压测笔记 https://www.cnblogs.com/chejiangyi/p/16900586.html
五个维度打造研发管理体系 https://www.cnblogs.com/chejiangyi/p/15420637.html
高效能研发体系建设概论 https://www.cnblogs.com/chejiangyi/p/15000543.html

自研分布式高性能RPC框架及服务注册中心实践笔记【原创】【开源】的更多相关文章

  1. 基于Protobuf的分布式高性能RPC框架——Navi-Pbrpc

    基于Protobuf的分布式高性能RPC框架——Navi-Pbrpc 二月 8, 2016 1 简介 Navi-pbrpc框架是一个高性能的远程调用RPC框架,使用netty4技术提供非阻塞.异步.全 ...

  2. 从零开始实现简单 RPC 框架 4:注册中心

    RPC 中服务消费端(Consumer) 需要请求服务提供方(Provider)的接口,必须要知道 Provider 的地址才能请求到. 那么,Consumer 要从哪里获取 Provider 的地址 ...

  3. RPC框架的服务注册和发现

    https://www.cnblogs.com/valor-xh/p/6281502.html https://blog.csdn.net/listslim1/article/details/5157 ...

  4. C# -- 高性能RPC框架:Socean.RPC

    简介 Socean.RPC是一个.Net下的高性能RPC框架,框架以高性能.高稳定性为目标,底层基于socket,无第三方库引用,代码简洁,总代码量大约在2000行,框架性能较高,在普通PC上测试,长 ...

  5. (五):C++分布式实时应用框架——微服务架构的演进

    C++分布式实时应用框架--微服务架构的演进 上一篇:(四):C++分布式实时应用框架--状态中心模块 版权声明:本文版权及所用技术归属smartguys团队所有,对于抄袭,非经同意转载等行为保留法律 ...

  6. lms框架服务注册中心

    服务注册中心原理 在分布式系统里的注册中心.原理是将部署服务的机器地址记录到注册中心,服务消费者在有需求的时候,只需要查询注册中心,输入提供的服务名,就可以得到地址,从而发起调用. 在微服务架构下,主 ...

  7. 【转帖】阿里金融云:分布式服务注册中心(DSR)

    https://www.cloud.alipay.com/docs/middleware/register/index.html 分布式服务注册中心(DSR) 分布式服务注册中心简介 服务注册中心 ( ...

  8. silky微服务框架服务注册中心介绍

    目录 服务注册中心简介 服务元数据 主机名称(hostName) 服务列表(services) 终结点 时间戳 使用Zookeeper作为服务注册中心 使用Nacos作为服务注册中心 使用Consul ...

  9. 分布式服务注册中心XXL-REGISTRY

    <分布式服务注册中心XXL-REGISTRY> 一.简介 1.1 概述 XXL-REGISTRY 是一个轻量级分布式服务注册中心,拥有"轻量级.秒级注册上线.多环境.跨语言.跨机 ...

  10. Spring Cloud Eureka 分布式开发之服务注册中心、负载均衡、声明式服务调用实现

    介绍 本示例主要介绍 Spring Cloud 系列中的 Eureka,使你能快速上手负载均衡.声明式服务.服务注册中心等 Eureka Server Eureka 是 Netflix 的子模块,它是 ...

随机推荐

  1. 如何在linux下检测(自身)IP冲突

    最近遇到一个需求,或者说是一个用户现场问题. 我们设备先安装,设置dhcp模式获取ip进行联网,后来又安装了其他设备,但该设备是手动设置的静态ip地址,正好与我们设备冲突,造成网络故障. 那我们就需要 ...

  2. C#-13 泛型

    一 泛型 泛型提供了一种更优雅的方式,可以让多个类型共享一组代码.泛型允许我们声明类型参数化的代码,可以用不同的类型进行实例化. 也就是说,我们可以用"类型占位符"来写代码,然后在 ...

  3. 内存映射IO(MMIO)

    端口I/O 介绍: 一种I/O编址方式是端口映射I/O(port-mapped I/O), CPU使用专门的I/O指令对设备进行访问, 并把设备的地址称作端口号. 在执行其中的一条指令时,CPU使用地 ...

  4. activeMq不能被主机访问的问题

    环境说明 主机:mac 虚拟机:VirtualBox 虚拟系统:Centos6.5 问题:虚拟机启动了 activemq. 也关闭了防火墙,但是在主机访问web界面,http://192.168.1. ...

  5. KTV和泛型(2)

    很多使用泛型的小伙伴,都会有一个疑惑:为什么有的方法返回值前带<T>.<K, V>之类的标记,而有的方法返回值前又什么都不带呢?就像这样: // 实体基类 class Enti ...

  6. Java云原生崛起微服务框架Quarkus入门实践

    @ 目录 概述 定义 GraalVM简介 为何使用 特性 官方性能 实战 入门示例 步骤 安装GraalVM 创建quarkus工程 Idea导入项目 Idea运行和调试 打包成普通的Jar 打包成依 ...

  7. Vue学习之--------消息订阅和发布、基础知识和实战应用(2022/8/24)

    文章目录 1.基础知识 2.代码实例 2.1 main.js 2.2 School.vue 2.3 Student.vue 2.4 App.vue 3.全局事件总线通信改为消息的订阅和发布 3.1 核 ...

  8. jstl的使用 转发和重定向(做项目遇到的一些问题总结)

    文章目录 1.jstl的使用 2.转发和重定向 3.shiro 4.spring是什么? 5.对AOP的理解 6.标签通常和标签一起使用 7.springmvc中的form表单 7.1 form标签 ...

  9. 齐博X1-栏目的调用5

    本节继续说明栏目的调用父级.同级.子级三层的栏目调用 父级.同级.子级三层的栏目调用 fun('sort@family',$fid,'cms') 比如下面栏目10利用这个函数,就可以调用出 父级9 同 ...

  10. Codeforces Round #553 (Div. 2)/codeforces1151

    CodeForces1151 Maxim and Biology 解析: 题目大意 每次可以使原串中的一个字符\(+1/-1\),\(Z + 1\to A, A -1\to Z\),求至少修改多少次可 ...