百度百科解释:
RPC服务器,是指 Remote Procedure Call Protocol,中文释义为(RFC-1831)远程过程调用协议:一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
RPC是一种服务器-客户端(Client/Server)模式,经典实现是一个通过发送请求-接受回应进行信息交互的系统。
对于Java程序员而言,RPC就是远程方法调用。
1.1 远程方法调用和本地方法调用远程方法调用和本地方法调用是相对的两个概念:
- 本地方法调用指的是进程内部的方法调用,
- 远程方法调用指的是两个进程内的方法相互调用。
如果实现远程方法调用,基本的就是通过网络,通过传输数据来进行调用。所以就有了:
- RPC over Http:基于Http协议来传输数据
- PRC over Tcp:基于Tcp协议来传输数据
对于所传输的数据,可以交由RPC的双方来协商定义,但基本都会包括:
- 调用的是哪个类或接口
- 调用的是哪个方法,包括方法名和方法参数类型列表,方法参数值别表(考虑方法重载)
- 调用的协议
- 调用的版本号(可解决一个接口的多实现等问题)
所以,我们其实可以看到 RPC的自定义性是很高的,而 Dubbo就是阿里所开源出来的一套 RPC框架。
2、RPC 框架原理参考文章:
- 什么是RPC?:http://wjhsh.net/GreenForestQuan-p-11543779.html
RPC 架构主要包括三部分:
- 服务注册中心(Registry),负责将本地服务发布成远程服务,管理远程服务,提供给服务消费者使用。
- 服务提供者(Server),提供服务接口定义与服务实现类。
- 服务消费者(Client),通过远程代理对象调用远程服务。
服务提供者启动后主动向服务注册中心(Registry)注册机器IP、端口以及提供的服务列表;
服务消费者启动时向服务注册中心(Registry)获取服务提供方地址列表。
服务注册中心(Registry)可实现负载均衡,故障切换,服务降级,Mock和心跳检测等。
二、Dubbo简介 1、什么是Dubbo官网地址:http://dubbo.apache.org/zh/
官网解释:
Apache Dubbo 是一款微服务框架,为大规模微服务实践提供高性能 RPC 通信、流量治理、可观测性等解决方案,涵盖 Java、Golang 等多种语言 SDK 实现。 它的核心设计原则:微内核 + 插件体系,平等对待第三方。
在之前,官网的介绍是:
Apache Dubbo 是一款高性能、轻量级的开源 Java RPC框架。
1.1 为什么会将 RPC改为微服务?Dubbo以前的定位就是 RPC,专注于两个服务之间的调用。但随着微服务的盛行,除了服务调用之外,Dubbo也在逐步的涉及服务治理、服务监控、服务网关等等。
所以现在的 Dubbo目标已经不仅仅是 RPC框架了,而是和 Spring Cloud类似想成为了一个微服务框架。
Dubbo 3.0 版本的正式发布,标志着 Apache Dubbo 正式进入云原生时代。3.0 在通信协议、服务发现、部署架构、服务治理上都对云原生基础设施进行了全面适配, 提供了Triple、应用级服务发现、Dubbo Mesh等核心特性。
Apache Dubbo官网中文文档:
- v2.7:https://dubbo.apache.org/zh/docs/v2.7/user/preface/background/
- v3.0:https://dubbo.apache.org/zh/docs/introduction/
更多介绍,查看官方文档,下面我们搭建一个案例进行dubbo的使用。
三、Dubbo入门案例使用版本:
- dubbo 2.7.5
- zookeeper 3.6.3
下面创建一个项目来使用Duboo。
- consumer模块:消费方服务
- provider模块:提供方服务
- facade-api:服务针对 RPC使用(消费方/提供方)时的公共接口
定义RPC使用(消费方/提供方)的公共接口。
这里简单的定义一个 DemoService接口:
public interface DemoService {
String sayHello(String name);
}
2、创建提供方服务
2.1 引入依赖
主要引入 org.apache.dubbo和 zookeeper依赖如下:
org.springframework.boot
spring-boot-starter
2.3.5.RELEASE
org.springframework.boot
spring-boot-starter-web
2.3.5.RELEASE
org.springframework.boot
spring-boot-starter-test
2.3.5.RELEASE
org.apache.dubbo
dubbo
2.7.5
org.springframework
spring-context
org.apache.zookeeper
zookeeper
3.6.3
org.slf4j
slf4j-log4j12
org.apache.curator
curator-framework
5.1.0
org.apache.zookeeper
zookeeper
org.apache.curator
curator-recipes
5.1.0
org.apache.zookeeper
zookeeper
com.charge.learn.dubbo27.study
facade-api
1.0.0
junit
junit
4.11
test
2.2 配置文件
(1)application.yml
server:
port: 18082
spring:
main:
allow-bean-definition-overriding: true
application:
name: dubbo_provider_demo
(2)创建 dubbo.properties配置文件
配置内容:
- dubbo服务提供者的扫包范围
- 注册中心 zk的连接地址
dubbo.application.name=dubbo_provider_demo
dubbo.registry.address=zookeeper://192.168.xxx.xxx:2181
dubbo.scan.base-packages=com.charge.learn.dubbo27.study.provider.service
dubbo.registry.timeout=100000
2.3 rpc接口实现类
使用了 dubbo的 @Service注解
来暴露服务。后面高版本换成了@DubboService注解。
@org.apache.dubbo.config.annotation.Service
public class DemoServiceImpl implements DemoService {
@Override
public String sayHello(String name) {
URL url = RpcContext.getContext().getUrl();
System.out.println("=======provider===sayHello方法调用=== name ->" + name);
System.out.println("=======provider===sayHello方法调用=== url -> " + url);
return "Hello " + name;
}
}
2.4 启动类
添加注解开启 Dubbo使用:
@EnableDubbo注解
:开启Dubbo使用,会扫描服务所在的包。即扫描@Service, @Reference注解来暴露和引入服务接口。@PropertySource注解
:加载 dubbo.properties配置文件信息
@SpringBootApplication
@EnableDubbo
@PropertySource("dubbo.properties")
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
3、创建消费方服务
3.1 引入依赖
引入依赖同上。
3.2 配置文件(1)application.yml
server:
port: 18081
spring:
main:
allow-bean-definition-overriding: true
application:
name: dubbo_consumer_demo
(2)创建 dubbo.properties配置文件
dubbo.consumer.check=false
dubbo.application.name=dubbo_consumer_demo
dubbo.registry.address=zookeeper://192.168.xxx.xxx:2181
dubbo.scan.base-packages=com.charge.learn.dubbo27.study.consumer
3.3 controller调用 rpc接口
使用了 dubbo的 @Reference注解
来暴露服务。后面高版本换成了@DubboReference注解。
@RestController
public class DemoController {
@Reference
private DemoService demoService;
@GetMapping("/sayHello")
public String sayHello() {
return demoService.sayHello("dubbo RPC调用");
}
}
3.4 启动类
@SpringBootApplication
@EnableDubbo
@PropertySource("dubbo.properties")
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
4、测试
启动 provider服务和 consumer服务。
使用了 ZooKeeper 3.6.3 版本,启动服务时我们添加 JVM参数-Dzookeeper.sasl.client=false
来禁用 SASL 认证。 providers保存了暴露服务的接口信息。URLEncode解码之后:
调用 RPC服务ok。Dubbo框架实现了RPC调用的更多细节,程序员只关注业务即可。
在项目搭建时,遇到不少问题,参考文章如下:解决遇到的报错信息
- Dubbo整合ZooKeeper3.6.x时出现zookeeper not connected:http://www.manongjc.com/detail/29-xroftnwxzxxhdvd.html
- dubboBootstrapApplicationListener 类重复添加:https://blog.csdn.net/sonycong/article/details/107642031
– 求知若饥,虚心若愚。