简述
Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
RPC是指远程过程调用,是一种进程间通信方式。当服务部署是分布式时,各个服务器需要通信调用,RPC因此诞生了,不仅解决了服务之间调用问题,还能够像调用本地方法一样简单。
RPC的基本原理如下图:
这个过程重要的时候序列化和反序列化,因为传输的是二进制包,直接一个对象传过去,怎么知道是啥~你必须把Java对象序列化为二进制格式,传给Server
RPC核心是通信以及序列化
dubbo的实现原理如下:
Provider 提供者,可以向注册中心注册服务
Registry 注册中心,提供别人注册,和暴露别人注册的信息
Consumer 消费者,向注册中心订阅服务,注册中心notify提醒消费者,消费者获取提供者提供的服务
Monitor 监控
实现
zookeeper下载安装启动
dubbo的注册中心,官方建议使用zookeeper,zookeeper的下载,安装后需要将conf文件夹下面的zoo_sample.cfg复制一份改名为zoo.cfg即可
下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.6.3/
执行cmd文件,启动zookeeper服务
provider 向注册中心注册服务
创建一个普通项目,然后一个创建module,这个module使用springboot框架,
导入以下依赖:
<!--dubbo依赖-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.3</version>
</dependency>
<!--zooker客户端-->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<!-- 引入zookeeper -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.14</version>
<!--排除这个slf4j-log4j12-->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
springboot配置文件如下:
注册时,需要提供服务名,也就是我们注册的名字 dubbo.application.name=xxxx
向哪个地方注册 dubbo.registry.address=xxxx 2181是zookeeper默认端口看
注册了什么东西 dubbo.scan.base-packages=xxxxx 这个包下的东西带有@service会被注册
server.port=7002
dubbo.application.name=consumer-server
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.scan.base-packages=com.hys.consumerserver.consumer
需注册的类如下:
由于PRC是面向接口的远程调用,需要先创建一个接口来实现他,
@Component 表示注册bean
@Service 表示这个是注册zookeeper 最新版本注解有是@DubboService
public interface provider{
public String get();
}
@Service
@Component
public class providerImlp implements provider{
@Override
public String get() {
System.out.println("客户端");
return "123456";
}
}
Consumer消费者消费服务
在上面的项目中,在创建一个module,使用springboot框架,导入和上面一致的依赖
springboot的配置文件如下:
消费者需要提供自己的名字: dubbo.application.name=xxxx
消费者去哪订阅服务:dubbo.registry.address=xxxx
server.port=7003
dubbo.application.name=provide-server
dubbo.registry.address=zookeeper://127.0.0.1:2181
创建一个类,调用提供者提供的服务,如下:
@Component 注册bean
@Reference 远程调用 最新版本注解@DubboReference
@Component
public class provid {
@Reference
provider provider;
public void get(){
String pro = this.provider.get();
System.out.println(pro);
System.out.println("消费者");
}
}
总结:
dubbo+zookeeper实现 需要如下:
提供者和消费者需要导入dubbo和zookeeper的包,主要用到@Service和 @Reference,最新版本注解有改动分别是@DubboService和 @DubboReference
同时需要在springboot配置文件 配置注册中心地址,这个地址对应可以在linux上或window上或。。需要安装zookeeper并启动!
测试代码如下:
@SpringBootTest
class ProviderServerApplicationTests {
@Autowired
provid provid;
@Test
void contextLoads() {
provid.get();
}
}