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、重新测试

   测试成功:

原文地址:https://www.cnblogs.com/lyh233/p/12712440.html