国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

干翻Dubbo系列第十五篇:Rest協(xié)議基于SpringBoot的規(guī)范化開發(fā)

這篇具有很好參考價(jià)值的文章主要介紹了干翻Dubbo系列第十五篇:Rest協(xié)議基于SpringBoot的規(guī)范化開發(fā)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

干翻Dubbo系列第十五篇:Rest協(xié)議基于SpringBoot的規(guī)范化開發(fā),dubbo

文章目錄

一:Rest協(xié)議

1:協(xié)議概念

2:協(xié)議作用

二:搭建開發(fā)環(huán)境

1:父項(xiàng)目里邊引入的新的版本內(nèi)容

2:Api中的操作

3:Provider模塊

4:Consumer模塊

三:編碼

1:API模塊

2:Provider模塊

3:Consumer模塊


一:Rest協(xié)議

1:協(xié)議概念

????????Rest協(xié)議就是我們我們一開始基于SpringBoot或者是SpringMVC開發(fā)說的Restful,本質(zhì)上把他稱為協(xié)議不準(zhǔn)確。

????????Restful他是基于Http1.x協(xié)議的。但是在這里Dubbo指的Rest協(xié)議,本質(zhì)上就是指的Http協(xié)議,只不過Dubbo在這里改了相應(yīng)的命名,叫做了Rest。

2:協(xié)議作用

????????一旦我們引入這種協(xié)議之后,我們?cè)贒ubbo中就會(huì)有一種新的有意思的調(diào)用方式產(chǎn)生了。之前,Consumer里邊調(diào)用Provider的代理,基于Rest協(xié)議了,我們?cè)O(shè)置可以在瀏覽器中或者其他的客戶端中進(jìn)行調(diào)用了。

????????作為Dubbo為什么要支持Rest協(xié)議呢?他底層是基于Http協(xié)議的,協(xié)議層次比較高,運(yùn)行效率比較低。Dubbo這么做是為了和SpringCloud這個(gè)技術(shù)棧進(jìn)行整合。因?yàn)镾pringCloud這個(gè)技術(shù)棧的Rpc是基于Http的。為了和他進(jìn)行良好的整合,Dubbo才支持了這種協(xié)議方式。

二:搭建開發(fā)環(huán)境

????????我們研究Rest協(xié)議還是要按照之前的項(xiàng)目結(jié)構(gòu)為基礎(chǔ)。

1:父項(xiàng)目里邊引入的新的版本內(nèi)容

<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協(xié)議的時(shí)候,基于JSON進(jìn)行數(shù)據(jù)的序列化。resteasy這個(gè)作用是為了發(fā)布rest的訪問,我們之前在SpringMVC的時(shí)候由Rest的支持,但是我們使用Dubbo操作Http的時(shí)候,需要有這個(gè)一個(gè)RestFul的支持,這個(gè)是JBoss為我們提供的產(chǎn)品,用于發(fā)布Rest的訪問。Tomcat主要是用于Http的訪問。

????????我們知道,協(xié)議對(duì)于通信方式是有選擇,dubbo協(xié)議,最好的通信方式是Netty,Rest協(xié)議或者說是Http協(xié)議他的最好的通信方式是服務(wù)器,服務(wù)器我們首選的就是Tomcat,所以我們還需要引入一個(gè)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,就必須導(dǎo)入這個(gè)依賴。

????????resteasy-jackson-provider:發(fā)布Rest服務(wù)

????????到這里我們的父項(xiàng)目就搭建完畢了。

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來發(fā)布服務(wù),spring-boot-starter-web這個(gè)起東器中包含了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模塊主要是兩個(gè)作用:

????????1:定義實(shí)體

????????2:定義服務(wù)接口

@Path("users")
@Consumes({MediaType.APPLICATION_JSON})
//client給服務(wù)器端 發(fā)送的請(qǐng)求數(shù)據(jù) json @RequestBody
@Produces({ContentType.APPLICATION_JSON_UTF_8})
//服務(wù)器給client響應(yīng)的數(shù)據(jù) 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注解的作用,一旦在這個(gè)接口上添加完畢這個(gè)注解之后,就相當(dāng)于往外邊暴露了一個(gè)Rest接口,此時(shí)他的訪問路徑:

http://localhost:8080/應(yīng)用名/users

????????@Consumes的作用就相當(dāng)于SpringMVC當(dāng)中的@RequestBody這個(gè)注解,告訴我們的請(qǐng)求者,這里邊是一個(gè)JSON。也就是只有給我發(fā)JSON,我才能解析。

????????@Produces注解的作用就相當(dāng)于SpringMVC或者是SpringBoot里邊@RequestBody注解中的Produces的屬性,也就是告訴我們的響應(yīng)的結(jié)構(gòu)是UTF-8的字符集編碼的JSON,避免亂碼的產(chǎn)生。

????????@Get注解的作用就是告訴采用Get的方式發(fā)起請(qǐng)求

