zoukankan      html  css  js  c++  java
  • 38、springboot——分布式之zookeeper+dubbo

    一、分布式应用简介

    在分布式系统中,国内常用zookeeper+dubbo组合,而Spring Boot推荐使用全栈的Spring,Spring Boot+Spring Cloud

    分布式系统:

    Zookeeper和Dubbo

    ZooKeeper
    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务
    它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、
    域名服务、分布式同步、组服务等。
    Dubbo 
    Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个
    层之间解耦合(或者最大限度地松耦合)。从服务模型的角度来看,Dubbo
    采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,
    所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。

     二、docker安装zookeeper

    docker pull zookeeper

    安装完成

     启动zookeeper(镜像id选自己安装的)

    docker run --name zk01 -p 2181:2181 --restart always -d b6f6e4bc7eef

    三、创建两个工程,一个服务提供者,一个服务消费者,进行测试springboot+zookeeper+dubbo

    我这里为了测试方便,只创建一个工程,这个工程分两个模块

    1、建一个空的工程

     2、新建模块

     3、选择springboot的初始化向导

     4、先创建一个服务提供者

     点next之后选选择WEB模块

     5、在service包下建一个TicketService接口

    public interface TicketService {
        //返回电影票
        public String getTicket();
    }

    6、再创建TicketService的实现类TicketServiceImpl

    public class TicketServiceImpl implements TicketService{
        @Override
        public String getTicket() {
            return "《我和我的祖国》";
        }
    }

    7、再创建一个模块作为服务消费者

     也是只选择WEB模块方便测试

    模块创建成功

     8、在消费模块中创建一个UserService类

     我们想在这个consumer-user模块(工程)当中调用provider-ticket模块(工程)的的GetTicket方法;跨工程调用,此时我们就要用到dubbo+zookeeper了

    9、将服务提供者(provide-ticket)注册到注册中心(zookeeper)

      1.导入相关依赖

            <!--springboot整合dubbo的依赖-->
            <dependency>
                <groupId>com.alibaba.boot</groupId>
                <artifactId>dubbo-spring-boot-starter</artifactId>
                <version>0.2.0</version>
            </dependency>
            <!--引入zookeeper的客户端工具-->
            <dependency>
                <groupId>com.github.sgroschupf</groupId>
                <artifactId>zkclient</artifactId>
                <version>0.1</version>
            </dependency>

    zkclient是由Datameer的工程师开发的开源客户端,对Zookeeper的原生API进行了包装,实现了超时重连、Watcher反复注册等功能

      2、application.properties中进行配置注册

    我的虚拟机的ip是192.168.237.132

    #应用名
    dubbo.application.name=provider-ticket
    #发布到注册中心
    dubbo.registry.address=zookeeper://192.168.237.132:2181
    #将哪些包下的东西发布出去
    dubbo.scan.base-packages=com.atguigu.ticket.service

      3、在TicketServiceImpl中添加相关注解

    注意@Service是dubbo包下的,不是spring的

    在application.properties中指定的包下有@Service的注解就会发布到注册中心中

    当然要把这个组件注册到容器中,所以用了@Component

    import org.alibaba.dubbo.config.annotation.Service;
    import org.springframework.stereotype.Component;
    
    @Component
    @Service    //将服务发布出去
    public class TicketServiceImpl implements TicketService{
        @Override
        public String getTicket() {
            return "《我和我的祖国》";
        }
    }

    总结:将服务提供者注册到注册中心

    1、引入dubbo和zkclien相关依赖

    2、配置dubbo的扫描包和注册中心地址

    3、使用@Service发布服务

    4、后面还会提到@DubboComponentScan @SpringBootApplication这两个注解的问题

    10、将项目启动,配置的服务就会注册到注册中心中

     11、我们要消费服务则回到consumer-user模块中

      1、同样先在pom.xml中添加依赖

            <!--springboot整合dubbo的依赖-->
            <dependency>
                <groupId>com.alibaba.boot</groupId>
                <artifactId>dubbo-spring-boot-starter</artifactId>
                <version>0.2.0</version>
            </dependency>
            <!--引入zookeeper的客户端工具-->
            <dependency>
                <groupId>com.github.sgroschupf</groupId>
                <artifactId>zkclient</artifactId>
                <version>0.1</version>
            </dependency>

      2、application.properties中进行相关配置

    服务模块注册在哪个注册中心中则消费模块就用哪个注册中心

    #应用名
    dubbo.application.name=consumer-user
    #注册中心
    dubbo.registry.address=zookeeper://192.168.237.132:2181

      3、想在UserService中使用TicketService则在consumer模块中也要放一份相同的,全类名要相同;可以不用实现类,接口就行

    ******实际使用时应该是把服务提供的包进行打包,然后再pom文件中引用,而不是自己去建立接口********

    consumer-user模块的:

     provide-ticket模块的:

       4、UserService中进行远程调用

    注意这里的@Service注解就是spring的,而不是dubbo的,只是简单的把service放入容器中

    import com.alibaba.dubbo.config.annotation.Reference;
    import com.atguigu.ticket.service.TicketService;
    import org.springframework.stereotype.Service;
    
    @Service
    public class UserService {
    
        //远程引用  ——在注册中心中按照全类名进行匹配
        @Reference
        TicketService ticketService;
    
        public void hello(){
            String ticket = ticketService.getTicket();
            System.out.println("买到票了:"+ticket);
        }
    }

    12、最终测试

      1、在consumer-user模块中写测试方法

    @SpringBootTest
    class ConsumerUserApplicationTests {
        @Autowired
        UserService userService;
    
        @Test
        public void contextLoads() {
            userService.hello();
        }
    }

      2、运行测试方法时provide-ticket(服务提供者)应用是开启状态,且注册中心服务(zookeeper)也是开启状态的

    运行测试方法却报空指针异常;估计是版本问题;我在provide-ticket模块中(服务提供者)的启动器类中加上@DubboComponentScan @SpringBootApplication两个注解

    @EnableDubbo
    @DubboComponentScan
    @SpringBootApplication
    public class ProviderTicketApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ProviderTicketApplication.class, args);
        }
    
    }

      3、重新测试

       测试成功:

  • 相关阅读:
    2019-9-2-win10-uwp-判断本地ip
    2018-8-10-使用-Resharper-特性
    2018-8-10-WPF-checkbox文字下掉
    2018-8-10-调试-ms-源代码
    2018-8-10-cant-found-Microsoft.VSSDK.BuildTools.15.0.26201
    2019-9-18-WPF-如何调试-binding
    2018-8-10-WPF-控件继承树
    2018-8-10-sublime-Text-正则替换
    植物大战僵尸阳光冷却地址
    cs1.6 人物地址查询
  • 原文地址:https://www.cnblogs.com/lyh233/p/12712440.html
Copyright © 2011-2022 走看看