搭建dubbo-zk应用

简介: 基于Spring Boot 2.2.2与Dubbo 2.0.0,构建ZooKeeper注册的分布式服务架构,实现Provider与Consumer模块间高效RPC通信,含完整POM配置及启动验证流程。

springboot:2.2.2

alibaba.dubbo:2.0.0

zkclinet:0.10

JDK:1.8

1.创建父工程

Idea或Eclipse创建普通Maven工程,GAV定义随意,也可以参考我的

G:com.youzha

A:Dubbo_Soul

V:1.0-SNAPSHOT


父pom完整文件(该文件包括三个子module,在之后创建)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.youzha</groupId>
    <artifactId>Dubbo_Soul</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>Dubbo_Provider</module>
        <module>Dubbo_Consumer</module>
        <module>Dubbo_Api</module>
    </modules>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
    </parent>
    <properties>
        <!--1.0版本增加-->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <boot.dubbo.version>2.0.0</boot.dubbo.version>
        <zkclient.version>0.10</zkclient.version>
        <!--1.0版本结束-->
    </properties>
    <dependencyManagement>
        <dependencies>
            <!--1.0 开始-->
            <dependency>
                <groupId>com.alibaba.spring.boot</groupId>
                <artifactId>dubbo-spring-boot-starter</artifactId>
                <version>${boot.dubbo.version}</version>
            </dependency>
            <!-- ZooKeeper client -->
            <dependency>
                <groupId>com.101tec</groupId>
                <artifactId>zkclient</artifactId>
                <version>${zkclient.version}</version>
            </dependency>
            <!--1.0结束-->
        </dependencies>
    </dependencyManagement>
</project>

2.创建共用Dubbo_Api

2.1 pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>Dubbo_Soul</artifactId>
        <groupId>com.youzha</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>Dubbo_Api</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.20</version>
        </dependency>
    </dependencies>
</project>

2.2 创建共用资源


整体目录结构:

|── com.youzha.dubbo

|── dto            封装共用返回Result

|── entity        共用参数,返回Body

|── service      暴露Service,提供给第三方使用

3.创建提供者Dubbo_Provider

3.1 pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>Dubbo_Soul</artifactId>
        <groupId>com.youzha</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>Dubbo_Provider</artifactId>
    <dependencies>
        <dependency>
            <groupId>com.youzha</groupId>
            <artifactId>Dubbo_Api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--com.dubbo-springBoot依赖 -->
        <dependency>
            <groupId>com.alibaba.spring.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

3.2 Service

需要注意的是,这里的@Service引自:import com.alibaba.dubbo.config.annotation.Service;,标注其为一个Dubbo的Service,而下面的@Component才是将其注入成一个Spring Bean。

import com.alibaba.dubbo.config.annotation.Service;
import com.youzha.dubbo.entity.User;
import com.youzha.dubbo.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
 * @author youzhaxiaobo
 * @version 1.0
 * @date 2020/7/1 19:06
 * @Desc
 */
@Slf4j
@Service
@Component
public class UserServiceImpl implements UserService {
    @Override
    public User findById(int id) {
        if(id < 0) {
            log.info("非法请求,ID:{}", id);
            return null;
        }
        User user = new User(1, "youzha", 1L, new Date());
        log.info("提供者返回数据:{}", user.toString());
        return user;
    }
}

3.3 Controller

这里的Controller模拟多个服务,除提供Dubbo接口外,自身还提供Http接口。

import com.youzha.dubbo.dto.ResultDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
 * @author youzhaxiaobo
 * @version 1.0
 * @date 2020/7/4 0004 13:52
 * @Desc
 */
@Slf4j
@RestController
@RequestMapping("/provider")
public class ProviderController {
    @GetMapping(value = "/hello", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResultDTO getUserById(@RequestParam("id") int id) {
        log.info("id=" + id);
        if (id > 0) {
            return new ResultDTO(-1, "获取失败");
        }
        return new ResultDTO(200, "获取成功");
    }
}

3.4 启动类Application

import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
 * @author youzhaxiaobo
 * @version 1.0
 * @date 2020/7/1 19:15
 * @Desc
 */
@EnableDubbo
@SpringBootApplication
public class DubboProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(DubboProviderApplication.class, args);
    }
}

3.5 配置文件

server:
  port: 9091
spring:
  main:
    allow-bean-definition-overriding: true