http://localhost:8080/應(yīng)用名/users/sunshuai/123456

????????然后,sunshuai和123456就會(huì)分別給到兩個(gè)參數(shù),然后接口就開是拿著這兩個(gè)參數(shù)跑了。具體示例如下:

@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這個(gè)包下的注解是JavaEE規(guī)范中對(duì)標(biāo)準(zhǔn)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是對(duì)接口的實(shí)現(xiàn),并且把改該實(shí)現(xiàn)類發(fā)布為一個(gè)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

????????這里的重點(diǎn)是在協(xié)議name上,使用的是rest協(xié)議也就是Http協(xié)議。我們知道Http協(xié)議是應(yīng)用層協(xié)議。應(yīng)用層協(xié)議需要指定服務(wù)器,所以里邊才配置了server是tomcat,port指的是服務(wù)器的端口。這樣后續(xù)在Rpc的時(shí)候地址就是應(yīng)該是:9001端口了。contextpath指的是suns設(shè)置的是應(yīng)用名。這樣最終的地址就變成了:Http://localhost:9001/suns/orders/1

????????server.port是指我們導(dǎo)入依賴的時(shí)候引入了Tomcat,他默認(rèn)啟動(dòng)的時(shí)候也會(huì)啟動(dòng)Tomcat,我們?yōu)樗付ǘ丝跒?081避免和我們的Rest端口發(fā)生沖突。

????????基于Rest協(xié)議進(jìn)行RPC通信的端口是9001,@DubboService注解的作用是發(fā)布為一個(gè)DubboRpc服務(wù),此時(shí)的作用就異常重要了,有了這個(gè)注解,這個(gè)Service配合上之前接口里邊定義的各種注解才會(huì)被發(fā)布成一個(gè)Rest服務(wù)。

????????通過我們?yōu)g覽器訪問進(jìn)行測(cè)試:Http://localhost:9001/suns/orders/1確實(shí)可以調(diào)用成功,沒有任何的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這里必須要指定具體的協(xié)議。Dubbo協(xié)議因?yàn)槭悄J(rèn)的所以不需要。

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

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

????????到這里,Dubbo在整個(gè)基于Rest協(xié)議的開發(fā)我們就分析完了。文章來源地址http://www.zghlxwxcb.cn/news/detail-692527.html

