• SpringBoot整合分布式ZooKeeper和Dubbo


    ZooKeeper

    ZooKeeper是一个分布式的,开放远吗的分布式应用程序协调服务。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

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

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

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

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

    调用关系说明

    l 服务容器负责启动,加载,运行服务提供者。

    l 服务提供者在启动时,向注册中心注册自己提供的服务。

    l 服务消费者在启动时,向注册中心订阅自己所需的服务。

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

    l 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

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

    Dubbo

    Dubbp是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度的松耦合)。从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。

    使用

    1、将服务提供者注册到注册中心

    1. 创建提供者服务 和 消费者

    2. 导入duboo-spring-boot-starter依赖和 zkclient依赖

      <!-- 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.6</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>
      
    3. 在application.properties里面配置dubbo相关的属性【扫描包和注册中心地址】

      #当前应用的名字
      dubbo.application.name=provider-ticket
      
      #注册中心的地址
      dubbo.registry.address=zookeeper://服务器地址:dubbo暴露的端口号
      
      #发布哪个包
      dubbo.scan.base-packages=com.king.ticket.service
      
    4. 在服务提供者的实现类上添加注解 @Service【注意导包是dubbo相关的】和@Component将类加入spring的容器中

      @Component
      @Service   //将服务发布出去
      
    5. 运行主程序 ,将服务注册到服务中心

    2、消费者消费

    1. 导入duboo-spring-boot-starter依赖和 zkclient依赖,以及一些冲突包
    2. 在application.properties里面配置dubbo相关的属性【扫描包和注册中心地址】
    3. 保证服务提供者的接口跟消费者里面的服务全限定名一致。
    4. 在消费者的类中从远程注入服务 @Reference 【dubbo相关的注解】
    5. 在消费者类中定义一个方法 来调用服务提供者的方法
    6. 测试类中测试
      1. 注入消费者
      2. 调用方法

    3、代码

    1、服务提供者
    pom.xml文件依赖:
    <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter -->
            <!-- 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>
    
            <!-- 引入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>
    
    接口:
    package com.king.ticket.service;
    
    public interface TicketService {
    
        String getTicket();
    
    }
    
    
    实现类
    package com.king.ticket.service;
    
    import org.apache.dubbo.config.annotation.Service;
    import org.springframework.stereotype.Component;
    
    @Component
    @Service   //将服务发布出去
    public class TicketServiceImpl implements TicketService {
        @Override
        public String getTicket() {
            return "《唐人街探案》";
        }
    }
    
    
    application.properties中编写dubbo相关属性:
    #当前应用的名字
    dubbo.application.name=provider-ticket
    
    #注册中心的地址
    dubbo.registry.address=zookeeper://服务器地址:dubbo暴露的端口号
    
    #发布哪个包
    dubbo.scan.base-packages=com.king.ticket.service
    
    2、消费者
    导入依赖pom.xml
     <!-- 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>
            <!-- 引入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>
    
    
    编写注册中心的属性
    dubbo.application.name=consumer-user
    
    dubbo.registry.address=zookeeper://服务器地址:dubbo暴露的端口号
    
    编写消费者的类
    package com.king.user.service;
    
    import com.king.ticket.service.TicketService;
    import org.apache.dubbo.config.annotation.Reference;
    import org.springframework.stereotype.Service;
    
    @Service
    public class UserService{
    
        @Reference
        TicketService ticketService;
    
        public void hello(){
            String ticket = ticketService.getTicket();
            System.out.println("买到票了:"+ticket);
        }
    
    }
    
    
    引入跟服务提供者同全限定名的接口
    package com.king.ticket.service;
    
    public interface TicketService {
        String getTicket();
    }
    
    
    编写测试类:
    package com.king.user;
    
    import com.king.user.service.UserService;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    
    @SpringBootTest
    class ConsumerUserApplicationTests {
    
        @Autowired
        UserService userService;
    
        @Test
        void contextLoads() {
    
            userService.hello();
    
        }
    
    }
    
  • 相关阅读:
    深入了解css的行高Line Height属性
    【C++】函数指针
    【C++】常用知识点
    将数字转化为液晶显示屏的样子
    【多媒体】PCM
    【Android】网络下载图片&SD卡文件存储
    CPU 缓存(Cache)
    【C++】typename
    【多媒体】音频格式
    【Android】图片的异步加载
  • 原文地址:https://www.cnblogs.com/KingTL/p/13086154.html
Copyright © 2020-2023  润新知