分布式应用开发 | SpringBoot+dubbo+zookeeper实现服务注册发现 | 远程服务调用

前言

通过新建两个独立服务——提供者、消费者,模拟两个独立分布的应用,通过使用dubbo+zookeeper来实现远程服务调用。

 


 

目录

项目搭建

  • provider-server
  • consumer-server

实现并测试

  • provider-server注册
  • consumer-server远程调用

 


 

项目搭建

为了方便,新建一个空的项目:

 

 

在空项目上new一个module,使用SpringBoot,作为服务提供者

 

 

 删除不需要的文件:

 

 

 在来 new一个module,使用SpringBoot,作为服务消费者

 

 

两个服务分别导入dobbo和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>

        <!-- 引入zookeeper客户端 -->
        <!-- 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.hwl.service;

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

/**
 * @author:hwl
 * @date:2021/10/8 13:13
 * @Function:
 * @Description:
 */
@Service    //这是dubbo的,不是service的,作用是服务启动 自动注册到服务中心
@Component  //这是Spring的,这里平时是用service但是现在为了区别dubbo用Component
public class TicketServiceImpl implements TicketService {

    @Override
    public String getTicket(){
        return "拿到票子啦!";
    }
}

 

配置启动端口和dubbo信息

 

server.port=8001

#当前应用名字
dubbo.application.name=provider-server
#注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#扫描指定包下服务
dubbo.scan.base-packages=com.hwl.service

 

 

启动zookper

启动dubbo-admin

启动提供者服务

  注:需要注意启动顺序,而且涉及通讯会有一些延迟。

 

访问dubbo-admin查看我们的服务是否注册到服务中心:http://localhost:7001

 

 

 可以看到我们的服务已经注册进来了。

 

消费者:

 

package com.hwl.service;

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

/**
 * @author:hwl
 * @date:2021/10/8 13:22
 * @Function:
 * @Description:
 */
@Service    //这里是放到spring容器不是dubbo
public class UserService{
    //去拿提供者提供的票,需要去注册中心拿服务
    @Reference //引用,pom坐标,可以定义路径相同的接口名
    TicketService ticketService;

    public void buyTicket(){
        String ticket = ticketService.getTicket();
        System.out.println( ticket );
    }
}

 

需要注意的是这里的 TicketService 路径需要和注册中心中是实际TicketService 一样,实际调用的是服务中心中注册的远程服务。

 

配置:

server.port=8002

#当前应用名字
dubbo.application.name=consumer-server
#注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181

 

 

消费者调用注册中心服务测试类:

 

package com.hwl;

import com.hwl.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();
    }

}

 

运行测试:

 

 

消费者服务成功调用到了提供者注册在服务中心的服务了!

 这就是SpingBoot + dubbo + zookeeper实现分布式开发的应用,其实就是一个服务拆分的思想。

posted @ 2021-10-08 15:16  四叶笔记  阅读(172)  评论(0编辑  收藏  举报