Apache Dubbo RSocket Gateway 入门教程
Apache Dubbo是一个流行的Java RPC框架,尤其是在中国。有很多项目使用Dubbo。虽然它正在通过适配Reactive Streams 和 Service Mesh来实现未来的新版本Dubbo 3.0,但有许多遗留项目不可能在短期之内被彻底修改。RSocket是一个支持Reactive Streams语义的二进制通讯协议,主要支持的通讯层包括TCP, WebSockets和Aero.
Apache Dubbo
是一个流行的Java RPC
框架,尤其是在中国。有很多项目使用Dubbo
。虽然它正在通过适配Reactive Streams
和 Service Mesh
来实现未来的新版本Dubbo 3.0
,但有许多遗留项目不可能在短期之内被彻底修改。
RSocket
是一个支持Reactive Streams
语义的二进制通讯协议,主要支持的通讯层包括TCP, WebSockets
和Aeron(UDP)
。与传统RPC
相比,它能够提高性能和可靠性。
1.什么是网关?
网关(或代理)是服务消费者和服务提供者之间的一个额外的协议转换器。
通常,该协议转换器将执行一些在两端都不容易完成的工作,以证明额外的协议转换器是正常的。例如,Spring Cloud最近发布了spring-cloud-gateway-rsocket
(WebSocket/RSocket
)网关。网关作用是在两个协议之间进行转换。这样一来,REST客户端就不必修改代码,仍然可以享受RSocket的好处。
2.为什么我们需要一个网关?
没有人喜欢代码更改。更不用说大的代码更改了。RSocket
为不同的语言提供了sdk。Java SDK基于Reactive Streams
项目。functional programming
(函数式编程风格)不仅对许多开发者来说具有较深的学习曲线,而且还为调试和跟踪带来了挑战。
因此,网关的需求是非常有必要的。网关将减少了客户端的代码更改。它适用于服务已经在RSocket
中,而客户端仍然在传统RPC
中案例。虽然它的效率不如点对点RSocket连接
,但它是一个很好的折衷方案。
3.网关是如何工作的?
以下的两点必须牢记:
-
Dubbo
是一个传统的RPC
框架。转化成RSocket
,它只有Mono
返回类型,没有stream/Flux
类型。 -
服务提供者必须提供
RSocket
服务。否则,在两者之间添加网关就没有任何意义了。如果你们说同一种语言,为什么需要翻译?
4.Dubbo的工作原理
为了理解网关是如何工作的,我们需要回顾Dubbo是如何工作的。
节点角色说明
节点 | 角色说明 |
---|---|
Provider | 暴露服务的服务提供方 |
Consumer | 调用远程服务的服务消费方 |
Registry | 服务注册与发现的注册中心 |
Monitor | 统计服务的调用次数和调用时间的监控中心 |
Container | 服务运行容器 |
调用关系说明
- 服务容器负责启动,加载,运行服务提供者。
- 服务提供者在启动时,向注册中心注册自己提供的服务。
- 服务消费者在启动时,向注册中心订阅自己所需的服务。
- 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
- 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
- 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
Dubbo 架构具有以下几个特点,分别是连通性、健壮性、伸缩性、以及向未来架构的升级性。详细的参考Apache Dubbo
官网。
使用网关,服务的提供者现在不需要向注册中心
注册。相反,它将在网关上创建一个接口并将该接口注册到注册中心。当服务的消费者请求服务时,它将获得网关上的接口。然后,网关将该请求分发给服务提供者。
让我们来看下面的代码:
这是一个Dubbo服务接口
public interface DemoService {
String findNickById(Integer id);
}
注意,DemoService
服务只是在网关上创建的一个接口,并将该接口注册到注册中心
。
服务的消费者现在发送一个RPC
请求:
public ApplicationRunner runner() throws Exception {
return args -> {
DemoService demoService = (DemoService) Proxy.newProxyInstance(
DemoService.class.getClassLoader(),
new Class[]{DemoService.class},
new DubboServiceCallInvocationHandler(proxyService, DemoService.class, ""));
System.out.println(demoService.findNickById(1));
};
}
因为,它不知道这个服务现在是一个RSocket
服务。它不使用Mono
或Flux
。
在网关上,它将把请求发送到具有相同名称的RSocket
服务。
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return dubbo2ReactiveProxy.invoke(serviceName, method.getName(), version, args);
}
这就是RSocket
服务接口。请记住它只有Mono
类型。
public interface ReactiveUserService {
Mono<User> findUserById(Long id);
}
我们不需要将ReactiveUserService注册到注册中心。
5.结论
在这个简单的示例中,我们演示了如何使用网关在Dubbo RPC服务消费者
去调用RSocket服务提供者
的服务。RSocket有非常多的用例,这些用例并不需要我们在两端(服务提供方和服务消费方)都修改代码。网关架构可以扩展到连接到其他协议和产品,如数据库
或消息队列
。
参考代码:https://github.com/apache/dubbo-samples/blob/3.x/dubbo-samples-rsocket
更多推荐
所有评论(0)