dubbo:
  application:
    name: dubbo-consumer
    id: dubbo-consumer
  registry:
    address: zookeeper://127.0.0.1:2181
  protocol:
    name: dubbo
    port: 20883
  scan:
    base-packages: com.youzha.dubbo.service
logging:
  level:
    root: info
    org.springframework.boot: info
    org.apache.ibatis: info
    org.dromara.soul.bonuspoint: info
    org.dromara.soul.lottery: info
    org.dromara.soul: info

4.创建消费者Dubbo_Consumer

4.1 pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>Dubbo_Soul</artifactId>
        <groupId>com.youzha</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>Dubbo_Consumer</artifactId>
    <dependencies>
        <dependency>
            <groupId>com.youzha</groupId>
            <artifactId>Dubbo_Api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--com.dubbo-springBoot依赖 -->
        <dependency>
            <groupId>com.alibaba.spring.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

4.2 Service

4.2.1 定义Sevice


这个Service是我们自己业务所需,只是在这个Service中的某些数据我们要调用Provider服务而已,这个和Provider提供的service本身没有直接关系,也不需要保持方法名,入参的完全一致,只是引用。

public interface RemoteUserService {
    /**
     * ID查找用户
     * @param id    用户ID
     * @return  USER对象
     */
    User findById(int id);
}

4.2.2 定义ServiceImpl

import com.alibaba.dubbo.config.annotation.Reference;
import com.youzha.dubbo.entity.User;
import com.youzha.dubbo.service.RemoteUserService;
import com.youzha.dubbo.service.UserService;
import org.springframework.stereotype.Service;
/**
 * @author youzhaxiaobo
 * @version 1.0
 * @date 2020/7/1 19:06
 * @Desc
 */
@Service
public class UserServiceImpl implements RemoteUserService {
    @Reference
    private UserService userService;
    @Override
    public User findById(int id) {
        return userService.findById(id);
    }
}

说明:

  • 实现是的我们自身的业务接口
  • 通过dubbo的@Reference注解,注入Provider的Service【而提供者是通过dubbo的@Service注解暴露,暴露和注入都在zookeeper获取】

4.3 Controller

@Slf4j
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
    @Autowired
    private RemoteUserService userService;
    @GetMapping(value = "/getUserById", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResultDTO getUserById(@RequestParam("id") int id) {
        log.info("id=" + id);
        User user = userService.findById(id);
        log.info("消费者获取用户,信息为:{}", user);
        if(null == user) {
           return new ResultDTO(-1, "获取失败");
        }
        return new ResultDTO(200, "获取成功", user);
    }
}

4.4 启动类Application

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

4.5 配置文件

server:
  port: 9092
spring:
  main:
    allow-bean-definition-overriding: true
dubbo:
  application:
    name: dubbo-consumer
    id: dubbo-consumer
  registry:
    address: zookeeper://127.0.0.1:2181
  protocol:
    name: dubbo
    port: 20883
  scan:
    base-packages: com.youzha.dubbo.service
logging:
  level:
    root: info
    org.springframework.boot: info
    org.apache.ibatis: info
    org.dromara.soul.bonuspoint: info
    org.dromara.soul.lottery: info
    org.dromara.soul: info

5.验证

5.1 运行zookeeper

当然前提是需要安装zk,配置文件也可以看到我这里启动的本地zk(如果你使用的其他地址的zk,替换上图zk的地址即可),如果没有可以参考这个附件:


📎zookeeper.rar


运行前你需要解压打开:zookeeper-3.4.14\conf\zoo.cfg,确保对应的dataDir在你本地存在,如果是Linux系统换成对应的路径即可,下图示例:Windows本地

进入:zookeeper-3.4.14\bin,

如果你和我一样是Windows环境测试,双击:zkServer.cmd,

如果你是Linux环境,启动zkServer.sh,二者效果完全一致,启动后类似下图则表示启动完成:

5.2 启动提供者

直接启动对应的启动类Application即可。

5.3 启动消费者

直接启动对应的启动类Application即可。

5.4 请求验证

postman发送地址请求:http://localhost:9092/consumer/getUserById?id=1


查看消费者日志:

查看提供者日志:

6.总结

如果你在本章节,运行并未出现上述效果,可能是哪里出错了,我们在接下来的网关接入,一样比对着可以修复,你可以百度自行解决当前问题,也可直接进入下一章节,进行网关接入,一起验证。

