一个基于Zookeeper+Dubbo3+SpringBoot3的完整微服务调用程序示例代码

news2024/11/4 21:48:58

一、关于 Dubbo3 的一些优化改进介绍

        Dubbo3 的官方文档地址: https://cn.dubbo.apache.org/zh-cn/overview/what/overview/ 其针对一些问题进行了优化和改变。个人整理3个小的方面:

        1. 在服务注册方面使用 @DubboService 注解,不再使用 @Service 这个关键词,以区别于 Spring 的 @Service 注解。即 @Service 注解从 3.0 版本开始就已经废弃了。

        2. 在服务发现方面,使用 @DubboReference  注解,而 @Reference 注解从 3.0 版开始废弃,以区别于 Spring 的 @Reference 注解。

        3. 在包引入方面,针对之前需要引入多个包,如 Dubbo-spring-boot-starter、Zkclient、Curate-framework、Curate-recipes、zookeeper 以及其 zookeeper 与 log4j之间的日志冲突问题等,甚是麻烦。又远离了 springboot 的简单配置的初衷,于是 Dubbo3 里只需要引入两个包 dubbo-spring-boot-starter 和 dubbo-zookeeper-spring-boot-starter。

二、搭建基本环境 zookeeper 以及可视化客户端

        zookeeper 的下载就不多介绍了,去官网下载后在本地编辑 zoo.cfg 文件 ,windows 上的话运行 zkServer.cmd 文件即可启动。 

        关于 zookeeper 以及可视化客户端,可以使用 dubbo-admin,不过这个并不是核心功能的东西,我还是选择使用一些现成的工具吧,如 ZooInspector 或 prettyZoo。在这里提一下 ZooInspector的界面比较丑,不如 prettyZoo 好用。不过两者都有不足之处,就是显示出来的JSON内容为什么就不能加个格式化的按钮美观地展示出来!prettyZoo 界面截图如下:

 三、  Dubbo3 + SpringBoot3的微服务调用程序代码示例

A.  服务提供方的代码

1. 服务提供方的程序结构截图

2. application.yml 配置文件内容

spring:
  application:
    name: hisroty-provider
server:
  port: 8082
dubbo:
  application:
    name: history-server
  registry:
    address: zookeeper://127.0.0.1:2181
  scan:
    base-packages: cn.history.service

3. 文件 HistoryService.java 代码

package cn.fangha.service;

public interface HistoryService {
    String getHistory();
}

4. 文件 cn/fangha/service/HistoryServiceImpl.java 代码

package cn.fangha.service;

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

@Component
@DubboService
public class HistoryServiceImpl implements  HistoryService {
    @Override
    public String getHistory() {
        return "微服务返回的历史数据内容.";
    }
}

5. 项目启动程序需要加上注解

 Dubbo3 的话需要加上 @EnableDubbo 注解,这个在2.X版本的时候是不需要的。

package cn.fangha;

import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

6. 依赖的包配置 pom.xml 文件

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.3.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>cn.fangha</groupId>
    <artifactId>hisroty-provider</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>hisroty-provider</name>
    <description>hisroty-provider</description>
    <url/>
    <licenses>
        <license/>
    </licenses>
    <developers>
        <developer/>
    </developers>
    <scm>
        <connection/>
        <developerConnection/>
        <tag/>
        <url/>
    </scm>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        
        <!--dubbo相关的依赖-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>3.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-zookeeper-spring-boot-starter</artifactId>
            <version>3.2.14</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

B. 服务消费方的代码

1. 服务消费方的程序结构截图

2. application.yml 配置文件内容

spring:
  application:
    name: history-serv
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/myblog?useUnicode=True&characterEncoding=utf-8&userSSL=true=utf-8
    username: root
    password: 123456
server:
  port: 8081

dubbo:
  application:
    name: test-service
  registry:
    address: zookeeper://127.0.0.1:2181

3. 接口 cn/fangha/service/HistoryService.java 程序

        其和服务提供方是一样的。

package cn.fangha.service;

public interface HistoryService {
    String getHistory();
}

4. 控制器的程序代码:

        控制器中,直接定义一个服务类,类的类型必须是在本项目中定义(保持和微服务方一样),然后在使用的时候直接用  @DubboReference 注解自动将其注入为 Dubbo 服务代理实例,如此即可发起远程服务调用。

package cn.fangha.controller;

