一款rpc
框架,用于解决微服务架构下服务治理和通信问题。
(服务治理:服务发现、负载均衡、流量调度)
RPC
:远程调用的一种技术概念,封装寻址和网络通信的细节,实现像本地方法调用一样的模式。
一次RPC
调用过程:
代理
序列化与反序列化:对象无法在网络中传输,需要转成二进制数据,此为序列化
编码和解码
网络通信:IO
三种协议形式
固定长度形式:每次读取固定长度解析
特殊字符隔断形式:根据特殊字符来判断读取协议单元结束
header + body
形式:先解析头部,根据头部得到 body
的长度再解析 body
dubbo
采用的是header + body
形式的协议,同时使用特殊字符,解决网络粘包问题
dubbo
协议 (默认)
TCP
NIO
异步传输Hessian
二进制序列化dubbo
协议传输大文件或超大字符串。rmi
协议
RMI
协议采用 JDK
标准的 java.rmi.*
实现,采用阻塞式短连接和 JDK
标准序列化方式。
TCP
Java
标准二进制序列化RMI
服务互操作hessian
协议
HTTP
Hessian
二进制序列化hessian
服务互操作gRPC
协议
http
协议
基于 HTTP
表单的远程调用协议
HTTP
JS
使用的服务webservice
协议
HTTP
SOAP
文本序列化thrift
协议
适用于 SOA
标准 RPC
框架
memcached
协议
redis
协议
rest
协议
基于标准的 Java REST API
- JAX-RS 2.0
(Java API for RESTful Web Services
的简写)实现的 REST
调用支持
节点 | 角色说明 |
---|---|
Provider | 暴露服务的服务提供方 |
Consumer | 调用远程服务的服务消费方 |
Registry | 服务注册与发现的注册中心 |
Monitor | 统计服务的调用次数和调用时间的监控中心 |
Container | 服务运行容器 |
使用zookeeper
(或Nacos
)作为注册中心,协调consumer
与producer
之间地址的注册与发现
使用zookeeper
(或Nacos
)作为配置中心
存储dubbo
启动阶段的全局配置,保证配置的跨环境共享与全局一致性
负责服务治理规则(路由规则、动态配置)的存储与推送
使用zookeeper
(或Nacos
)作为元数据中心
接收producer
上报的服务接口元数据,为admin
等控制台提供运维能力
1.准备zookeeper
,配置中心,dubbo
需要与zookeeper
搭配使用
2.创建聚合工程 springboot
项目
(1)父pom
依赖
<modules>
<module>dubbo-producermodule>
<module>dubbo-consumermodule>
modules>
<properties>
<spring-boot.version>2.1.4.RELEASEspring-boot.version>
<dubbo.version>3.0.7dubbo.version>
properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-dependenciesartifactId>
<version>${spring-boot.version}version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubbo-bomartifactId>
<version>${dubbo.version}version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubbo-dependencies-zookeeperartifactId>
<version>${dubbo.version}version>
<type>pomtype>
dependency>
dependencies>
dependencyManagement>
2.创建子模块producer module
(1)pom
依赖
<dependencies>
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubboartifactId>
dependency>
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubbo-dependencies-zookeeperartifactId>
<type>pomtype>
dependency>
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubbo-spring-boot-starterartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-autoconfigureartifactId>
dependency>
dependencies>
(2)配置
server.port=9090
dubbo.application.name=dubbo-producer
dubbo.protocol.name=dubbo
dubbo.protocol.id=-1
dubbo.registry.id=zk-registry
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.config-center.address=zookeeper://127.0.0.1:2181
dubbo.metadata-report.address=zookeeper://127.0.0.1:2181
(3)定义服务接口
public interface DemoService {
String sayHello(String name);
}
(4)实现接口具体方法
实现类需要加@DubboService
注解
@DubboService
public class DemoServiceImpl implements DemoService {
@Override
public String sayHello(String name) {
System.out.println("Hello " + name + ", request from consumer: " + RpcContext.getContext().getRemoteAddress());
return "Hello " + name;
}
}
(5)主程序类
使用@EnableDubbo
注解
@EnableDubbo
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class DubboProducerApplication {
public static void main(String[] args) {
SpringApplication.run(DubboProducerApplication.class, args);
}
}
3.创建子模块consumer module
(1)pom
依赖
<dependencies>
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubboartifactId>
dependency>
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubbo-dependencies-zookeeperartifactId>
<type>pomtype>
dependency>
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubbo-spring-boot-starterartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-autoconfigureartifactId>
dependency>
<dependency>
<groupId>com.examplegroupId>
<artifactId>dubbo-producerartifactId>
<version>0.0.1-SNAPSHOTversion>
<scope>compilescope>
dependency>
dependencies>
(2)配置
server.port=9091
dubbo.application.name=dubbo-consumer
dubbo.protocol.name=dubbo
dubbo.protocol.id=-1
dubbo.registry.id=zk-registry
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.config-center.address=zookeeper://127.0.0.1:2181
dubbo.metadata-report.address=zookeeper://127.0.0.1:2181
(3)引用远程服务接口
使用@DubboReference
注解,引用远程服务接口
@RestController
@RequestMapping("/consumer")
@Slf4j
public class TestController {
@DubboReference
private DemoService demoService;
@RequestMapping("/user/{id}")
public String getProduceService() {
demoService.sayHello("I am consumer");
return "get producer back success";
}
}
(4)主程序类
使用@EnableDubbo
注解
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableDubbo
public class DubboConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(DubboConsumerApplication.class, args);
}
}
4.测试
请求接口http://localhost:9091/consumer/user/1
,返回:
与此同时,服务端打印请求日志
Hello I am consumer, request from consumer: /ip:61544