相关文章
|
26天前
|
Arthas 存储 运维
记Arthas实现一次CPU排查与代码热更新
本文介绍如何使用Arthas排查Java应用CPU占用过高问题,通过thread、watch、jad等指令定位线程阻塞与异常代码,并实现无需重启的热更新修复,结合profile生成火焰图进行性能分析,提升线上问题处理效率。
记Arthas实现一次CPU排查与代码热更新
|
26天前
|
存储 缓存 算法
零拷贝
文件传输中,传统方式因频繁的上下文切换和内存拷贝导致性能低下。零拷贝技术通过减少系统调用和内存拷贝,提升传输效率。结合PageCache预读与缓存机制,适用于小文件高并发场景;而大文件则推荐异步IO+直接IO,避免缓存污染,优化整体性能。(239字)
 零拷贝
|
26天前
|
缓存 算法 Java
线程池
本文深入剖析了Java线程池的核心实现机制。首先介绍线程池的基本概念与优势,通过`Executors`工厂类创建不同类型的线程池,并详细解析了`ThreadPoolExecutor`的运行原理,包括核心参数、任务调度流程及工作线程(Worker)的执行逻辑。接着重点分析了具备周期性调度能力的`ScheduledThreadPoolExecutor`,揭示其如何结合延迟队列(DelayedWorkQueue)和任务重入机制来实现定时与周期性任务调度。文章还探讨了线程池中关键的阻塞队列、拒绝策略等组件,帮助读者全面理解Java并发编程中的线程管理技术。
 线程池
|
26天前
|
NoSQL Linux Shell
2-MongoDB单机部署
本文介绍MongoDB在Windows和Linux系统下的安装与启动方法,包括下载地址、版本选择规范(奇数为开发版,偶数为稳定版)、解压配置、命令行及配置文件启动方式,以及如何通过mongo shell和Compass图形化工具连接数据库,并简要说明Linux下的部署、防火墙设置与服务关闭操作。
|
26天前
|
存储 NoSQL 关系型数据库
1-MongoDB相关概念
MongoDB是一款高性能、无模式的文档型数据库,适用于高并发读写、海量数据存储及高扩展性需求场景。广泛应用于社交、游戏、物流、物联网等领域,支持灵活的数据模型和丰富查询,是NoSQL中类关系型体验的最佳选择。
|
26天前
|
运维 Devops 开发工具
生产环境缺陷管理
git-poison是一款基于go-git的生产环境缺陷管理工具,实现bug的分布式追溯与自动化卡点,有效避免多分支开发中的漏修、漏发问题,降低协同成本,提升发布安全性。
生产环境缺陷管理
|
26天前
|
SQL 运维 分布式计算
如何做好SQL质量监控
本文介绍如何通过CloudLens for SLS实现SQL质量监控,帮助用户全面掌握SQL使用情况。涵盖健康分、服务指标、运行明细、SQL Pattern分析及优化建议五大维度,助力识别性能瓶颈、优化资源使用,提升日志分析效率与治理能力。
 如何做好SQL质量监控
|
26天前
|
存储 消息中间件 开发框架
应用架构图
技术架构是将业务需求转化为技术实现的关键过程,涵盖分层设计、技术选型与系统间关系梳理。本文详解单体与分布式架构,包括展现层、业务层、数据层及基础层的职责,并阐述应用内外调用关系与边界划分,助力构建清晰的技术体系。
应用架构图
|
26天前
|
敏捷开发 Java 测试技术
为什么要单元测试
单元测试是保障代码质量的基石,能提升调试效率、增强代码可维护性,并加速长期研发效能。通过“测试金字塔”理念,强调以单元测试为根基,避免过度依赖端到端测试,助力软件高效迭代与持续交付。
为什么要单元测试
|
26天前
|
NoSQL Java 测试技术
5-MongoDB实战演练
本文介绍某头条文章评论功能的设计与实现,基于SpringDataMongoDB构建微服务。内容涵盖需求分析、表结构设计、技术选型(mongodb-driver与SpringDataMongoDB),完成评论的增删改查、按文章ID查询、分页查询及点赞功能。通过实体类Comment映射MongoDB文档,使用MongoRepository简化数据操作,并利用MongoTemplate实现高效字段更新,如点赞数递增,提升性能。
 5-MongoDB实战演练

热门文章

最新文章