Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings
This repository was archived by the owner on Jul 16, 2024. It is now read-only.

alibaba/alibaba-rsocket-broker

Open more actions menu

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

logo

Gitter Maven GitHub repo size Open Issues Build Status Apache License 2

项目存档通知

随着阿里业务发展和技术更新迭代,alibaba-rsocket-broker项目将会进行archive操作(即存档仓库)。 预计存档时间:2024年7月5日,项目存档后,issue、拉取请求、代码、标签、重要事件、wiki、版本、提交、标记、分支等变成只读状态,项目仍然可以fork以及标星。

目前社区替代的开源项目为 https://github.com/reactive-rsocket-broker ,欢迎大家继续使用、贡献。

Alibaba RSocket Broker是一款基于RSocket协议的反应式对等通讯系统,为通讯多方构建分布式的RPC, Pub/Sub, Streaming等通讯支持。

  • 反应式: 无需担心线程模型、全异步化、流式背压支持、独特的对等通讯模式可适应各种内部网络环境和跨云混云的需求。
  • 程控:完善的控制面(Control Plane)支持,可定制和方便的功能扩展,如支持反向的Prometheus Metrics采集、ZipKin RSocket Collector、Chaos等。
  • 消息:面向消息通讯,服务路由、过滤、observability都非常简单。
  • 交换系统:完全分布式、异构系统整合简单,无论应用什么语言开发、部署在哪里,都可以相互通讯。

更多RSocket Broker资源和介绍,请访问以下资源:

RSocket Broker工作原理

RSocket Broker桥接应用间通讯的双方,相当于一个中间人的角色。 应用在启动后,和Broker创建一个长连接,在连接创建的时候需要标明自己的身份,如果是服务提供者,会注册自己能提供的服务信息。 Broker会针对所有的连接和服务列表建立对应的映射关系。 当一个应用需要调用其他服务时,应用会将请求以消息的方式发给Broker,然后Broker会解析消息的元信息,然后根据路由表将请求转发给服务提供者,然后将处理结果后的消息再转发给调用方。 Broker完全是异步化的,你不需要关心线程池这些概念,而且消息转发都是基于Zero Copy,所以性能非常高,这也是为何不用担心中心化Broker成为性能瓶颈的主要原因。

RSocket Broker Structure

通过上述的架构图,RSocket Broker彻底解决了传统设计中众多的问题:

  • 配置推送: 连接已经建立,只需要通过RSocket的metadataPush可以完成配置推送
  • 服务注册和发现:应用和Broker建立连接后,这个长连接就是服务注册和发现,你不需要额外的服务注册中心
  • 透明路由: 应用在调用服务时,不需要知道服务对应的应用信息, Broker会完成路由
  • Service-to-service调用: RSocket提供的4个模型可以很好地解决服务到服务调用的各种复杂需求
  • Load balancing: 所有的应用和Broker建立长连接后,负载均衡在broker中心路由表完成,对应用完全透明。
  • Circuit Breakers: 断路保护,现在调整为Back Pressure支持,更贴近实际业务场景
  • Distributed messaging: RSocket本身就是基于消息推送的,而且是分布式的。
  • 多语言支持: RSocket是一套标准协议,主流语言的SDK都有支持,详情请访问 RSocket SDK Stack

项目模块

  • alibaba-rsocket-service-common: RSocket服务接口定义基础模块,包括Annotation, Reactive相关框架和支撑类
  • alibaba-rsocket-core: RSocket核心功能模块
  • alibaba-rsocket-spring-boot-starter: Spring Boot Starter for RSocket, 包括RSocket服务发布和消费
  • alibaba-broker-spring-boot-starter: Spring Boot Starter for RSocket Broker, 方便第三方进行扩展
  • alibaba-rsocket-broker: Alibaba RSocket Broker参考实现
  • alibaba-broker-registry-client-spring-boot-starter: 通过RSocket Broker对外提供服务发现服务
  • alibaba-broker-config-client-spring-boot-starter: 通过RSocket Broker对外提供配置推送服务
  • rsocket-broker-gateway-http: RSocket Broker HTTP网关,将HTTP转换为RSocket协议
  • rsocket-broker-gateway-grpc: RSocket Broker gRPC网关,将gRPC转换为RSocket协议

