干翻Dubbo系列第十五篇:Rest协议基于SpringBoot的规范化开发
文章目录
文章说明
一:Rest协议简介
二:搭建开发环境
1:父项目里边引入的新的版本内容
2:Api中的操作
3:Provider模块
三:编码
1:API模块
2:Provider模块
3:Consumer模块
文章说明
本文内容整理自《孙哥说Dubbo系列视频课程》,孙帅老师课程细致、全面、深入、性价比极高。B站搜孙帅suns可以找到对应的试听视频,或者直接添加老师微信号suns45与他直接联系
一:Rest协议简介
Rest协议就是我们我们一开始基于SpringBoot或者是SpringMVC开发说的Restful,本质上把他称为协议不准确。本身因为Restful他是基于Http1.x协议的。但是在这里Dubbo指的Rest协议,本质上就是指的Http协议,只不过Dubbo在这里改了相应的命名。
一旦我们引入这种协议之后,我们在Dubbo中就会有一种新的有意思的调用方式产生了。之前,Consumer里边调用Provider的代理,基于Rest协议了,我们设置可以在浏览器中或者其他的客户端中进行调用了。
作为Dubbo为什么要支持Rest协议呢?他底层是基于Http协议的,协议层次比较高,运行效率比较低。Dubbo这么做是为了和SpringCloud这个技术栈进行整合。因为SpringCloud这个技术栈的Rpc是基于Http的。为了和他进行良好的整合,Dubbo才支持了这种协议方式。
二:搭建开发环境
我们研究Rest协议还是要按照之前的项目结构为基础。
1:父项目里边引入的新的版本内容
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<dubbo.version>3.2.0</dubbo.version>
<spring-boot.version>2.7.12</spring-boot.version><jackson-version>1.9.13</jackson-version>
<resteasy-version>3.15.6.Final</resteasy-version>
<tomcat.version>9.0.75</tomcat.version></properties>
jackson-version的作用就是使用Http协议的时候,基于JSON进行数据的序列化。resteasy这个作用是为了发布rest的访问,我们之前在SpringMVC的时候由Rest的支持,但是我们使用Dubbo操作Http的时候,需要有这个一个RestFul的支持,这个是JBoss为我们提供的产品,用于发布Rest的访问。Tomcat主要是用于Http的访问。
我们知道,协议对于通信方式是有选择,dubbo协议,最好的通信方式是Netty,Rest协议或者说是Http协议他的最好的通信方式是服务器,服务器我们首选的就是Tomcat,所以我们还需要引入一个Tomcat依赖。
<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-rpc-rest</artifactId><version>${dubbo.version}</version><exclusions><exclusion><artifactId>jackson-core-asl</artifactId><groupId>org.codehaus.jackson</groupId></exclusion><exclusion><artifactId>jackson-jaxrs</artifactId><groupId>org.codehaus.jackson</groupId></exclusion><exclusion><artifactId>jackson-mapper-asl</artifactId><groupId>org.codehaus.jackson</groupId></exclusion><exclusion><artifactId>jackson-xc</artifactId><groupId>org.codehaus.jackson</groupId></exclusion></exclusions></dependency><dependency><groupId>org.jboss.resteasy</groupId><artifactId>resteasy-jackson-provider</artifactId><version>${resteasy-version}</version><exclusions><exclusion><artifactId>jackson-core-asl</artifactId><groupId>org.codehaus.jackson</groupId></exclusion><exclusion><artifactId>jackson-jaxrs</artifactId><groupId>org.codehaus.jackson</groupId></exclusion><exclusion><artifactId>jackson-mapper-asl</artifactId><groupId>org.codehaus.jackson</groupId></exclusion><exclusion><artifactId>jackson-xc</artifactId><groupId>org.codehaus.jackson</groupId></exclusion></exclusions></dependency> <dependency><artifactId>jackson-core-asl</artifactId><groupId>org.codehaus.jackson</groupId><version>${jackson-version}</version></dependency><dependency><artifactId>jackson-jaxrs</artifactId><groupId>org.codehaus.jackson</groupId><version>${jackson-version}</version></dependency><dependency><artifactId>jackson-mapper-asl</artifactId><groupId>org.codehaus.jackson</groupId><version>${jackson-version}</version></dependency><dependency><artifactId>jackson-xc</artifactId><groupId>org.codehaus.jackson</groupId><version>${jackson-version}</version></dependency>
dubbo-rpc-rest:只要想让我们的Dubbo支持DubboRest,就必须导入这个依赖。
resteasy-jackson-provider:发布Rest服务
到这里我们的父项目就搭建完毕了。
2:Api中的操作
<properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
3:Provider模块
<parent><groupId>com.suns</groupId><artifactId>dubbo-procolo-demo</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>dubbo-protocol-provider</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>com.suns</groupId><artifactId>dubbo-protocol-api</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><artifactId>tomcat-embed-core</artifactId><groupId>org.apache.tomcat.embed</groupId></exclusion></exclusions></dependency><dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-core</artifactId><version>${tomcat.version}</version></dependency></dependencies>
Provider需要支持Rest访问,那么必须引入Tomcat来发布服务,spring-boot-starter-web这个起东器中包含了Tomcat,但是我们排除一下,使用自己引入的Tomcat。
4:Consumer模块
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!--API 模块-->
<dependency>
<groupId>com.suns</groupId>
<artifactId>dubbo-dubbo-001-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
三:编码
1:API模块
API模块主要是两个作用1:定义实体,2:定义服务接口
@Path("users")
@Consumes({MediaType.APPLICATION_JSON})
//client给服务器端 发送的请求数据 json @RequestBody
@Produces({ContentType.APPLICATION_JSON_UTF_8})
//服务器给client响应的数据 json @ResponseBody
public interface UserService {@GET // @GetMapping RequestMapping(method=get)@Path("{name}/{password}") //@PathVariablepublic User login(@PathParam("name") String name, @PathParam("password") String password);
}
@Path注解的作用就参照SpringMVC里边RequestMapping注解的作用,一旦在这个接口上添加完毕这个注解之后,就相当于往外边暴露了一个Rest接口,此时他的访问路径:
http://localhost:8080/应用名/users
@Consumes的作用就相当于SpringMVC当中的@RequestBody这个注解,告诉我们的请求者,这里边是一个JSON。也就是只有给我发JSON,我才能解析。
@Produces注解的作用就相当于SpringMVC或者是SpringBoot里边@RequestBody注解中的Produces的属性,也就是告诉我们的响应的结构是UTF-8的字符集编码的JSON,避免乱码的产生。
@Get注解的作用就是告诉采用Get的方式发起请求
http://localhost:8080/应用名/users/sunshuai/123456
然后,sunshuai和123456就会分别给到两个参数,然后接口就开是拿着这两个参数跑了。具体示例如下:
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Order {private String orderNo;private double price;
}import javax.ws.rs.*;
@Path("orders")
@Consumes({MediaType.APPLICATION_JSON})
@Produces({ContentType.APPLICATION_JSON_UTF_8})
public interface OrderService {@GET@Path("{id}")Order getOrder(@PathParam("id") Long id);
}
注意这些注解的包! javax.ws.rs这个包下的注解是JavaEE规范中对标准RestFul的支持。
2:Provider模块
@DubboService
public class UserServiceImpl implements UserService {@Overridepublic User login(String name, String password) {System.out.println("UserServiceImpl.login name " + name + " password is " + password);return new User("孙帅", "123456");}
}
Provider是对接口的实现,并且把改该实现类发布为一个DubboRPC。
spring:application:name: DUBBO-PROTOCOL-PROVIDERdubbo:protocol:name: restport: 9001server: tomcatcontextpath: sunsregistry:address: zookeeper://127.0.0.1:2181
server:port: 8081
这里的重点是在协议name上,使用的是rest协议也就是Http协议。我们知道Http协议是应用层协议。应用层协议需要指定服务器,所以里边才配置了server是tomcat,port指的是服务器的端口。这样后续在Rpc的时候地址就是应该是:9001端口了。contextpath指的是suns设置的是应用名。这样最终的地址就变成了:Http://localhost:9001/suns/orders/1
server.port是指我们导入依赖的时候引入了Tomcat,他默认启动的时候也会启动Tomcat,我们为他指定端口为8081避免和我们的Rest端口发生冲突。
基于Rest协议进行RPC通信的端口是9001,@DubboService注解的作用是发布为一个DubboRpc服务,此时的作用就异常重要了,有了这个注解,这个Service配合上之前接口里边定义的各种注解才会被发布成一个Rest服务。
通过我们浏览器访问进行测试:Http://localhost:9001/suns/orders/1确实可以调用成功,没有任何的Controller。
3:Consumer模块
spring:application:name: DUBBO-DUBBO-003-CONSUMER
dubbo:registry:address: zookeeper://127.0.0.1:2181application:qos-enable: false
@DubboReference(protocol = "rest")
private UserService userService;
DubboReference这里必须要指定具体的协议。Dubbo协议因为是默认的所以不需要。
@DubboReference(protocol = "rest")private OrderService orderService;@Testvoid test2() {Order order = orderService.getOrder(1L);System.out.println("order = " + order);}
到这里,Dubbo在整个基于Rest协议的开发我们就分析完了。
相关文章:
干翻Dubbo系列第十五篇:Rest协议基于SpringBoot的规范化开发
文章目录 文章说明 一:Rest协议简介 二:搭建开发环境 1:父项目里边引入的新的版本内容 2:Api中的操作 3:Provider模块 三:编码 1:API模块 2:Provider模块 3:Co…...
文件上传后端处理页面
最近想搭建一个完整的网站,加深理解,困难重重啊,遇到很多问题 前端:非常原始的代码,没有用任何框架 <form method"post" enctype"multipart/form-data" action"upfile.php"><…...
小红书母婴类产品同质化严重,如何在市场中脱颖而出?
小红书是一个女性用户为主的平台,其美妆和母婴类产品是平台的主流类目。今天来分享下小红书母婴类产品同质化严重,如何在市场中脱颖而出? 一、小红书平台的母婴传播优势 尽管小红书的母婴品类,已经出现产品同质化严重的问题。但这…...
Typora上使用Mermaid语法展示流程图、时序图、甘特图
你已经安装Typora并打开了一个新文档后,可以按照以下详细步骤在Typora上使用Mermaid语法展示流程图、时序图、甘特图 流程图 使用graph LR声明开始,并使用箭头和连接符号定义节点之间的关系。例如,A --> B表示从节点A指向节点B的箭头连接。graph TB A[界面布局图] -->…...
css中文本阴影特效
文字颜色渐变 .text-clip{color:transparent;font-size: 40px;font-weight: bold;background: linear-gradient(45deg, rgba(0,173,181,1) 0%, rgba(0,173,181,.4) 100%);-webkit-background-clip: text; } 文字模糊 .text-blurry{text-align: center;color: transparent;text-…...
ITIL帮助台怎样帮助企业建设IT服务?
大多数企业都是从邮件开始IT支持建设的,随着企业的规模扩大、服务请求的增长,服务质量不可避免出现了急剧的下降。IT支持团队进入消防员模式,他们只能奔波于解决请求,避免服务失败。没有ITIL所定义的流程体系,IT团队失…...
解释区块链技术的应用场景和优势
区块链是一种去中心化的分布式数据库,在其中记录着多个节点之间的交易信息。它的应用场景非常广泛,以下是一些常见的应用场景和优势: 金融交易:区块链可以用来记录交易信息,从而实现去中心化的金融交易。比如比特币就是…...
从编程语言的角度来理解正则表达式
程序代码是对现实事物处理逻辑的抽象,而正则表达式,则是对复杂的字符匹配程序代码的进一步抽象;也就是说,高度简洁的正则表达式,可以认为其背后所对应的,是字符匹配程序代码,而字符匹配程序代码…...
DP读书:鲲鹏处理器 架构与编程(十四)ACPI与软件
一分钟速通ACPI和鲲鹏软件移植 操作系统内核鲲鹏软件移植鲲鹏软件移植流程 编译工具选择编译参数移植案例源码修改案例鲲鹏分析扫描工具 Dependency Advisor鲲鹏代码迁移工具 Porting Advisor 鲲鹏软件性能调优鲲鹏软件性能调优流程CPU与内存子系统性能调优网络子系统性能调优磁…...
C#,《小白学程序》第六课:队列(Queue)的应用,《实时叫号系统》
医院里面常见的叫号系统怎么实现的? 1 文本格式 /// <summary> /// 下面定义一个新的队列,用于演示《实时叫号系统》 /// </summary> Queue<Classmate> q2 new Queue<Classmate>(); /// <summary> /// 《小白学程序》第…...
mysql profiling profiles profile
要想优化一条 Query,我们就需要清楚的知道这条 Query 的性能瓶颈到底在哪里,是消耗的 CPU计算太多,还是需要的的 IO 操作太多?要想能够清楚的了解这些信息,在 MySQL 5.0 和 MySQL 5.1正式版中已经可以非常容易做到了&a…...
ChatGPT AIGC 一个指令总结Python所有知识点
在ChatGPT中,直接输入一个指令就可以生成Python的所有知识点大纲。 非常实用的ChatGPT功能。 AIGC ChatGPT ,BI商业智能, 可视化Tableau, PowerBI, FineReport, 数据库Mysql Oracle, Office, Python ,ETL Excel 2021 实操,函数,图表,大屏可视化 案例实战 http://t.…...
【kubernetes】k8s部署OpenELB及在KubeSphere使用OpenELB
OpenELB 官网 https://openelb.io 本文内容学习于马士兵云原生课程 概述 OpenELB is an open-source load balancer implementation designed for bare-metal Kubernetes clusters. OpenELB是一个为裸机Kubernetes集群设计的开源负载均衡器实现。 In cloud-based Kubernetes cl…...
Android Native Code开发学习(三)对java中的对象变量进行操作
Android Native Code开发学习(三) 本教程为native code学习笔记,希望能够帮到有需要的人 我的电脑系统为ubuntu 22.04,当然windows也是可以的,区别不大 对java中的对象变量进行操作 首先我们新建一个java的类 pub…...
如何用bat文件调用与它在同一文件夹下的某个exe程序
第一个方案: 如果bat文件与某个exe程序在同一文件夹下的。那直接写那个 程序文件名字就行了。 两种写法。比如是 test.exe程序 一种 test.exe 二种 start test.exe 第一种批处理会等待test.exe程序执行完后才会运行下面的语句 第二种不会等待 这个写绝对路径好用 另…...
设计模式--单例模式(Singleton Pattern)
一、什么是单例模式 单例模式是一种创建型设计模式,它旨在确保一个类只有一个实例,并提供一个全局访问点来访问该实例。换句话说,单例模式限制了类的实例化次数为一个,并提供一种在应用程序中共享一个实例的方式。这对于需要只有…...
postgis数据库从一张表中过滤出一部分数据到新表中
你可以使用以下步骤在PostGIS数据库中过滤objectid<100的数据,并将其创建为新表:打开PostGIS数据库的终端或客户端工具(如Psql)。 选择你要过滤数据的表。假设表名为"original_table",该表包含一个名为&q…...
INDEMIND:“大+小”多机协同,实现机器人商用场景全覆盖
随着商用清洁机器人进入越来越多的场景中,单一的中型机器人并不能有效覆盖所有区域,更加细分化的产品组合正在成为新的趋势。 产品形态的“新趋势” 在商用场景中,目前的商用清洁机器人几乎均是中大型的产品形态,较大的体型意味…...
微信开发之一键创建标签的技术实现
简要描述: 添加标签 请求URL: http://域名地址/addContactLabel 请求方式: POST 请求头Headers: Content-Type:application/jsonAuthorization:login接口返回 参数: 参数名必选类型说明…...
八一参考文献:[八一新书]许少辉.乡村振兴战略下传统村落文化旅游设计[M]北京:中国建筑出版传媒,2022.
八一参考文献:[八一新书]许少辉.乡村振兴战略下传统村落文化旅游设计[M]北京:中国建筑出版传媒,2022....
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
