SpringBoot-Dubbo和Zookeeper

1,400 阅读4分钟

Zookeeper

简介

ZooKeeper是一个集中的服务,主要用于配置信息的维护、命名、分布式同步和组服务。所有这些类型的服务都以某种形式被分布式应用程序使用。每次实现它们时,都要做大量的工作来修复不可避免的bug和竞争条件。由于实现这类服务的困难,应用程序最初通常会对它们进行节省,这使得它们在出现更改时变得脆弱,并且难以管理。即使正确执行,这些服务的不同实现在部署应用程序时也会导致管理的复杂性。

windows下安装Zookeeper

  1. 下载网址:archive.apache.org/dist/zookee…
  2. 我们选择3.6.3的版本,因为官网说它是最稳定的版本

image.png 3. 下载完解压,直接双击运行一下bin目录下的zkServer.cmd,你会发现闪退。 4. 这时候,你就编辑一下zkServer.cmd

image.png

  1. 编辑完运行,你会发现另外一个错误 image.png
  2. 这时候,我们要去conf目录,复制一份zoo_sample.cfg文件,改名为zoo.cfg,再运行,又可能发生一个错误,端口号被占用,就离谱。

image.png 7. 别怕,这时候,我们只要在zoo.cfg文件最后加上admin.serverPort=没有被占用的端口号,如admin.serverPort=8001,这时候再启动,就没问题了。

image.png

我们再在bin目录启动zkCli.cmd来测试

  1. ls / : 列出zookeeper根下保存的所有节点
  2. create –e /example 111:创建一个kuangshen节点,值为123
  3. get /example:获取/example节点的值

image.png

Dubbo

简介 网上找到一个讲的我感觉很详细的一篇文章

一个重要的图:

image.png 其中:

服务提供者(Provider):暴露服务的服务提供方,服务提供者在启动时,向注册中心注册自己提供的服务。

服务消费者(Consumer):调用远程服务的服务消费方,服务消费者在启动时,向注册中心订阅自己所需的服务,服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

注册中心(Registry):注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者

监控中心(Monitor):服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心

执行流程:

  1. 服务容器负责启动,加载,运行服务提供者。
  2. 服务提供者在启动时,向注册中心注册自己提供的服务。
  3. 服务消费者在启动时,向注册中心订阅自己所需的服务。
  4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
  5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
  6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

window下安装dubbo-admin

  1. 下载dubbo-admingithub.com/apache/dubb…
  2. 下载完解压,解压后在项目目录下通过mvn clean package -Dmaven.test.skip=true打包dubbo-admin

image.png 3. 打包完了之后,打开zookeeper的服务! 执行 dubbo-admin\target 下的dubbo-admin-0.0.1-SNAPSHOT.jar

image.png 4. 执行后访问:http://localhost:7001/ ,需要登录,用户名和密码默认都是root

image.png

image.png

SpringBoot + Dubbo + zookeeper 三个整合

比如说,买票和卖票的服务

框架搭建

  1. 启动zookeeper !
  2. IDEA创建一个空项目
  3. 创建两个模块,provider实现服务提供者,consumer实现服务消费者,两个模块均只需导入web依赖就行
  4. 项目创建完毕,在两个模块导入依赖

这里可能是因为新版本的坑,我们需要自己把项目的java目录标记为源根,resouerce标记为资源根,并把spring-boot-starter-parent的版本将为2.2.1.RELEASE

        <!-- 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>
        <!--【新版的坑】zookeeper及其依赖包,解决日志冲突,还需要剔除日志依赖;-->
        <!-- 引入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>
  1. 我们在provider模块写一个卖票服务
package com.example.service;

public interface TicketService {
    public String getTicket();
}

  1. 我们在provider模块写一个卖票服务的实现类
package com.example.service;
@DubboService
public class TicketServiceImpl implements TicketService{
    @Override
    public String getTicket() {
        return "这是一张票";
    }
}
  1. 我们在consumer模块写一个用户的服务
import org.springframework.stereotype.Service;

@Service//让spring托管
public class UserService {
    @DubboReference//引用远程的对象
    TicketService ticketService;
    public void buyTicket(){
        String ticket =ticketService.getTicket();
        System.out.println("在注册中心买到"+ticket);
    }
}
  1. 配置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

  1. 编写测试类
@RunWith(SpringRunner.class)
@SpringBootTest
public class ConsumerServerApplicationTests {

   @Autowired
   UserService userService;

   @Test
   public void contextLoads() {

       userService.bugTicket();

  }

}
  1. 这个项目,用了最新版的Zookeeper,好像出了点小问题,有疑问可以去观看视频