干翻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协议的开发我们就分析完了。

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

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

相关文章

学习总结(二) node.js服务器如何使用net模块向硬件发送命令与接收数据?

服务器server.js: const net require("net"); //此模块用于tcp/ip通讯 当收到get请求时: server.get("/cfjcApi/v1/SkyTempHudi", (req, res) > { let client new net.Socket(); client.connect(网络模块端口, 网络模块Ip, () > { //此模块…

leetcode做题笔记111. 二叉树的最小深度

给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明&#xff1a;叶子节点是指没有子节点的节点。 思路一&#xff1a;递归 int minDepth(struct TreeNode* root){if(!root)return 0;int leftminDepth(root->le…

在springboot中配置mybatis(mybatis-plus)mapper.xml扫描路径的问题

我曾经遇到过类似问题&#xff1a; mybatis-plus的mapper.xml在src/main/java路径下如何配置pom.xml和application.yml_idea 把mapper文件放到java下如何配置_梓沂的博客-CSDN博客 当时只是找到解决问题的办法&#xff0c;但对mybatis配置来龙去脉并未深入了解&#xff0c;所…

Servlet的使用(JavaEE初阶系列17)

目录 前言&#xff1a; 1.Servlet API的使用 1.1HttpServlet 1.2HttpServletRequest 1.3HttpServletResponse 2.表白墙的更新 2.1表白墙存在的问题 2.2前后端交互接口 2.3环境准备 2.4代码的编写 2.5数据的持久化 2.5.1引入JDBC依赖 2.5.2创建数据库 2.5.3编写数…

clickhouse系列3:clickhouse分析英国房产价格数据

1.准备数据集 该数据集包含有关英格兰和威尔士自1995年起到2023年的房地产价格的数据,超过2800万条记录,未压缩形式的数据集大小超过4GB,在ClickHouse中需要约306MB。 2.clickhouse中建表 CREATE TABLE uk_price_paid (price UInt32,

Mysql 索引

索引 索引是一个排序的列表&#xff0c;在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址&#xff08;类似于C语言的链表通过指针指向数据记录的内存地址&#xff09; 使用索引后可以不用扫描全表来定位某行的数据&#xff0c;而是先通过索引表找到该行数据对应…

spring的后置处理器BeanPostProcessor

什么是BeanPostProcessor 是spring IOC容器给我们提供的一个扩展接口在调用初始化方法前后对bean进行额外加工&#xff0c;ApplicationContext会自动扫描实现了BeanPostProcessor的bean&#xff0c;并注册这些bean为后置处理器是bean的统一前置后置处理而不是基于某一个bean 执…

Linux系统:CentOS 7 CA证书服务器部署

目录 一、理论 1.CA认证中心 2.CA证书服务器部署 二、实验 1. CA证书服务器部署 三、总结 一、理论 1.CA认证中心 &#xff08;1&#xff09;概念 CA &#xff1a;CertificateAuthority的缩写&#xff0c;通常翻译成认证权威或者认证中心&#xff0c;主要用途是为用户…

defaultdict, Counter, json包中的load, dump是否都保持插入顺序

自python3.7以来&#xff0c;python的dict都会保留插入顺序&#xff0c;那么相关的defaultdict, Counter&#xff0c;以及使用json.load、json.dump也一定能保持顺序吗&#xff1f; 结论&#xff1a;以上这些和dict一样&#xff0c;都会保留插入顺序 defaultdict&#xff1a;…

Linux防火墙相关命令

防火墙基础命令 systemctl status firewalld #查看防火墙状态 systemctl start firewalld #开启防火墙 systemctl stop firewalld #临时关闭 systemctl disable firewalld.service #关闭自启 systemctl enable firewalld.servi…

39、springboot的前端静态资源的WebJar支持(bootstrap、jquery等)及自定义图标和首页

★ WebJar支持 Spring Boot支持加载WebJar包中的静态资源&#xff08;图片、JS、CSS&#xff09;&#xff0c; WebJar包中的静态资源都会映射到/webjars/**路径。——这种方式下&#xff0c;完全不需要将静态资源复制到应用的静态资源目录下。只要添加webjar即可。假如在应用的…

十四、组合模式

一、什么是组合模式 组合&#xff08;Composite Pattern&#xff09;模式的定义&#xff1a;有时又叫作整体-部分&#xff08;Part-Whole&#xff09;模式&#xff0c;它是一种将对象组合成树状的层次结构的模式&#xff0c;用来表示“整体-部分”的关系&#xff0c;使用户对单…

从零开始搭建并运行mmsegmentation

安装&#xff1a; Step 1:创建Conda 环境并激活之 conda create --name openmmlab python3.8 -y conda activate openmmlab Step 2&#xff1a;CUDA版本选择&#xff0c;及安装Pytorch 关于设备GPU的cuda版本&#xff0c;根据如下的选择原则&#xff1a; 对于Ampere架构的…

无感刷新:Vue前端实现Token的无缝刷新机制

在现代Web应用程序中&#xff0c;用户身份验证和授权通常使用令牌&#xff08;Token&#xff09;机制来实现。然而&#xff0c;由于Token的过期时间限制&#xff0c;用户在长时间使用应用程序时可能需要重新登录。为了提供更好的用户体验&#xff0c;我们可以通过实现Token的无…

Python 和 C++ 使用细节差别

1. 循环中的可迭代对象长度 1. 循环中的可迭代对象长度 C 中&#xff0c;for循环中写明a.size()&#xff0c;每次循环这个值是重新计算的&#xff1b; # include “iostream” # include <vector> using namespace std;int main() {vector<int> a(10);int cnt 0…

7.Redis-list

list list常用命令lpushlrangelpushxrpushrpushxlpop / rpoplindexlinsertllenlremltrimlset 阻塞版本命令blpop/brpop 总结内部编码应用场景使用redis作为消息队列 redis中的 list 是一个双端队列, list 相当于是数组或者顺序表。list 并非是一个简单的数组&#xff0c;而是更…

拓世科技集团 | “书剑人生”李步云学术思想研讨会暨李步云先生九十华诞志庆

2023年&#xff0c;中国改革开放迎来了45周年&#xff0c;改革春风浩荡&#xff0c;席卷神州大地&#xff0c;45年间&#xff0c;中国特色社会主义伟大事业大步迈入崭新境界&#xff0c;一路上结出了饶为丰硕的果实。中华民族在这45年间的砥砺前行&#xff0c;不仅使中国的经济…

学会电子商务个性化这一招,让你的客户源源不断

在增加销售额和创建客户喜爱的品牌时&#xff0c;电子商务个性化是您成功的关键。但是&#xff0c;个性化您的在线购物体验的各个方面似乎都不是那么简单。 幸运的是&#xff0c;您看到了这一篇文章。在本文中&#xff0c;我们将探讨为什么电子商务个性化如此重要。在此过程中…

NTP服务器时间配置

简介 ntp服务器是一个同步时间都服务器。 开启ntpd 1.查看状态&#xff08;可以看到状态为&#xff1a;inactive&#xff0c;也就是没有启动ntp服务&#xff09; [rootlocalhost]$ systemctl status ntpd ● ntpd.service - Network Time ServiceLoaded: loaded (/usr/lib/…

C# Timer定时器

C# Timer定时器 Timer定时器定时器主要用到的就是Timer的Tick事件&#xff0c;另外还要设置时间间隔&#xff1a; 下面这个实力演示了每隔一秒&#xff0c;picturebox中的图片来回切换&#xff0c;每隔一秒&#xff0c;文本框中显示当前时间。 using System; using System.Co…