到了這里,關(guān)于干翻Dubbo系列第十五篇:Rest協(xié)議基于SpringBoot的規(guī)范化開發(fā)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【MySQL數(shù)據(jù)庫(kù) | 第十五篇】事務(wù)

    【MySQL數(shù)據(jù)庫(kù) | 第十五篇】事務(wù)

    ? ? 目錄 ? ?前言: ?介紹事務(wù): ?控制事務(wù): ?事務(wù)四大特性: ?并發(fā)事務(wù)問題: ?事務(wù)隔離級(jí)別: 總結(jié): ? 這章我們將進(jìn)入到MySQL基礎(chǔ)篇的最后一章:事務(wù),希望大家可以堅(jiān)持下去,跟著我一起走完MySQL的學(xué)習(xí)之旅。 MySQL是一種關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),支持事務(wù)管理。 事

    2024年02月08日
    瀏覽(22)
  • 【從零開始學(xué)習(xí)JAVA | 第十五篇】 多態(tài)

    【從零開始學(xué)習(xí)JAVA | 第十五篇】 多態(tài)

    本篇我們來解釋一下什么是多態(tài)關(guān)系,多態(tài)關(guān)系屬于面向?qū)ο笕筇卣鞯淖詈笠粋€(gè),可以說面向?qū)ο蟮闹攸c(diǎn)就在多態(tài),因此我們要學(xué)好面向?qū)ο缶幊趟枷?,就要學(xué)好多態(tài)。 ????????Java中的多態(tài)是指 同一類對(duì)象在不同情況下可能表現(xiàn)出不同的形態(tài)和行為。 它包括了 方法重

    2024年02月10日
    瀏覽(22)
  • 干翻Dubbo系列第九篇:Dubbo體系中序列化詳解

    干翻Dubbo系列第九篇:Dubbo體系中序列化詳解

    文章目錄 文章說明 一:序列化概念 1:概念 2:Dubbo中序列化方式 二:Kyro序列化方案 1:引入依賴 2:XML的配置方式 3:Boot的方式 4:Consumer端調(diào)用 三:FST序列化方式使用 1:引入依賴 2:XML的配置方式 3:SpringBoot的配置方式 4:?Consumer端調(diào)? 序列化是RPC的時(shí)候,將需要傳輸?shù)?/p>

    2024年02月13日
    瀏覽(83)
  • PerfView專題 (第十五篇): 如何洞察 C# 中的慢速方法

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

    在 dump 分析旅程中,經(jīng)常會(huì)遇到很多朋友反饋一類問題,比如: 方法平時(shí)都執(zhí)行的特別快,但有時(shí)候會(huì)特別慢,怎么排查? 我的方法第一次執(zhí)行特別慢,能看到慢在哪里嗎? 相信有朋友肯定說,加些日志不就好了,大方向肯定是沒問題的,但加日志的顆粒度會(huì)比較粗而且侵

    2024年02月16日
    瀏覽(25)
  • 二十三種設(shè)計(jì)模式第十五篇--模版方法模式

    二十三種設(shè)計(jì)模式第十五篇--模版方法模式

    模板方法模式是一種行為型設(shè)計(jì)模式,它定義了一個(gè)算法的骨架,而將一些步驟延遲到子類中實(shí)現(xiàn)。通過使用這種模式,我們可以在不改變算法結(jié)構(gòu)的情況下,重新定義算法中的某些特定步驟。 模板方法模式的核心思想是將一個(gè)算法分解為一系列步驟,并將可變的部分封裝在

    2024年02月12日
    瀏覽(23)
  • 干翻Dubbo系列第四篇:Dubbo3第一個(gè)應(yīng)用程序細(xì)節(jié)補(bǔ)充

    干翻Dubbo系列第四篇:Dubbo3第一個(gè)應(yīng)用程序細(xì)節(jié)補(bǔ)充

    1:協(xié)議端口 補(bǔ)充說明1: 顯示指定Dubbo服務(wù)啟動(dòng)的端口號(hào):一個(gè)服務(wù)器上起多個(gè)Provider都這樣顯示的指定port端口號(hào)的話,會(huì)造成端口號(hào)沖突。 解決方式:我們可以port設(shè)置為-1,服務(wù)啟動(dòng)時(shí)默認(rèn)采用20880(dubbo協(xié)議默認(rèn)端口),此端口被占用默認(rèn)會(huì)+1,一直到加端口不占用為止。

    2024年02月15日
    瀏覽(25)
  • 深入理解JVM虛擬機(jī)第十五篇:虛擬機(jī)棧常見異常以及如何設(shè)置虛擬機(jī)棧的大小

    深入理解JVM虛擬機(jī)第十五篇:虛擬機(jī)棧常見異常以及如何設(shè)置虛擬機(jī)棧的大小

    ???? 學(xué)習(xí)交流群: ??1:這是 孫哥suns 給大家的福利! ??2:我們免費(fèi)分享Netty、Dubbo、k8s、Mybatis、Spring...應(yīng)用和源碼級(jí)別的視頻資料 ????3:QQ群: 583783824 ? ???? ?工作微信: BigTreeJava 拉你進(jìn)微信群,免費(fèi)領(lǐng)取! ????4:本文章內(nèi)容出自上述:Spring應(yīng)用課程!????

    2024年02月06日
    瀏覽(27)
  • 【從零開始學(xué)習(xí)JAVA | 第四十五篇】反射

    【從零開始學(xué)習(xí)JAVA | 第四十五篇】反射

    目錄 前言: ?反射: ?使用反射的步驟: 1.獲取階段: 2.使用階段: 反射的應(yīng)用場(chǎng)景: 使用反射的優(yōu)缺點(diǎn): 總結(jié): Java中的反射是一項(xiàng)強(qiáng)大而靈活的功能,它允許程序在運(yùn)行時(shí) 動(dòng)態(tài)地獲取、操作和利用類的信息 。通過反射,我們可以在運(yùn)行時(shí)檢查和修改類的屬性、調(diào)用類

    2024年02月13日
    瀏覽(90)
  • 【從零開始學(xué)習(xí)JAVA | 第二十五篇】泛型

    【從零開始學(xué)習(xí)JAVA | 第二十五篇】泛型

    目錄 前言: 泛型: 額外拓展: 總結(jié): ????????本文將詳細(xì)介紹之前我們?cè)贘AVA 中一直在講的泛型,各位感興趣的同學(xué)可以點(diǎn)擊進(jìn)來觀看。 ????????泛型是一種編程概念, 它允許在定義類、接口或方法時(shí)使用類型參數(shù),這樣可以在使用時(shí)指定實(shí)際的類型。 通過使用泛

    2024年02月16日
    瀏覽(25)
  • 【從零開始學(xué)習(xí)JAVA | 第三十五篇】IO流綜合練習(xí)

    【從零開始學(xué)習(xí)JAVA | 第三十五篇】IO流綜合練習(xí)

    目錄 前言: 1.拷貝文件(含子文件) 思路: 2.文件加密 思路: 3.修改文件中的數(shù)據(jù): 思路: 總結(jié): ? ? ? ? 在前面我們?yōu)榇蠹医榻B了FILE類和IO類。這篇文章我們來練習(xí)一些綜合使用的例子以此來鞏固我們自己的所學(xué)知識(shí)。 建立一個(gè)讀文件的流來讀取文件,一個(gè)寫文件的流

    2024年02月14日
    瀏覽(86)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包