开发环境要求

  • JDK 11: RSocket Broker Server基于Java 11,但是Broker Client等是Java 8兼容的
  • Maven 3.5.x
  • Node 16+: RSocket Broker采用Vaadin 23.0版本构建控制界面,所以你需要安装Node 16以上版本

如何运行Example?

注意: 样例代码中的AccountService接口采用了Protobuf进行序列化,使用了protobuf-maven-plugin生成对应的Protobuf, 建议使用IDE导入项目之前,首先在项目的根目录下执行一下"mvn -DskipTests package" 完成Protobuf对应的代码生成,不然直接在IDE中编译可能出现编译不通过的情况。

项目提供了完成的样例,你可以在example模块下找到,包括服务接口定义、服务实现和服务调用三个部分。

启动RSocket Broker
  • Jbang方式启动: 通过jbang rsocket-broker@alibaba-rsocket-broker 命令启动RSocket Broker
  • Docker Compose运行RSocket Broker: 在RSocket Broker项目目录下执行 'docker-compose up -d' 启动RSocket Broke
  • 在IDE中运行RSocket Broker: 找到AlibabaRSocketBrokerServer类,运行main函数,启动RSocket Broker
运行 RSocket Responder & Requester
  • 找到RSocketResponderServer类,运行main函数,启动RSocket Responder对外提供Reactive服务
  • 找到RSocketRequesterApp类,运行main函数,启动RSocket Requester, 进行Reactive Service消费
  • 在IDEA中,找到example.http,运行 "GET http://localhost:8181/user/2" 或者运行以下命令,进行服务调用测试。
$ curl http://localhost:8181/user/2

样例的详细介绍请访问 Example

RSocket服务编写流程

包括如何创建一个Reactive服务接口,在Responder端实现该接口,在Requester完成Reactive服务调用,以及通讯双方是如何和Broker交互的。

  • 创建一个RSocket服务接口,你可以创建一个单独的Maven Module存放这些接口,如user-service-api,样例代码如下:
public interface UserService {
    Mono<User> findById(Integer id);
}
  • 在RSocket Responder端实现该接口,同时给实现类添加 @RSocketService annotation,如下:
@RSocketService(serviceInterface = UserService.class)
@Service
public class UserServiceImpl implements UserService {
    @Override
    public Mono<User> findById(Integer id) {
        return Mono.just(new User(1, "nick:" + id));
    }
}

不少开发者会问道,如果是MySQL数据库,如何和Reactive集成。目前R2DBC有对MySQL的支持,你可以参考一个Spring Cloud RSocket + R2DBC + MySQL的Demo实现: https://github.com/linux-china/spring-cloud-function-demo/

  • 在RSocket Requester,以Proxy方式创建Reactive服务接口对应的Spring bean, 如下:
    @Bean
    public UserService userService(@Autowired UpstreamManager upstreamManager) {
        return RSocketRemoteServiceBuilder
                .client(UserService.class)
                .upstreamManager(upstreamManager)
                .build();
    }
  • 在RSocket Requester端,进行代码调用,如HTTP REST API提供给:
@RestController
public class PortalController {
    @Autowired
    UserService userService;

    @GetMapping("/user/{id}")
    public Mono<User> user(@PathVariable Integer id) {
        return userService.findById(id);
    }
}

样例项目请参考: https://github.com/alibaba-rsocket-broker/rsocket-broker-simple-example

References

About

Alibaba RSocket Broker: Mesh, Streaming & IoT

Topics

Resources

License

Contributing

Security policy

Stars

Watchers

Forks

Packages

No packages published

Contributors 15

Languages

Morty Proxy This is a proxified and sanitized view of the page, visit original site.