import cn.fangha.service.HistoryService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    @DubboReference
    private HistoryService historyService;

    @GetMapping("/get_service")
    @ResponseBody
    public String test() {
        String result = historyService.getHistory();
        String outResult = "Receive from remote service ======> " + result;
        return outResult;
    }
}

5. 项目启动程序,同服务方一样需要加上注解

package cn.fangha;

import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

6. 消费方的 pom.xml 配置文件

        和 服务方大同小异,只是我这里引入了其它的 mysql 之类的包,未作删除。

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.3.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>cn.fangha</groupId>
    <artifactId>history-serv</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>history-serv</name>
    <description>history-serv</description>
    <url/>
    <licenses>
        <license/>
    </licenses>
    <developers>
        <developer/>
    </developers>
    <scm>
        <connection/>
        <developerConnection/>
        <tag/>
        <url/>
    </scm>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>3.0.3</version>
        </dependency>

        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter-test</artifactId>
            <version>3.0.3</version>
            <scope>test</scope>
        </dependency>

        <!--dubbo相关的依赖-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>3.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-zookeeper-spring-boot-starter</artifactId>
            <version>3.2.14</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

C. 微服务调用执行

1. 运行起 zookeeper 之后,将服务方运行起来,通过 zookeeper 的可视化工具,可以方便地检查服务是否正常运行并注册到 zk 中。

2. 运行起 消费方,当然我这里都是 springboot ,直接在页面API上进行了调用显示,也可以直接在单元测试程序中调用检验。

3. 访问消费方的 localhost:8081/get_service ,可以看到其能正常调用到另一个项目服务的内容。

四、其它小记

        在使用最新版之前,我也使用了早前的的版本进行测试,即会引入如 Dubbo-spring-boot-starter、Zkclient、Curate-framework、Curate-recipes、zookeeper 这些依赖,碰到不少报错也解决不少问题,也成功进行了服务注册发现,但确实是非常麻烦。

        比如在老版本里启动生产端,遇到报错:java.lang.NoSuchMethodError: 'org.apache.curator.framework.api.ProtectACLCreateModePathAndBytesable org.apache.curator.framework.api.CreateBuilder.creatingParentContainersIfNeeded()'

Caused by: java.lang.NoSuchMethodError: 'org.apache.curator.framework.api.ProtectACLCreateModePathAndBytesable org.apache.curator.framework.api.CreateBuilder.creatingParentContainersIfNeeded()'
    at org.apache.curator.x.discovery.details.ServiceDiscoveryImpl.internalRegisterService(ServiceDiscoveryImpl.java:222)

        还有报错: NoClassDefFoundError: org/apache/curator/RetryPolicy  缺少包:

