安装与测试

安装

  1. 首先下载Zookeeper安装包,安装包里面linux和window的程序都有
    1. zookeeper3.5后tar.gz是未编译后的包,3.5后还下tar.gz就会报找不到主类,需要下bin.tar.gz才是编译后的包
  2. 解压后进入,进行第三步后,再回这一步,运行/bin/zkServer.cmd
    1. 第一次运行可能会报错:读不到zoo.cfg,配置了第三步就没事了
    2. 还可能遇到闪退,可以尝试:编辑zkServer.cmd文件末尾添加pause 添加后为pause endlocal
  3. 修改zoo.cfg配置文件,这个就是第一步报错类找不到的原因
    1. conf文件夹下面的zoo_sample.cfg复制一份改名为zoo.cfg放在同目录下即可,即放conf下
    2. 随后开始配置zoo.cfg,配置如下项即可,端口一般不用改,使用默认的即可
      1. dataDir=./ # 临时数据存储的目录(可写相对路径)
      2. clientPort=2181 #zookeeper的端口号

      测试

  • 进入bin里面使用zkCli.cmd进行测试 ```powershell 执行zkCli.cmd,进入zk模式后,再执行如下操作

ls / #列出zookeeper根下保存的所有节点 第一次时正常结果应该是(默认有一个节点):[zookeeper]

create -e /rzd 123 #在根节点下创建一个名为rzd的节点,值为123 创建成功返回Created

get /rzd #获取节点值

<a name="WfLcZ"></a>
# Dubbo

- **Dubbo开始是alibba做的,现在开源了,成为了apache的顶级项目。**
   - Dubbo是一个**轻量级,高性能**的RPC框架。提供了三大核心能力:**面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。**
- dubbo就是一个jar包,**能够帮你的java程序连接到zookeeper,并利用zookeeper消费、提供服务。**
   - 所以dubbo使用前,首先需要安装有Zookeeper环境。
<a name="GMrUx"></a>
## Dubbo-admin

- 这是个可视化监听dubbo服务的监控程序,不装也不影响使用dubbo
- 略
<a name="UnPiy"></a>
# 第一个springboot+Dubbo+Zookeeper
<a name="YTB8n"></a>
## 项目创建并创建一个服务

- 首先启动`Zookeeper`服务。idea创建个空的springboot项目,实现个服务提供者。**这里我们简单讲下Zookeeper和Dubbo使用,所以服务提供者和消费者都写一个模块里**
```java
package com.kuang.provider.service;
public interface TicketService {  //卖票服务
   public String getTicket();
}

//------------
package com.kuang.provider.service;
public class TicketServiceImpl implements TicketService {
   @Override
   public String getTicket() {
       return "《狂神说Java》";
  }
}
package com.kuang.consumer.service;
public class UserService {
   //我们需要去拿去注册中心的服务
}

服务提供者

引入依赖

  • 需要将服务提供者注册到注册中心,这借助Dubbo与Zookeeper。我们需要导入包
  • 最新的zookeeper及其依赖包可能会导致日志冲突,可以通过剔除zookeeper里的日志依赖解决 ```java org.apache.dubbo dubbo-spring-boot-starter 2.7.3
com.github.sgroschupf zkclient 0.1
<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>

org.apache.zookeeper zookeeper 3.4.14 org.slf4j slf4j-log4j12

<a name="UDzFd"></a>
### 配置
```properties
#当前应用的名字
dubbo.application.name=provider-server
#注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#扫描指定包下服务
dubbo.scan.base-packages=com.kuang.provider.service

服务类注册

  • 如果服务接口和服务实现是2个模块。注意是远程服务的提供者的实现类所在模块需要注册,远程服务接口所在不需要配置注册(即配置服务发现)
  • 在service的实现类中配置服务注解,发布服务!注意导包问题。
    • 这里和feign是类似的,也是编写接口配置远程调用的接口
    • 应用启动起来,dubbo就会扫描配置的指定的包下的:带有@component注解的服务,将它发布在指定的注册中心中! ```java import org.apache.dubbo.config.annotation.Service; import org.springframework.stereotype.Component;

@Service //将服务发布出去 @Component //放在容器中 public class TicketServiceImpl implements TicketService { @Override public String getTicket() { return “《狂神说Java》”; } }

<a name="MzAm0"></a>
## 消费服务
<a name="Erzny"></a>
### 依赖 & 配置

- 消费服务模块的依赖同服务提供者的依赖一样,配置也差不多,就是不需要配置服务扫描包
```properties
#当前应用名字
dubbo.application.name=consumer-server
#注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181

消费类

package com.kuang.consumer.service;

import com.kuang.provider.service.TicketService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;

@Service //注入到容器中
public class UserService {

    @Reference //远程引用指定的服务,他会按照全类名进行匹配,看谁给注册中心注册了这个全类名
    TicketService ticketService;

    public void bugTicket(){
        String ticket = ticketService.getTicket();
        System.out.println("在注册中心买到"+ticket);
    }

}

测试

  • 直接注入消费类,调用消费服务,服务提供者的调用让消费类自己内部进行