分布式Dubbo+ZooKeeper+SpringBoot测试

教程链接

看这篇博客之前请安装好ZooKeeper

一、新建一个空项目以及提供者模块

1、新建空项目

image-20200805152230778

2、创建一个提供者模块叫privoder-server

image-20200805152318241

3、引入依赖

<!--导入dubbo+zookeeper的依赖-->
        <!-- 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>

4、创建一个service包和一些服务,这里直接贴代码

image-20200805152519515

(1)TicketService

package cn.nongyanxia.service;

public interface TicketService {
    public String getTicket();
}

(2)TicketServiceImpl

package cn.nongyanxia.service;

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


@Service //这个是dubbo的注解,一定要注意和spring的注解区分
@Component 
public class TicketServiceImpl implements TicketService {
    @Override
    public String getTicket() {
        return "浓烟下与荒野";
    }
}

(3)配置文件

server.port=8001

# 服务应用名字
dubbo.application.name=privoder-server
# 注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
# 哪些服务要被注册,会扫描此包下添加了@Service注解的类
dubbo.scan.base-packages=cn.nongyanxia.service

二、测试一下上面的服务有没有注册到注册中心

1、一定要保证ZooKeeper是开启的,具体操作看我上一篇博客

2、使用dubbo-admin,接着启动刚刚的提供者模块项目,然后可以看到我们的服务已经注册进去了

image-20200805153251376

三、新建一个消费者模块叫consumer-server

image-20200805153504018

1、同样的引入依赖

<!--导入dubbo+zookeeper的依赖-->
        <!-- 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>

2、修改配置文件

和提供者不同的是,不需要扫描包

server.port=8002

# 消费者去哪里拿到服务,需要暴露自己的名字
dubbo.application.name=consumer-server

# 注册中心的地址
dubbo.registry.address=zookeeper://127.0.0.1:2181

3、新建一个UserService类来使用另一个模块提供的服务

package cn.nongyanxia.service;


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

@Service   //这个是spring的注解,交给spring托管
public class UserService {

    //想拿到privoder-server提供的票,要去注册中心拿到服务
    //原来本地是直接@Autowired,现在是@Reference 也一定要是dubbo下面的注解
    @Reference //引用,   1、pom坐标  2、可以定义路径相同的接口名
    TicketService ticketService;


    public void buyTicket(){
        String ticket = ticketService.getTicket();
        System.out.println("在注册中心拿到的票=>"+ticket);
    }
}

4、上一步引用服务我们用的是第二步,所以要建一个和另一个模块路径和内容一模一样的接口

package cn.nongyanxia.service;

public interface TicketService {
    public String getTicket();
}

5、测试可不可以使用另一个模块的服务

测试类:

package cn.nongyanxia;

import cn.nongyanxia.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class ConsumerServerApplicationTests {

    @Autowired
    UserService userService;

    @Test
    void contextLoads() {
        userService.buyTicket();//直接调用接口的方法
    }

}

接着运行测试类:

image-20200805154402103

成功!!!!!

而且我们还可以在dubbo-admin上看到此消费者

image-20200805154555215

四、注意点

1、服务可能受网络影响,出现问题时一定不要着急慢慢排查

2、zookeeper服务一定一定一定要开启!!!

3、由于笔记是自己整理的,可能不是很详细,如果有问题可以去留言板留言

4、推荐视频:教程链接

Q.E.D.


理想三旬浓烟下,奔赴山海与荒野