11. Springboot集成Dubbo3(二)示例demo

news2024/11/26 11:26:30

目录

1、前言

2、注册中心

3、快速开始

3.1、添加dubbo3依赖

3.2、dubbo3-api

​编辑

3.3、dubbo3-server

3.3.1、添加依赖

3.3.2、实现IUserService

3.3.3、添加配置文件application.properties

3.3.4、修改Application启动类

3.3.5、出错解决

3.4、dubbo3-portal

3.4.1、添加依赖

3.4.2、定义Controller

3.4.3、添加配置文件application.properties

3.4.4、修改启动类

3.4.5、启动成功,访问测试

4、小结


1、前言

Dubbo3从Dubbo2演进过来之后,已经从单纯的RPC框架改进成为了一个微服务框架,具备RPC框架能力的同时,还兼备服务治理能力。今天简单介绍下Dubbo3和Springboot的集成过程。

2、注册中心

官方仍然推荐zookeeper作为注册中心。ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

先下载Zookeeper:Apache ZooKeeper

下载最新版本后解压。

接着,打开conf文件夹,把zoo_sample.cfg文件复制一份为zoo.cfg。以为zookeeper默认会读取zoo.cfg,zookeeper刚解压出来的版本仅仅提供了一个最简配置文件zoo_sample.cfg,需要我们自行修订。我们不做任何修订,直接复制一份出来。

我们可以观察一下zoo.cfg中的一些简单配置,我们删除一下注释内容,只剩下以下配置:

# 时间配置最小但域,其他时间配置以整数倍tickTime计算
tickTime=2000
#Leader允许Follower启动时在initLimit时间内完成数据同步,单位:tickTime
initLimit=10
# Leader发送心跳包给集群中所有Follower,若Follower在syncLimit时间内没有响应,那么Leader就认为该follower已经挂掉了,单位:tickTime
syncLimit=5
# 配置zookeeper的数据目录
dataDir=/tmp/zookeeper
# 用于接收客户端请求的端口
clientPort=2181

最后,我们直接双击binzkServer.cmd,看下以下内容,就说明启动成功了。

3、快速开始

简单示例场景:项目分Server服务层和Portal消费层。Portal调用Server提供的sayHello方法,输出相应内容,使用dubbo3进行Portal和Server的RPC通信。

3.1、添加dubbo3依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter -->
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-spring-boot-starter</artifactId>
        <version>3.2.10</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-dependencies-zookeeper -->
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-dependencies-zookeeper</artifactId>
        <version>3.2.10</version>
        <type>pom</type>
    </dependency>
</dependencies>

3.2、dubbo3-api

这一层我们定义一个公用的接口类和实体类。我们定义了IUserService。

public interface IUserService {
    String sayHello(String name);
}

3.3、dubbo3-server

3.3.1、添加依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter -->
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-spring-boot-starter</artifactId>
        <version>3.2.10</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-dependencies-zookeeper -->
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-dependencies-zookeeper</artifactId>
        <version>3.2.10</version>
        <type>pom</type>
    </dependency>

    <dependency>
        <groupId>com.example</groupId>
        <artifactId>dubbo3-api</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>

</dependencies>

3.3.2、实现IUserService

定义service实现类,实现IUserService接口。这里的Service需要加上@DubboService,声明自己托管给dubbo进行管理。

import com.example.dubbo3api.service.IUserService;
import org.apache.dubbo.config.annotation.DubboService;

@DubboService
public class UserServiceImpl implements IUserService {

    @Override
    public String sayHello(String name){
        return name + "say hello, my bro.";
    }
}

3.3.3、添加配置文件application.properties

server.port=7010

# 该服务注册到dubbo中暴露的协议端口
dubbo.protocol.port=20080
# 该服务注册到dubbo中暴露的协议
dubbo.protocol.name=dubbo
# 注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.application.name=dubbo3-server

3.3.4、修改Application启动类

启动类需要加上EnableDubbo注解,表示开启dubbo。

@EnableDubbo
@SpringBootApplication
public class Dubbo3ServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(Dubbo3ServerApplication.class, args);
    }

}

接着就可以直接启动server层了。直接启动,发现一直卡在连接zookeeper上,过了一会直接报错了。

3.3.5、出错解决

由于我使用的是JDK17,当Zookeeper对象实例化时,会调用InetSocketAddress的toString方法;而在jdk17中,该方法解析空字符串会拼装/。所以要么降回去使用JDK8,要么修改这个问题。降是不可能降的,一辈子都不可能降的。所以我们开始升级zookeeper版本,由于自带的zookeeper版本为3.4.14,太低了,我们排除后,升级zookeeper版本,问题即可解决。

<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-dependencies-zookeeper</artifactId>
    <version>3.2.10</version>
    <type>pom</type>
    <exclusions>
        <exclusion>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.9.1</version>
</dependency>

继续启动,看到如下输出,启动成功。

3.4、dubbo3-portal

3.4.1、添加依赖

