文章目錄
一: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)的所以不需要。文章來源:http://www.zghlxwxcb.cn/news/detail-692527.html
@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)!