在分布式系统中,一个核心部分是远程方法调用,既然有远程方法调用则必须进行远程通信,而Dubbo就是为了解决通信问题而诞生的,这里引用官方的描述:Apache Dubbo 是一款 RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力, 利用 Dubbo 提供的丰富服务治理特性,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。Dubbo 被设计为高度可扩展,用户可以方便的实现流量拦截、选址的各种定制逻辑。
说白了RPC就是一种通信方式,他的目的是使一台计算机可以远程调用另一台计算机上的方法
简述一下RPC的工作流程
1.客户端调用client sub传入参数
2.客户端把参数转为序列化消息
3.将消息发送给服务端
4.服务端将数据传给server sub
5.server sub解析数据
6.server sub调用服务端方法,并将结果返回客户端
如果想详细的了解可以参阅在这篇文章:RPC是什么,看完你就知道了
注册中心有很多种,这里面dubbo中最推荐的是zookeeper注册中心
前提:安装jdk并配置好java_home环境变量
zookeeper下载链接
1.下载zooleeper

2.解压文件,打开bin文件夹,打开cmd 运行bin文件夹中的zkServer.cmd
这时可能会出现闪退,通过报错信息来判断,如果报错信息如下

检查conf目录下是否有zoo.cfg文件 若没有则复制zoo_sample.cfg并重命名为zoo.cfg
再次运行zkServer.cmd提示如下信息则表示启动成功

3.使用zkCli.cmd验证
这时候我们就可以执行zkCli.cmd 执行完毕后显示如下代表执行成功

使用ls /命令可以查看当前存在的键值对
使用create -e /test 123456命令可以创建key为test value为123456的键值对
至此Dubbo安装成功
dubbo-admin是一个监控管理后台,其作用类似于phpmyadmin。
dubbo-admin主页
dubbo-admin发行版
使用方法:运行注册中心的服务端之后运行dubbo-admin发行版下bin目录下的启动脚本即可
可能遇到的问题:
1:

运行zeekeeper服务端即可解决
2:8080端口被占用,zookeeper部署后, 3.5以后的版本, 会自动占用8080端口. 需要修改配置文件
我们只需要修改conf/zoo.cfg文件添加 admin.serverPort=8887,之后重新运行zookeeper即可
创建一个speringBoot项目并添加web模块 起名providerService
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubbo-spring-boot-starterartifactId>
<version>3.0.10version>
dependency>
<dependency>
<groupId>com.github.sgroschupfgroupId>
<artifactId>zkclientartifactId>
<version>0.1version>
dependency>
<dependency>
<groupId>org.apache.zookeepergroupId>
<artifactId>zookeeperartifactId>
<version>3.8.0version>
dependency>
<dependency>
<groupId>org.apache.curatorgroupId>
<artifactId>curator-frameworkartifactId>
<version>5.2.1version>
dependency>
<dependency>
<groupId>org.apache.curatorgroupId>
<artifactId>curator-recipesartifactId>
<version>5.2.1version>
dependency>
<dependency>
<groupId>org.apache.curatorgroupId>
<artifactId>curator-x-discoveryartifactId>
<version>5.2.1version>
dependency>
创建接口
package com.example.providerserver.service;
public interface TicketService {
public String getTick();
}
实现接口
package com.example.providerserver.service.impl;
import com.example.providerserver.service.TicketService;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.stereotype.Service;
//zookeeper 服务注册与发现
@DubboService //可以被扫描到
@Service
public class TickserviceImpl implements TicketService{
@Override
public String getTick() {
return "hello tickservice";
}
}
server.port=8081
#配置应用名
dubbo.application.name=providerService
#当前注册中心的访问地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#要扫描注解的包
dubbo.scan.base-packages=com.example.providerserver.service
# 防止端口冲突
dubbo.protocol.port=20881
先运行zookeeper 再运行本程序及dubbo-admin 在dubbo-admin中可以查看自己创建的服务

当一个服务器需要调用远程的服务时可以通过以下方式来完成
创建springboot项目
依赖方面与providerServer一致
只需要简单配置应用名和注册中心地址即可
server.port=8082
#应用名
dubbo.application.name=consumerServer
#注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
为保证本地调用不会报错,需要创建所需服务的全类名路径


并按远程服务的方法写好对应接口

package com.example.consumerserver.service;
import com.example.providerserver.service.TicketService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@DubboReference
TicketService ticketService;
public void getTicket(){
System.out.println("取到票=》"+ticketService.getTick());
}
}
这里重要的就是DubboReference注解它可以远程引用dubbo服务
在test中测试
package com.example.consumerserver;
import com.example.consumerserver.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class ConsumerServerApplicationTests {
@Autowired
UserService userService;
@Test
void contextLoads() {
userService.getTicket();
}
}
先启动zookeeper和提供者服务
再运行测试函数
可以看到控制台输出:

至此,demo搭建完毕