同样需要排除zookeeper版本,自己引入高版本的zookeeper。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter -->
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-spring-boot-starter</artifactId>
        <version>3.2.10</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-dependencies-zookeeper -->
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-dependencies-zookeeper</artifactId>
        <version>3.2.10</version>
        <type>pom</type>
        <exclusions>
            <exclusion>
                <groupId>org.apache.zookeeper</groupId>
                <artifactId>zookeeper</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
        <version>3.9.1</version>
    </dependency>

    <dependency>
        <groupId>com.example</groupId>
        <artifactId>dubbo3-api</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
</dependencies>

3.4.2、定义Controller

定义controller,调用userService的sayHello()。引用IUserService时,需要使用@DubboReference注入。

@RestController
public class UserController {

    @DubboReference
    private IUserService userService;

    @GetMapping("sayHello/{name}")
    public String sayHello(@PathVariable String name){
        return userService.sayHello(name);
    }

}

3.4.3、添加配置文件application.properties

server.port=8010

# 连接注册中心,需要与dubbo3-server的注册中心一致
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.application.name=dubbo3-portal

3.4.4、修改启动类

启动类需要加上EnableDubbo注解,表示开启dubbo。

@EnableDubbo
@SpringBootApplication
public class Dubbo3PortalApplication {

    public static void main(String[] args) {
        SpringApplication.run(Dubbo3PortalApplication.class, args);
    }

}

3.4.5、启动成功,访问测试

4、小结

Dubbo3与Springboot的简单集成几步就可以了,集成还是相当容易的。目前为止Dubbo3和Dubbo2在集成上发现还是有一些区别的。如:

  1. Server注册到Zookeeper中,Dubbo2的注解为@Service,Dubbo3使用@DubboService。而@Service已经被标注为删除。相比Dubbo2来讲更加有辨识度,相信不少因为@Service用成了Spring的注解,而导致service一致注册失败问题而抓狂的朋友吧。
  2. Portal注入Service时,Dubbo2注解为@Reference,Dubbo3使用@DubboReference,命名上更加有辨识度。
  3. 配置上,同样Dubbo2和Dubbo3提供了XML配置方式和注解方式,但是Dubbo3相比Dubbo2,配置起来更加简单
  4. 依赖不同,Dubbo3特地提供了Springboot集成模块依赖,而不是独立的apache依赖。

简单使用下来发现目前有这几点不同,其他的功能还有待继续深入研究。

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

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

相关文章

世界顶级名校计算机专业,都在用哪些书当教材?

前言 在当今信息化、数字化时代&#xff0c;计算机科学已成为全球最为热门和重要的学科之一。世界顶级名校的计算机专业&#xff0c;更是培养未来行业领袖和创新人才的重要基地。那么&#xff0c;这些名校的计算机专业究竟使用哪些教材呢&#xff1f;这些教材又具有哪些特色和…

智能化机械生产引擎:亿发制造ERP系统助帮助工厂真正把控车间管理

工厂的制造管理过程以车间管理为核心&#xff0c;而车间管理涉及到生产的下达、派工、汇报等复杂流程&#xff0c;几乎包含了生产的全过程。这种繁琐性使得车间管理变得异常困难&#xff0c;因此&#xff0c;引入一款专业的制造ERP软件成为解决难题的有效途径。 在制造业引入E…

文件IO及目录IO——day05

文件IO还剩下一个知识点&#xff0c;今天主要内容是目录IO 文件IO lseek lseekoff_t lseek(int fd, off_t offset, int whence); 功能:重新设定文件描述符的偏移量 参数:fd:文件描述符offset:偏移量whence:SEEK_SET 文件开头SEEK_CUR 文件当前位置SEEK_END 文件末尾…

【PyQt6] 框选截图功能

1 简介 书接上回, 全屏截图实现起来很简单, 来点稍微复杂点的, 框选截图 原理很简单, 弄个控件实现全屏半透视, 在全屏控件上画一个选框或者再弄一个几乎全透的子控件,实现鼠标拖动,缩放,移动, 键盘wasd 微调 用一个控件实现起来会很完美, 但是逻辑全部堆砌在一起,看代码会很…

PWM功能介绍 和配置

泰山派默认提供了3组PWM的GPIO &#xff0c; 为了检测PWM的输出&#xff0c;我们可以配合逻辑分析仪来查看效果&#xff0c;或者搭配STC8的LED灯 PWM 测试 列举所有的PWM设备&#xff1a; # 查找所有有pwm名称的文件 find / -name "pwm" # pwm4: pwmfe6e0000 edp屏幕…

VPX信号处理卡设计原理图:9-基于DSP TMS320C6678+FPGA XC7V690T的6U VPX信号处理卡 信号处理 无线电通信

一、概述 本板卡基于标准6U VPX 架构&#xff0c;为通用高性能信号处理平台&#xff0c;系我公司自主研发。板卡采用一片TI DSP TMS320C6678和一片Xilinx公司Virtex 7系列的FPGA XC7V690T-2FFG1761I作为主处理器&#xff0c;Xilinx 的Aritex XC7A200T作为辅助处理器。XC7A2…

OpenAI视频生成模型Sora的全面解析:从ViViT、扩散Transformer到NaViT、VideoPoet

