干翻Dubbo系列第十五篇:Rest协议基于SpringBoot的规范化开发

这篇具有很好参考价值的文章主要介绍了干翻Dubbo系列第十五篇:Rest协议基于SpringBoot的规范化开发。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

干翻Dubbo系列第十五篇:Rest协议基于SpringBoot的规范化开发,dubbo

文章目录

一:Rest协议

1:协议概念

2:协议作用

二:搭建开发环境

1:父项目里边引入的新的版本内容

2:Api中的操作

3:Provider模块

4:Consumer模块

三:编码

1:API模块

2:Provider模块

3:Consumer模块


一:Rest协议

1:协议概念

        Rest协议就是我们我们一开始基于SpringBoot或者是SpringMVC开发说的Restful,本质上把他称为协议不准确。

        Restful他是基于Http1.x协议的。但是在这里Dubbo指的Rest协议,本质上就是指的Http协议,只不过Dubbo在这里改了相应的命名,叫做了Rest。

2:协议作用

        一旦我们引入这种协议之后,我们在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}") //@PathVariable
    public 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 {
    @Override
    public 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-PROVIDER

dubbo:
  protocol:
    name: rest
    port: 9001
    server: tomcat
    contextpath: suns
  registry:
    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:2181
    application:
        qos-enable: false
@DubboReference(protocol = "rest")
private UserService userService;

        DubboReference这里必须要指定具体的协议。Dubbo协议因为是默认的所以不需要。

    @DubboReference(protocol = "rest")
    private OrderService orderService;

    @Test
    void test2() {
        Order order = orderService.getOrder(1L);
        System.out.println("order = " + order);
    }

        到这里,Dubbo在整个基于Rest协议的开发我们就分析完了。文章来源地址https://www.toymoban.com/news/detail-692527.html

到了这里,关于干翻Dubbo系列第十五篇:Rest协议基于SpringBoot的规范化开发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【MySQL数据库 | 第十五篇】事务

    【MySQL数据库 | 第十五篇】事务

        目录    前言:  介绍事务:  控制事务:  事务四大特性:  并发事务问题:  事务隔离级别: 总结:   这章我们将进入到MySQL基础篇的最后一章:事务,希望大家可以坚持下去,跟着我一起走完MySQL的学习之旅。 MySQL是一种关系型数据库管理系统,支持事务管理。 事

    2024年02月08日
    浏览(11)
  • 【从零开始学习JAVA | 第十五篇】 多态

    【从零开始学习JAVA | 第十五篇】 多态

    本篇我们来解释一下什么是多态关系,多态关系属于面向对象三大特征的最后一个,可以说面向对象的重点就在多态,因此我们要学好面向对象编程思想,就要学好多态。         Java中的多态是指 同一类对象在不同情况下可能表现出不同的形态和行为。 它包括了 方法重

    2024年02月10日
    浏览(13)
  • 干翻Dubbo系列第九篇:Dubbo体系中序列化详解

    干翻Dubbo系列第九篇:Dubbo体系中序列化详解

    文章目录 文章说明 一:序列化概念 1:概念 2:Dubbo中序列化方式 二:Kyro序列化方案 1:引入依赖 2:XML的配置方式 3:Boot的方式 4:Consumer端调用 三:FST序列化方式使用 1:引入依赖 2:XML的配置方式 3:SpringBoot的配置方式 4: Consumer端调⽤ 序列化是RPC的时候,将需要传输的

    2024年02月13日
    浏览(33)
  • PerfView专题 (第十五篇): 如何洞察 C# 中的慢速方法

    PerfView专题 (第十五篇): 如何洞察 C# 中的慢速方法

    在 dump 分析旅程中,经常会遇到很多朋友反馈一类问题,比如: 方法平时都执行的特别快,但有时候会特别慢,怎么排查? 我的方法第一次执行特别慢,能看到慢在哪里吗? 相信有朋友肯定说,加些日志不就好了,大方向肯定是没问题的,但加日志的颗粒度会比较粗而且侵

    2024年02月16日
    浏览(11)
  • 二十三种设计模式第十五篇--模版方法模式

    二十三种设计模式第十五篇--模版方法模式

    模板方法模式是一种行为型设计模式,它定义了一个算法的骨架,而将一些步骤延迟到子类中实现。通过使用这种模式,我们可以在不改变算法结构的情况下,重新定义算法中的某些特定步骤。 模板方法模式的核心思想是将一个算法分解为一系列步骤,并将可变的部分封装在

    2024年02月12日
    浏览(12)
  • 干翻Dubbo系列第四篇:Dubbo3第一个应用程序细节补充

    干翻Dubbo系列第四篇:Dubbo3第一个应用程序细节补充

    1:协议端口 补充说明1: 显示指定Dubbo服务启动的端口号:一个服务器上起多个Provider都这样显示的指定port端口号的话,会造成端口号冲突。 解决方式:我们可以port设置为-1,服务启动时默认采用20880(dubbo协议默认端口),此端口被占用默认会+1,一直到加端口不占用为止。

    2024年02月15日
    浏览(13)
  • 深入理解JVM虚拟机第十五篇:虚拟机栈常见异常以及如何设置虚拟机栈的大小

    深入理解JVM虚拟机第十五篇:虚拟机栈常见异常以及如何设置虚拟机栈的大小

    😉😉 学习交流群: ✅✅1:这是 孙哥suns 给大家的福利! ✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 🥭🥭3:QQ群: 583783824   📚📚  工作微信: BigTreeJava 拉你进微信群,免费领取! 🍎🍎4:本文章内容出自上述:Spring应用课程!💞💞

    2024年02月06日
    浏览(17)
  • 【从零开始学习JAVA | 第二十五篇】泛型

    【从零开始学习JAVA | 第二十五篇】泛型

    目录 前言: 泛型: 额外拓展: 总结:         本文将详细介绍之前我们在JAVA 中一直在讲的泛型,各位感兴趣的同学可以点击进来观看。         泛型是一种编程概念, 它允许在定义类、接口或方法时使用类型参数,这样可以在使用时指定实际的类型。 通过使用泛

    2024年02月16日
    浏览(14)
  • 【从零开始学习JAVA | 第四十五篇】反射

    【从零开始学习JAVA | 第四十五篇】反射

    目录 前言: ​反射:  使用反射的步骤: 1.获取阶段: 2.使用阶段: 反射的应用场景: 使用反射的优缺点: 总结: Java中的反射是一项强大而灵活的功能,它允许程序在运行时 动态地获取、操作和利用类的信息 。通过反射,我们可以在运行时检查和修改类的属性、调用类

    2024年02月13日
    浏览(46)
  • 【从零开始学习JAVA | 第三十五篇】IO流综合练习

    【从零开始学习JAVA | 第三十五篇】IO流综合练习

    目录 前言: 1.拷贝文件(含子文件) 思路: 2.文件加密 思路: 3.修改文件中的数据: 思路: 总结:         在前面我们为大家介绍了FILE类和IO类。这篇文章我们来练习一些综合使用的例子以此来巩固我们自己的所学知识。 建立一个读文件的流来读取文件,一个写文件的流

    2024年02月14日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包