28.1 spring-boot-provider(提供者)
本章完全 参照 dubbo-samples-spring-boot 进行学习而记录。
- 还是老规矩,创建一个 springboot 项目(这次可能要创建两个,哈哈 ~ 因为 我们 要测试 远程调用嘛。)
- 导入依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>top.muquanyu</groupId>
<artifactId>springboot-12-dubbo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient -->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<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.7.1</version>
<!-- 排除 这个 slf4j-logj12-->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
- 写
application
的配置
server.port=8001
# 服务应用名字
dubbo.application.name=spring-boot-provider
# 注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
# 哪些服务需要注册
dubbo.scan.base-packages=top.muquanyu.service
- 使用
@EnableDubbo
注解,否则 可能 Dubbo 无法生效。
- 写一个 服务
service 层
然后用dubbo 的 @Service 去实现暴露
注意哟,不是 Spring 的 Service!!是 dubbo 的。
package top.muquanyu.service;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
@Component
@Service // 这个注解 就可以 被 扫描到了,项目一起动,就会被自动注册到 zookeeper
public class TicketServiceImpl implements TicketService{
@Override
public String getTicket() {
return "暴露服务测试";
}
}
28.2 spring-boot-consumer(消费者)
- 写
application
配置
server.port=8002
# 服务应用名字
dubbo.application.name=spring-boot-provider
# 注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
- 写一个 跟暴露服务接口 一毛一样的接口,用来 接收 暴露的那个服务
- 使用
@Reference // 引用的意思
远程引入我们 暴露的接口
package top.muquanyu.service;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Reference // 引用的意思
// Pom 坐标,可以定义路径相同的 接口名
TicketService ticketServer;
public void test(){
System.out.println(ticketServer.getTicket());
}
}
- 进行 测试
远程调用成功!RPC 成功!
28.3 小结和细思极恐
我们 整个 RPC 的过程:首先 需要 一个 注册中心!然后 SpringBoot 整合 Dubbo 暴露 service 接口。再写 一个 引用 接口的 程序。只要 我知道 注册中心的 url 地址。我就可以 拿到 里面的 service!
思细级恐:想一想,如果 注册中心 是 搭建在 一台 服务器上!那么 我们 是不是 可以 用 这台服务器 做到 其它 计算机/服务器 的 分布式部署呢?因为 我们 可以通过它去 实现 RPC呀 ~ 答案是:肯定的!而且 这种 注册中心的 服务器 甚至 不需要 太高的性能和配置。毕竟 它 就是 一个 传话的。中间件。