前言 真没想到&#xff0c;距离视频生成上一轮的集中爆发(详见《视频生成发展史&#xff1a;从Gen2、Emu Video到PixelDance、SVD、Pika 1.0、W.A.L.T》)才过去三个月&#xff0c;没想OpenAI一出手&#xff0c;该领域又直接变天了 自打2.16日OpenAI发布sora以来(其开发团队包…

30分钟快速上手LaTex

文章目录 30 分钟快速上手 LATEX1.什么是LATEX?2.为什么学习LATEX?3.编写第一个LATEX程序4.LATEX文档的序言5.LATEX文档的标题、作者和日期信息6.LATEX文档的注释7.LATEX文档的粗体、斜体和下划线8.LATEX文档中添加图片9.LATEX中对图像进行标注、标签化和引用10.在LATEX中创建…

105.网游逆向分析与插件开发-网络通信封包解析-分析接收到的对话数据包

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;接收数据的初步逆向分析 通过上一个内容&#xff0c;找到了数据包出现的一个很重要的位置&#xff0c;只要hook之后就能很好的得到这个数据了 然后来到明文数据的位置&#xff0c;把数据包复制出来&…

跨境电商独立站是什么?为什么要做独立站?

独立站在近两年被推上风口&#xff0c;很多人跟风涌入赛道&#xff0c;但并不知道做独立网站的根本原因是什么&#xff1f;为什么跨境电商要做独立站&#xff1f; 今天分享这篇文章&#xff0c;希望能帮助正在建站或想要建站的朋友们建立起对独立站的优劣势、未来发展空间的一…

《剑指Offer》笔记题解思路技巧优化 Java版本——新版leetcode_Part_4

《剑指Offer》笔记&题解&思路&技巧&优化_Part_4 &#x1f60d;&#x1f60d;&#x1f60d; 相知&#x1f64c;&#x1f64c;&#x1f64c; 相识&#x1f622;&#x1f622;&#x1f622; 开始刷题1. LCR 148. 验证图书取出顺序——栈的压入、弹出序列2. LCR 14…

Linux:grep进阶(11)

Linux&#xff1a;shell脚本&#xff1a;基础使用&#xff08;4&#xff09;《正则表达式-grep工具》_shell grep 全角字符串-CSDN博客https://blog.csdn.net/w14768855/article/details/132338954?ops_request_misc%257B%2522request%255Fid%2522%253A%252217083360171680022…

状压dp,HDU1074.Doing Homework

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Every teacher giv…

【JavaEE】_HTTP响应

目录 1. 首行 2. 报头header 3.空行 4. 正文body 1. 首行 响应首行&#xff1a;版本号状态码状态码描述&#xff1b; HTTP状态码描述了这次响应的结果&#xff08;比如成功、失败&#xff0c;以及失败原因等&#xff09;&#xff1b; 1. HTTP状态码有&#xff1a; &#…

【EI会议征稿通知】第三届先进制造技术与制造系统国际学术会议(ICAMTMS 2024)

第三届先进制造技术与制造系统国际学术会议&#xff08;ICAMTMS 2024&#xff09; 2024 3rd International Conference on Advanced Manufacturing Technology and Manufacturing System 随着工业技术的发展&#xff0c;先进制造技术日益成为未来制造业发展的重大趋势和核心内…

Maven属性scope

参考&#xff1a; maven 中 scope标签的作用&#xff08;runtime、provided、test、compile 的作用&#xff09; 【Maven】属性scope依赖作用范围详解 scope为provided

VNCTF2024misc方向部分wp

文章目录 sqlsharkLearnOpenGLez_msbOnlyLocalSql sqlshark tshark -r sqlshark.pcap -Y "http" -T fields -e frame.len -e http.file_data > data.txt不太像常规的盲注&#xff0c;一次性发送两条很类似的payload&#xff0c;比常规的多了一个least在判断passw…

不懂咱就学,记不住多看几遍(二)

一、Redis分布式锁中加锁与解锁、过期如何续命 实现要点&#xff1a; 互斥性&#xff0c;同一时刻&#xff0c;只能有一个客户端持有锁。防止死锁发生&#xff0c;如果持有锁的客户端因崩溃而没有主动释放锁&#xff0c;也要保证锁可以释放并且其他客户端可以正常加锁。加锁和…

TypeScript(二):TypeScript的细节

TypeScript语法细节 联合类型&#xff08;满足其中一个即可&#xff09; 可以使用多种运算符&#xff0c;从现有的类型中构建新类型 const number|string 123 可以是这些类型中的任何值但是使用的时候需要小心 let virable: number | string 123function getData(id: numb…

金山WPS下的word,如何删除表格下面的大段空白

在csdn&#xff0c;你甚至可以学习到wps小技巧。 如题&#xff0c;这种大段空白怎么设置文本格式&#xff0c;表格格式都没用。正常的backspace删除也没用。 解决方式如下&#xff1a; 长按鼠标左键拖拽选中空白区域&#xff08;可能没有选中成功的特效没关系&#xff09;&am…