文章目录
文章说明
一:Rest协议简介
二:搭建开发环境
1:父项目里边引入的新的版本内容
2:Api中的操作
3:Provider模块
三:编码
1:API模块
2:Provider模块
3:Consumer模块
本文内容整理自《孙哥说Dubbo系列视频课程》,孙帅老师课程细致、全面、深入、性价比极高。B站搜孙帅suns可以找到对应的试听视频,或者直接添加老师微信号suns45与他直接联系
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协议还是要按照之前的项目结构为基础。
8
8
UTF-8
3.2.0
2.7.12
1.9.13
3.15.6.Final
9.0.75
jackson-version的作用就是使用Http协议的时候,基于JSON进行数据的序列化。resteasy这个作用是为了发布rest的访问,我们之前在SpringMVC的时候由Rest的支持,但是我们使用Dubbo操作Http的时候,需要有这个一个RestFul的支持,这个是JBoss为我们提供的产品,用于发布Rest的访问。Tomcat主要是用于Http的访问。
我们知道,协议对于通信方式是有选择,dubbo协议,最好的通信方式是Netty,Rest协议或者说是Http协议他的最好的通信方式是服务器,服务器我们首选的就是Tomcat,所以我们还需要引入一个Tomcat依赖。
org.apache.dubbo
dubbo-rpc-rest
${dubbo.version}
jackson-core-asl
org.codehaus.jackson
jackson-jaxrs
org.codehaus.jackson
jackson-mapper-asl
org.codehaus.jackson
jackson-xc
org.codehaus.jackson
org.jboss.resteasy
resteasy-jackson-provider
${resteasy-version}
jackson-core-asl
org.codehaus.jackson
jackson-jaxrs
org.codehaus.jackson
jackson-mapper-asl
org.codehaus.jackson
jackson-xc
org.codehaus.jackson
jackson-core-asl
org.codehaus.jackson
${jackson-version}
jackson-jaxrs
org.codehaus.jackson
${jackson-version}
jackson-mapper-asl
org.codehaus.jackson
${jackson-version}
jackson-xc
org.codehaus.jackson
${jackson-version}
dubbo-rpc-rest:只要想让我们的Dubbo支持DubboRest,就必须导入这个依赖。
resteasy-jackson-provider:发布Rest服务
到这里我们的父项目就搭建完毕了。
8
8
UTF-8
com.suns
dubbo-procolo-demo
1.0-SNAPSHOT
dubbo-protocol-provider
8
8
UTF-8
com.suns
dubbo-protocol-api
1.0-SNAPSHOT
org.springframework.boot
spring-boot-starter-web
tomcat-embed-core
org.apache.tomcat.embed
org.apache.tomcat.embed
tomcat-embed-core
${tomcat.version}
Provider需要支持Rest访问,那么必须引入Tomcat来发布服务,spring-boot-starter-web这个起东器中包含了Tomcat,但是我们排除一下,使用自己引入的Tomcat。
4:Consumer模块
8
8
UTF-8
com.suns
dubbo-dubbo-001-api
1.0-SNAPSHOT
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的支持。
@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。
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协议的开发我们就分析完了。