分布式Dubbo+Zookeeper+springBoot

RPC

在这里插入图片描述
在这里插入图片描述

Dubbo

官方文档

在这里插入图片描述

  • 服务提供者(Provider): 暴露服务的服务提供方,服务提供者在启动时,向注册中心注册自己提供的服务。
  • 服务消费者(Consumer): 调用远程服务的服务消费方,服务消费者在启动时,想注册中心订阅自己所需的服务,服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
  • 注册中心(Registry):注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者
  • 监控中心(Monitor):服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

调度说明

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

Dubbo环境搭建

点进dubbo官方文档,推荐我们使用Zookeeper 注册中心
window下安装zookeeper
1.下载zookeeper
2.运行 /bin/zkServer.cmd,初次运行会报错,没有zoo.cfg配置文件

如果出现闪退,编辑zkServer.cmd文件末尾添加 pause
3.修改zoo.cfg配置文件
将conf文件夹下面的zoo_sample复制一份名为zoo.cfg即可。
注意几个重要的位置:
dataDir=./ 临时数据存储的目录(可写相对路径)
clientPort=2181 zookeeer的端口号

修改完后再次启动zookeeper
4.使用zkCli.cmd测试

**window下安装dubbo-admin
dubbo本身并不是一个服务软件,他其实就是一个jar包,能够帮你的Java程序连接到zookeeper消费、提供服务。
但是为了让用户更好的管理监控众多的dubbo服务,官方提供了一个可视化的监控程序dubbo-admin,不过这个监控即使不装也不影响使用。

1.下载dubbo-admin
地址:下载
2.解压进入目录
修改dubbo-admin\src\main\resources \application.properties指定zookeeper地址
在这里插入图片描述
3.在项目目录下打包dubbo-admin
mvn clean package -Dmaven.test.skip=true
等待打包

4.执行dubbo-admin\target下的dubbo-admin-0.0.1-SNAPSHOT.jar
我将jar包和zookeeper放在一起,便于找到和启动
在这里插入图片描述
在这里插入图片描述
访问localhost:7001 账号密码,root/root
在这里插入图片描述
在这里插入图片描述

整合SpringBoot

1.创建空项目,
new一个模块,命名为provider-server
导入依赖

<!--导入 dubbo和zookeeper依赖-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.3</version>
        </dependency>
        <!--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>

2.创建服务类,service包下
接口类TicketService,DrinkService。

/**
 * @Author zfj
 * @create 2020/1/17 10:34
 */
public interface TicketService {

    public String getTicket();

}
/**
 * @Author zfj
 * @create 2020/3/12 13:02
 */
public interface DrinkService {
    public String drink();
}

实现类TicketServiceImpl,DrickServiceImpl
注意service的包

package com.zfj.service;

import org.apache.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;

/**
 * @Author zfj
 * @create 2020/1/17 10:35
 */

//zookeeper:服务注册与发现

@Service  //可以被扫描到,在项目一启动就自动注册到注册中心(zookeeper)
@Component //使用了dubbo后尽量不要用service注解
public class TicketServiceImpl implements TicketService {
    public String getTicket() {
        return "jay java 拿到票";
    }
}

package com.zfj.service;

import org.apache.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;

/**
 * @Author zfj
 * @create 2020/3/12 13:03
 */
@Service
@Component
public class DrinkServiceImpl implements DrinkService {
    public String drink() {
        return "jay please drink";
    }
}

3.配置信息 application.properties

server.port=8001

#服务应用名字
dubbo.application.name=provide-server
#注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#哪些服务要被注册
dubbo.scan.base-packages=com.zfj.service

4.启动
run ProviderServerApplication 然后登录localhost:7001,查看提供者
在这里插入图片描述
在这里插入图片描述


至此,提供者服务注册完毕,接下来完成消费者端的代码
1.创建空项目,
new一个模块,命名为consumer-server
导入依赖

<!--导入 dubbo和zookeeper依赖-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.3</version>
        </dependency>
        <!--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>

2.配置application.proerties

server.port=8002

#消费者去哪里拿服务需要暴露自己的名字
dubbo.application.name=consumer-server
#注册中心的地址
dubbo.registry.address=zookeeper://127.0.0.1:2181

3.取服务。去注册中心拿服务。
UserService.java

package com.zfj.service;

import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;

/**
 * @Author zfj
 * @create 2020/1/17 10:33
 */

@Service //放到容器中
public  class UserService {

    //想拿到provider-server提供的票,要去注册中心拿到服务
    @Reference //引用,  Pom坐标,可以定义路径相同的接口名
    TicketService ticketService;
    

    public void buyTicket(){

        String ticket = ticketService.getTicket();
        System.out.println("在注册中心拿到ticket:"+ticket);

    }

}

//想拿到provider-server提供的票,要去注册中心拿到服务 @Reference //引用, Pom坐标,可以定义路径相同的接口名
比如在provicer-server里,
TickerService的路径时com.zfj.service.TickerService
在这里插入图片描述
那么在consumer-server这边就需要一样的路径
在这里插入图片描述
4.测试
编写测试类

package com.zfj;

import com.zfj.service.User02Service;
import com.zfj.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class ConsumerServerApplicationTests {

    @Autowired
    UserService userService;

    @Autowired
    User02Service user;

    @Test
    public void contextLoads() {

        userService.buyTicket();
    }
    @Test
    public void test2(){
        user.getDrink();
    }


}

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值