2024-11-02T11:50:56.212+08:00  WARN 19264 --- [history-serv] [           main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: java.lang.NoClassDefFoundError: org/apache/curator/RetryPolicy
2024-11-02T11:50:56.219+08:00  INFO 19264 --- [history-serv] [           main] .s.b.a.l.ConditionEvaluationReportLogger : 

        问题就是需要导入版本正确的包:curator-framework  ,我这里开始用的  Curator Framework » 4.0.1( curator-framework 是一个  High-level API that greatly simplifies using ZooKeeper.  基于zk的高性能的API调用工具)后来改成了2.X的版本,这些问题就没报了。

        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>4.0.1</version>
        </dependency>

        还有报错如:[bboShutdownHook] o.apache.dubbo.config.DubboShutdownHook  :  [DUBBO] Run shutdown hook now., dubbo version: 3.3.0, current host: 192.168.2.28
Exception in thread "main" java.lang.IllegalStateException: java.lang.NoSuchMethodError: 'org.apache.curator.framework.CuratorFrameworkFactory$Builder org.apache.curator.framework.CuratorFrameworkFactory$Builder.ensembleTracker(boolean)'

INFO 19368 --- [history-serv] [bboShutdownHook] o.apache.dubbo.config.DubboShutdownHook  :  [DUBBO] Run shutdown hook now., dubbo version: 3.3.0, current host: 192.168.2.28
Exception in thread "main" java.lang.IllegalStateException: java.lang.NoSuchMethodError: 'org.apache.curator.framework.CuratorFrameworkFactory$Builder org.apache.curator.framework.CuratorFrameworkFactory$Builder.ensembleTracker(boolean)'

         Exception in thread "main" java.lang.IllegalStateException: java.lang.NoSuchMethodError: 'org.apache.curator.framework.CuratorFrameworkFactory$Builder org.apache.curator.framework.CuratorFrameworkFactory$Builder.ensembleTracker(boolean)'

        真的是非常麻烦。建议碰到这些问题后,不要使用新的版本,SpringBoot的初衷就是不希望大家浪费大量的时间精力在这些各个jar包的冲突问题上,Dubbo 随着它慢慢发展完善,也一定会在版本问题上有更好的解决办法,如 Dubbo3 的出现就是如此。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2232105.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电能表预付费系统-标准传输规范(STS)(33)

6.5.4.4 Key rotation process 按键旋转过程 The entire key is rotated one bit position to the left as illustrated in Figure 15.整个密钥向左旋转一个位&#xff0c;如图15所示。 6.5.4.5 Worked example to generate TokenData for a TransferCredit token using the S…

时序数据库是什么:概念、特点与分类简析

时序数据与时序数据库的“保姆级”科普&#xff01; 作为将数据价值转化为产能能效的“核心大脑”&#xff0c;数据库的发展依然处于加速期&#xff0c;面向不同数据类型的数据库类型也在不断增加。 在众多细分领域数据库类型中&#xff0c;伴随制造业数字化转型的行业趋势和多…

【创建型】单例模式

单例模式使用的场景&#xff1a;需要频繁的进行创建和销毁的对象、创建对象时耗时过多或耗费资源过多(即&#xff1a;重量级对象)&#xff0c;但又经常用到的对象、工具类对象、频繁访问数据库或文件的对象(比如数据源、session工厂等) 1. 饿汉式&#xff08;静态常量&#xf…

6.0、静态路由

路由器最主要的功能就是转发数据包。路由器转发数据包时需要查找路由表&#xff08;你可以理解为地图&#xff09;&#xff0c;管理员可以直接手动配置路由表&#xff0c;这就是静态路由。 1.什么是路由&#xff1f; 在网络世界中&#xff0c;路由是指数据包在网络中的传输路…

工业通信网关的各项功能解析-天拓四方

在工业自动化和智能制造的浪潮中&#xff0c;工业通信网关作为连接工业现场与互联网的重要桥梁&#xff0c;发挥着至关重要的作用。它不仅实现了不同网络协议之间的转换&#xff0c;还在数据采集、设备控制、网络管理等方面展现出强大的功能。 一、协议转换功能 工业通信网关…

数据结构与算法——Java实现 53.力扣938题——二叉搜索树的范围和

生命的意义 在于活出自我 而不是成为别人眼中的你 —— 24.11.3 938. 二叉搜索树的范围和 给定二叉搜索树的根结点 root&#xff0c;返回值位于范围 [low, high] 之间的所有结点的值的和。 示例 1&#xff1a; 输入&#xff1a;root [10,5,15,3,7,null,18], low 7, high 15 …

TensorRT-LLM的k8s弹性伸缩部署方案

Scaling LLMs with NVIDIA Triton and NVIDIA TensorRT-LLM Using Kubernetes | NVIDIA Technical Blog 一共涉及4个k8s组件&#xff1a; 1. Deployment&#xff1a;跑起来N个pod&#xff1b;指定NVIDIA官方的triton&trt-llm的docker image&#xff0c;指定好model放在哪个…

高亮无惧烈日,强力巨彩租赁屏点亮户外“视”界

在户外显示领域&#xff0c;一款性能出色、适应性强、维护便捷的租赁屏无疑是众多主办方和广告商的首选。强力巨彩旗下的幻云系列租赁屏具备画面清晰、无水波纹、性能稳定、高亮度等诸多优势&#xff0c;可应用于各大户外显示场所&#xff0c;是户外租赁屏市场的明星产品。   …

批量删除redis数据【亲测可用】

文章目录 引言I redis客户端基础操作key的命名规则批量查询keyII 批量删除key使用连接工具进行分组shell脚本示例其他方法III 知识扩展:控制短信验证码获取频率引言 批量删除redis数据的应用: 例如缓存数据使用了新的key存储,需要删除废弃的key。RedisTemplate的key序列化采…

Mysql开发规范

开发规范 对象命名 命名规范的对象&#xff0c;是指数据库SCHEMA、表TABLE、字段COLUMN、索引INDEX、约束CONSTRAINTS等 【强制】凡是需要命名的对象&#xff0c;其标识符不能超过30个字符【强制】名称必须以英文字母开头&#xff0c;不得以 _(下划线) 作为起始和终止字母【…

Web应用性能测试工具 - httpstat

在数字化时代&#xff0c;网站的性能直接影响用户体验和业务成功。你是否曾经在浏览网页时&#xff0c;遇到加载缓慢的困扰&#xff1f;在这个快速变化的互联网环境中&#xff0c;如何快速诊断和优化Web应用的性能呢&#xff1f;今天&#xff0c;我们将探讨一个强大的工具——h…

(57)MATLAB使用迫零均衡器和MMSE均衡器的BPSK调制系统仿真

文章目录 前言一、仿真测试模型二、仿真代码三、仿真结果四、迫零均衡器和MMSE均衡器的实现1.均衡器的MATLAB实现2.均衡器的性能测试 总结 前言 本文给出仿真模型与MATLAB代码&#xff0c;分别使用具有ISI的三个不同传输特性的信道&#xff0c;仿真测试了使用迫零均衡器和MMSE…

用ChatGPT提升工作效率:从理论到实际应用

伴人工智能技术的迅速演进&#xff0c;像ChatGPT这类语言模型已成为提升工作效率的关键工具。这类模型不仅具备处理海量数据的能力&#xff0c;还能自动化许多日常任务&#xff0c;从而提高决策的准确性。本文将深入探讨如何在工作中利用ChatGPT等AI工具提升效率&#xff0c;涵…

MySQL FIND_IN_SET 函数详解

文章目录 1. 基本语法2. 使用场景3. 实战示例3.1 基础查询示例3.2 与其他函数结合使用3.3 动态条件查询 4. 性能考虑5. 常见问题和解决方案5.1 大小写敏感问题5.2 空值处理5.3 模糊匹配 6. 总结 1. 基本语法 FIND_IN_SET 函数的基本语法如下&#xff1a; FIND_IN_SET(str, st…

「Mac畅玩鸿蒙与硬件15」鸿蒙UI组件篇5 - Slider 和 Progress 组件

Slider 和 Progress 是鸿蒙系统中的常用 UI 组件。Slider 控制数值输入&#xff0c;如音量调节&#xff1b;Progress 显示任务的完成状态&#xff0c;如下载进度。本文通过代码示例展示如何使用这些组件&#xff0c;并涵盖 进度条类型介绍、节流优化、状态同步 和 定时器动态更…

ZDH权限-扩展支持数据权限

目录 项目源码 预览地址 安装包下载地址 ZDH权限模块 ZDH权限扩展更细粒度方案 第一种方案&#xff1a; 第二种方案&#xff1a; ZDH权限扩展支持数据权限-新增属性 总结 感谢支持 项目源码 zdh_web: GitHub - zhaoyachao/zdh_web: 大数据采集,抽取平台 预览地址 后…

私有化视频平台EasyCVR海康大华宇视视频平台视频诊断技术是如何实时监测视频质量的?

在现代视频监控系统中&#xff0c;确保视频流的质量和稳定性至关重要。随着技术的进步&#xff0c;视频诊断技术已经成为实时监测视频质量的关键工具。这种技术通过智能分析算法对视频流进行实时评估和处理&#xff0c;能够自动识别视频中的各种质量问题&#xff0c;并给出相应…

Java 用户随机选择导入ZIP文件,解压内部word模板并入库,Windows/可视化Linux系统某麒麟国防系统...均可适配

1.效果 压缩包内部文件 2.依赖 <!--支持Zip--><dependency><groupId>net.lingala.zip4j</groupId><artifactId>zip4j</artifactId><version>2.11.5</version></dependency>总之是要File类变MultipartFile类型的 好像是…

论文笔记(五十四)pi0: A Vision-Language-Action Flow Model for General Robot Control

π0: A Vision-Language-Action Flow Model for General Robot Control 文章概括摘要I. INTRODUCTIONII. RELATED WORKIII. OVERVIEWIV. π 0 \pi_0 π0​模型V. 数据收集和培训配方A. 预训练和后训练B. 语言和高级策略C. 机器人系统细节 VI. 实验评估A. 基础模型评估B. 遵循语…

《AI产品经理手册》——解锁AI时代的商业密钥

在当今这个日新月异的AI时代&#xff0c;每一位产品经理都面临着前所未有的挑战与机遇&#xff0c;唯有紧跟时代潮流&#xff0c;深入掌握AI技术的精髓&#xff0c;才能在激烈的市场竞争中独占鳌头。《AI产品经理手册》正是这样一部为AI产品经理量身定制的实战宝典&#xff0c;…