何为RPC(远程调用)
- 通俗讲解RPC
- 就是一个程序调用不在一个项目里(也可以是不在一个主机里,不在一个进程里,反正就是不能直接使用的程序),而非要使用无法直接使用的程序,从而导致RPC的出现
何为Dubbo和Zookeeper
- dubbo2.7文档 经典美图
- 节点角色
节点 | 角色说明 |
---|---|
Provider | 暴露服务的服务提供方 |
Consumer | 调用远程服务的服务消费方 |
Registry | 服务注册与发现的注册中心 |
Monitor | 统计服务的调用次数和调用时间的监控中心 |
Container | 服务运行容器 |
- Zookeeper就是注册中心,是Dubbo中的一个角色。
- Dubbo就是一个框架,我们只要往里面填它所需要的东西即可。
- 至于为什么要这个框架,Dubbo文档有说明它满足了什么需求,不再赘述。
如何使用Dubbo+Zookeeper
步骤
- 先下载Zookeeper
- 启动zookeeper
- 再搞一个Dubbo-Admin(可有可无),就一个Dubbo的可视化界面.(就像MySql之于Nativecat或SQLyog)
- 创建两个毫不相干的程序(SpringBoot项目)
详细步骤
步骤1和2、
- 下载Zookeeper,windows要下有bin的压缩包。
- 配置环境变量,一定要用管理员运行命令行,出问题就是没有以管理员身份运行。
- 找到解压路径的bin文件夹,找到里面的执行文件。windows下是zkServer.cmd,运行,
- 找到解压路径的bin文件夹,找到里面的执行文件。windows下是zkCli.cmd,运行,
- 如果配置了zookeeper的环境变量,直接在控制台输入zkServer.cmd,不要要到指定目录,管理员cmd
- zookeeper启动后不要关闭cmd控制台 步骤3、
- github下载Dubbo-Admin
- 将下载的打包成jar包,用管理员身份运行它
java -jar ***.jar
- 浏览器打开http://localhost:7001 步骤4、
- 导入依赖
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.9</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>5.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>5.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.7.0</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-1og4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
</dependencies>
- 创建一个springboot项目,为provider 接口
public interface TicketService {
public String getTicket();
}
实现接口
@DubboService
public class TicketServiceImpl implements TicketService {
@Override
public String getTicket() {
return "给你票";
}
}
配置application.properpites
server.port=8001
# 这个服务的端口号
dubbo.application.name=provider-server
#名字
dubbo.registry.address=zookeeper://127.0.0.1:2181
# 再这个网址(zookeeper)注册,
dubbo.scan.base-packages=com.boot.service
# 扫描这个包,有@DubboService的,将其注册进zookeeper
- 创建另外一个SpringBoot项目,为consumer
导入依赖和上面的一样
要使用provider的类
import org.springframework.stereotype.Service;
@Service//让spring托管
public class UserService {
@DubboReference//引用远程的对象
TicketService ticketService;
public void buyTicket(){
String s =ticketService.getTicket();
System.out.println("consumer说:\"我要票、、\""+"\n"+"provider说:"+"\""+s+"\"");
}
}
再在创建一个和provider中一样的接口
public interface TicketService {
String getTicket();
}
配置application.properpites
server.port=8002
dubbo.application.name=consumer-server
dubbo.registry.address=zookeeper://127.0.0.1:2181
- 测试一下
@SpringBootTest
class ConsumerServerApplicationTests {
@Autowired
UserService userService;
@Test
void contextLoads() {
userService.buyTicket();
}
}
小结
注解相关
@DubboService
,告诉Dubbo这个是provider,以便consumer调用@DubboReference
,告诉Dubbo要使用注册在zookeeper中的对象
配置
- Provider和Consumer都要注册进zookeeper
- Provider还需要配置扫描哪些包里的注解。