前言:
现在我们对“rpcjava”大约比较珍视,我们都需要知道一些“rpcjava”的相关知识。那么小编在网摘上网罗了一些关于“rpcjava””的相关文章,希望看官们能喜欢,兄弟们快快来学习一下吧!Dubbo入门
Apache Dubbo 是一款 RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力, 利用 Dubbo 提供的丰富服务治理特性,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。Dubbo 被设计为高度可扩展,用户可以方便地实现流量拦截、选址的各种定制逻辑。(摘自官网)
更多 Dubbo 相关介绍,可查阅官方文档:
官方文档地址: 总结下来就是 Dubbo 发展至今各行各业广泛应用,无论是稳定性还是各方面的特性都得到了完整的考验与实践。如今已升级到 Dubbo 3.0 在易用性、超大规模微服务实践、云原生基础设施适配、安全性等场景任占有一席之地,依然是RPC服务框架的首选。
1、分布式基础理论回顾1.1、为什么需要分布式?
现如今的大型互联网应用为什么要采用分布式架构??
首选需要明确的是:只有当单个阶段的处理能力无法满足日益增长的计算、存储任务的时候并且硬件的提升(增加内存、加磁盘、使用更好的CPU)都没得到更好的优化,我们才考虑采用分布式架构。因为分布式系统要解决的问题本身就是和单机系统一样的,而由于分布式架构有多节点、通过网络通信的拓扑结构会引入很多单机系统没有的问题,为了解决这些问题又会引入更多的机制、协议、带来更多意料的问题等
那么什么是分布式架构,简单理解就是 为了分散应用的压力,将不同模块部署在不同的服务器上,各模块直接采用轻量级的通信机制互相调用与协作,来减轻应用系统的处理压力。
因此随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行。如下图(网站演进过程)
1、 1~10 单一应用架构
当网站流量很小时,只需要一个应用,将所有的功能都部署在一起,以减少部署的节点和成本,此时简化增删改查工作量的数据访问框架(ORM)是关键。这种架构适用于小型网站、小型管理系统、简单易用。
缺点:
性能扩展比较难协同开发问题(不利于协同开发)不利于维护(例如功能调整上线时需要重新打包、停应用等)
2、 10~1000 垂直应用架构
当访问量逐渐增大,单一应用增加机器带来的优化速度越来越小,将应用拆分成互不相干的几个应用,以提升处理效率。此时用于加速前端页面开发的Web框架(MVC)是关键。
优点:通过切分业务来实现各个模块的独立部署,降低了维护和部署的难度,团队各司其职更容易管理,性能扩展也更方便,更有针对性。
缺点:公共模块无法重复利用
3、 1000~10000 分布式服务架构
垂直应用系统架构的改进,当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快的响应多变的市场需求。此时,用于提高业务复用及整合与管理各服务互相协作的分布式服务框架(RPC)是关键。
4、 10000+ 流动计算架构
当服务越来越多,服务资源得不到合理的利用逐渐呈现出来(例如有的服务调用频率特别大,有的服务调用频率又特别小,此时应该协调出调用频率小的服务器资源给调用频率高的服务),此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。
SOA(Service Oriented Architecture) 用于提供机器利用率的资源调度和治理中心,成为流动计算架构的关键性技术。
1.2、RPC1、什么是RPC?
RPC(Remote Procedure Call): 远程过程调用。是一种进程间通信方式,它是一种技术思想不是规范或约定。它允许程序调用另外一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用开发者实现这个远程调用的细节。即开发者无论是调用本地的还是远程的函数,本质上编写的调用代码基本上都是相同的。
也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。
2、为什么要用RPC呢?
就是无法在一个进程内,甚至一个计算机内通过本地调用的方式完成的需求,比如不同的系统间的通讯,甚至不同的组织间的通讯,由于计算能力需要横向扩展,需要在多台机器组成的集群上部署应用。RPC就是要像调用本地的函数一样去调远程函数。
基本原理示意图:
小结:
client stub 和 server stub 可以视为协调调用远程函数的"助手",主要完成如下几个工作:
client stub :
1、客户端调用
2、序列化
3、发送消息
9、将调用结果反序列化
10、返回调用结果
server stub :
4、反序列化
5、调用本地服务
6、返回处理结果
7、将调用结果序列化
8、响应消息
因此不难看出影响 RPC 调用效率的因素主要有两个:
1、通讯(轻量级的通讯尤为重要)
2、序列化与反序列化(采用XML还是JSON或是二进制流进行数据的传输)
基于这种 RPC 的思想市面上也衍生出了很多 RPC 框架,例如: bubbo、gRPC、Thrift、HSF(High Speed Service Framework)
2、Dubbo2.1、dubbo的角色划分
更多 Dubbo 的介绍就不重复啰嗦了, 官方文档 已经说得很明白了。
节点角色说明
节点
角色说明
Provider
暴露服务的服务提供方
Consumer
调用远程服务的服务消费方
Registry
服务注册与发现的注册中心
Monitor
统计服务的调用次数和调用时间的监控中心
Container
服务运行容器
了解个节点的含义后我们再来看 Dubbo 的工作流程:
startregistersubscribenotifyinvokecount2.2、Dubbo环境搭建
1、首先是注册中心
Dubbo 都可以适配主流的注册中心,例如 Zookeeper、Nacos、Mulicast、Redis 等,这里我们采用 Zookeeper 做为 Dubbo 的注册中心, Zookeeper 是一个树形的目录服务,支持变更推送,适合作为 Dubbo 服务的注册中心,这也是官方推荐使用的注册中心。
Docker 构建zookeeper服务端
# 拉取最新zookeeper镜像docker pull zookeeper# 启动zookeeperdocker run -d -p 2181:2181 --name zookeeper --restart always [imageId]# 进入容器查看Zookeeper运行状态root@c1a413096894:/apache-zookeeper-3.7.0-bin/bin# pwd/apache-zookeeper-3.7.0-bin/binroot@c1a413096894:/apache-zookeeper-3.7.0-bin/bin# ./zkServer.sh statusZooKeeper JMX enabled by defaultUsing config: /conf/zoo.cfgClient port found: 2181. Client address: localhost. Client SSL: false.Mode: standalone
2、到这里 Dubbo 的基本环境也就搭建完了,接下来就是项目集成 Dubbo 即可。需要注意的是 Dubbo 本身并不是一个服务软件!它其实就是一个 jar 包,能够帮助我们的 Java 程序连接到 Zookeeper ,并利用 Zookeeper 消费或提供服务。
3、需要自己创建两个项目,一个是 provider 服务提供者,另外一个是 consumer 服务消费者,我们需要借助这两个项目完成 Dubbo 各种测试。
2.3、hello world实现
假设现有用户服务( provider )和订单服务( consumer ),两个服务分别部署在不同的服务器上,创建订单的时候,需要获取到用户信息包括电话号码,收获地址等,此时就需要订单服务可以远程调用用户服务提供的接口或方法。
1、将服务提供者注册到 Zookeeper 注册中心 (如何暴露服务)
1.给服务提供者项目添加 Dubbo 依赖(服务提供者我们使用 SpringBoot ,服务消费者我们使用原生 Spring ,两种集成方式可做参考)
<!-- --><dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.8</version></dependency>
2.由于 Dubbo 使用 Curator 作为与 Zookeeper Server 交互的编程客户端。注册中心 Zookeeper 还需要引入操作 Zookeeper 的客户端 Curator , dubbo-dependencies-zookeeper 将自动为应用增加 Zookeeper 相关客户端的依赖(也就是 curator 相关的依赖)。
<!-- --><dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-dependencies-zookeeper</artifactId> <version>2.7.8</version> <type>pom</type></dependency>
注意:官方明确指出 Dubbo 和 dubbo-dependencies-zookeeper 有版本兼容性问题,如使用中遇到版本兼容问题,也可以不使用 dubbo-dependencies-zookeepe r,而是自行添加 Curator、Zookeeper Client 等依赖,例如:
<!-- --><dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>4.2.0</version></dependency>
版本兼容性说明
3.编写配置文件(暴露服务配置)
原文
标签: #rpcjava