2.搭建dubbo-zk应用

简介: 基于Spring Boot 2.2.2与Dubbo 2.0.0,构建ZooKeeper注册中心的分布式服务架构。通过Maven多模块设计,分离API、Provider与Consumer,实现服务暴露与远程调用,支持高可用、可扩展的微服务通信,适用于Java 8环境。

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"?>


4.0.0

<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>


2.创建共用Dubbo_Api
2.1 pom
<?xml version="1.0" encoding="UTF-8"?>



Dubbo_Soul
com.youzha
1.0-SNAPSHOT

4.0.0

<artifactId>Dubbo_Api</artifactId>

<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.16.20</version>
    </dependency>
</dependencies>


2.2 创建共用资源

整体目录结构:
|── com.youzha.dubbo
|── dto 封装共用返回Result
|── entity 共用参数,返回Body
|── service 暴露Service,提供给第三方使用

3.创建提供者Dubbo_Provider
3.1 pom
<?xml version="1.0" encoding="UTF-8"?>



Dubbo_Soul
com.youzha
1.0-SNAPSHOT

4.0.0

<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>


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"?>



Dubbo_Soul
com.youzha
1.0-SNAPSHOT

4.0.0

<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>


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

相关文章
|
2月前
|
人工智能 应用服务中间件 API
刚刚,阿里云上线Clawdbot全套云服务!
阿里云上线Moltbot(原Clawdbot)全套云服务,支持轻量服务器/无影云电脑一键部署,可调用百炼平台百余款千问模型,打通iMessage与钉钉消息通道,打造开箱即用的AI智能体助手。
5707 66
刚刚,阿里云上线Clawdbot全套云服务!
|
1月前
|
人工智能 API 机器人
OpenClaw 用户部署和使用指南汇总
本文档为OpenClaw(原MoltBot)官方使用指南,涵盖一键部署(阿里云轻量服务器年仅68元)、钉钉/飞书/企微等多平台AI员工搭建、典型场景实践及高频问题FAQ。同步更新产品化修复进展,助力用户高效落地7×24小时主动执行AI助手。
22048 141
|
3月前
|
存储 JSON NoSQL
MongoDB常用命令
本教程介绍MongoDB数据库操作,涵盖数据库与集合的创建、删除,文档的增删改查及分页排序查询。以文章评论系统为例,演示数据存储结构设计、CRUD操作、条件查询、投影与排序,以及分页实现方法,帮助快速掌握MongoDB基本用法。(238字)
|
3月前
|
存储 算法 BI
xxljob本地运行
本文介绍XXL-JOB分布式任务调度的部署与使用。包含源码获取、数据库导入、服务端配置启动、客户端注册及执行器配置。详细说明各数据表作用、路由策略类型,并演示任务创建、参数设置与执行日志查看,助你快速上手XXL-JOB。
|
3月前
|
Java 开发工具 数据安全/隐私保护
项目《中州养老》
《中州养老》是一个面向养老院的后台管理系统,涵盖员工管理端与家属小程序端。系统功能包括预约参观、入住退住、计费管理、健康监测等模块。项目采用Vue3+TS+TDesign构建前端,后端基于SpringBoot(SSM),集成Redis缓存、Nginx部署、阿里云OSS与IoT平台。支持RBAC权限控制、智能设备数据实时监控、微信登录、定时任务处理及多线程高效通信,实现养老业务全流程数字化管理。(238字)
|
3月前
|
数据可视化 Java 关系型数据库
01-认识Activiti
工作流指如请假、报销等需审批的业务流程,通过可视化引擎实现多节点审批,广泛应用于CRM、WMS等系统。主流技术包括BPMN、Activiti和Flowable,其中Activiti为Java系开源引擎,支持复杂流程自动化,推动企业流程数字化。
|
3月前
|
存储 数据库
持久化FileTxnSnapLog
FileTxnSnapLog是ZooKeeper中用于持久化管理的核心类,封装了事务日志(TxnLog)和快照(SnapShot)操作。它通过组合方式代理具体读写,并提供数据恢复、快照保存等功能,支持从snapshot和log文件中还原DataTree状态,保障数据一致性。其内部采用树状结构维护节点关系,适用于高效的数据增删改查与事务回放。
|
3月前
|
NoSQL Redis Docker
第十章 常用组件
本简介涵盖Nginx代理机制、负载均衡与限流,分布式事务中的CAP/BASE理论及Seata模式,分布式锁实现方案,Redis数据类型、持久化与集群策略,MQ异步解耦与消息可靠传输,Elasticsearch倒排索引与搜索优化,Docker容器化与网络模式,Git分支管理与冲突解决,以及Maven项目构建与生命周期等内容,全面解析主流中间件与开发工具的核心原理与实践应用。(239字)
|
3月前
|
存储 NoSQL 关系型数据库
MongoDB索引知识
MongoDB索引通过B树结构提升查询效率,避免全表扫描。支持单字段、复合、地理空间、文本及哈希索引,适用于等值、范围、排序及全文搜索,显著提升大数据量下的查询性能。
|
3月前
|
数据可视化 数据挖掘 BI
性能优化专题
两幅图像展示了数据可视化图表,包含柱状图与折线图的组合,用于呈现趋势与对比分析。色彩分明,结构清晰,适用于业务报表、数据分析等场景,帮助用户直观理解关键指标变化。

热门文章

最新文章