IDEA +Tomcat + maven 搭建 Dubbo REST 项目

灰太狼 2021-10-19 04:18 529阅读 0赞

Github 项目地址:dubbo-provider-rest.git


(一)三个配置文件

很多使用外部 Tomcat(servlet 容器) 开发的项目都是为了实现 REST 调用。但是 Dubbo 项目的配置比较复杂,下面先给出三个主要的配置文件。分别是maven项目构建的依赖文件pom.xml、web项目常用的web.xml文件、Dubbo/Spring 的 context 配置文件。

pom.xml 添加的依赖如下,有很多的坑点,请确保每一个包都正确导入,有冲突的包都忽略。即使正确导入所有包也有可能因为版本对应不上的问题导致启动失败,请大家尽量使用下面的版本,少走弯路。

主要有Spring、Dubbo、REST支持、Tomcat、zookeeper、日志(重要)、JSON/XML序列化。

  1. <dependencies>
  2. <!-- 【begin Spring】 -->
  3. ...省略,详细请看项目pom.xml文件
  4. <!-- 【end Spring】-->
  5. <!-- 【begin dubbo】 -->
  6. <dependency>
  7. <groupId>com.alibaba</groupId>
  8. <artifactId>dubbo</artifactId>
  9. <!-- 去除Spring,防止冲突 -->
  10. <exclusions>
  11. <exclusion>
  12. <artifactId>spring</artifactId>
  13. <groupId>org.springframework</groupId>
  14. </exclusion>
  15. </exclusions>
  16. <version>2.6.0</version>
  17. </dependency>
  18. <!-- 【end dubbo】 -->
  19. <!-- 【begin REST开发】-->
  20. <dependency>
  21. <groupId>org.javassist</groupId>
  22. <artifactId>javassist</artifactId>
  23. <version>3.18.1-GA</version>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.jboss.resteasy</groupId>
  27. <artifactId>resteasy-jaxrs</artifactId>
  28. <version>3.0.7.Final</version>
  29. </dependency>
  30. <dependency>
  31. <groupId>org.jboss.resteasy</groupId>
  32. <artifactId>resteasy-client</artifactId>
  33. <version>3.0.7.Final</version>
  34. </dependency>
  35. <dependency>
  36. <groupId>javax.validation</groupId>
  37. <artifactId>validation-api</artifactId>
  38. <version>1.0.0.GA</version>
  39. </dependency>
  40. <!-- 【end REST开发】-->
  41. <!-- 【begin tomcat】 -->
  42. <dependency>
  43. <groupId>org.apache.tomcat.embed</groupId>
  44. <artifactId>tomcat-embed-core</artifactId>
  45. <version>8.0.11</version>
  46. </dependency>
  47. <dependency>
  48. <groupId>org.apache.tomcat.embed</groupId>
  49. <artifactId>tomcat-embed-logging-juli</artifactId>
  50. <version>8.0.11</version>
  51. </dependency>
  52. <!-- 【end tomcat】-->
  53. <!-- 【begin zookeeper】 -->
  54. <dependency>
  55. <groupId>org.apache.zookeeper</groupId>
  56. <artifactId>zookeeper</artifactId>
  57. <!-- 忽略这个包的导入,因为可能会报错 -->
  58. <exclusions>
  59. <exclusion>
  60. <groupId>org.slf4j</groupId>
  61. <artifactId>slf4j-api</artifactId>
  62. </exclusion>
  63. </exclusions>
  64. <version>${zookeeper.version}</version>
  65. </dependency>
  66. <dependency>
  67. <groupId>com.github.sgroschupf</groupId>
  68. <artifactId>zkclient</artifactId>
  69. <version>0.1</version>
  70. </dependency>
  71. <!-- 【end zookeeper】 -->
  72. <!-- 【begin 日志类】:不能缺少,会报错 -->
  73. <dependency>
  74. <groupId>org.slf4j</groupId>
  75. <artifactId>slf4j-log4j12</artifactId>
  76. <version>1.6.2</version>
  77. </dependency>
  78. <dependency>
  79. <groupId>log4j</groupId>
  80. <artifactId>log4j</artifactId>
  81. <version>1.2.16</version>
  82. </dependency>
  83. <!-- 【end 日志类】-->
  84. <!-- 【begin REST序列化】 -->
  85. <dependency>
  86. <groupId>org.jboss.resteasy</groupId>
  87. <artifactId>resteasy-jackson-provider</artifactId>
  88. <version>3.0.7.Final</version>
  89. </dependency>
  90. <dependency>
  91. <groupId>org.jboss.resteasy</groupId>
  92. <artifactId>resteasy-jaxb-provider</artifactId>
  93. <version>3.0.7.Final</version>
  94. </dependency>
  95. <!-- 【end REST序列化】-->
  96. </dependencies>

Dubbo/Spring 配置文件 provider-context.xml(文件命名能表达意思即可):

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
  3. <!-- 本应用的名称,唯一 -->
  4. <dubbo:application name="demo-provider"/>
  5. <!-- 注册到zookeeper -->
  6. <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
  7. <!-- 暴露请求的端口,注意外部容器需要指定server为servlet,外部容器可以使用Tomcat。 <dubbo:protocol contextpath> 可以理解为请求路径前缀,如xxx表示localhost:9001/xxx/ -->
  8. <dubbo:protocol name="rest" port="9001" threads="500" server="servlet" accepts="500" contextpath=""/>
  9. <!-- 开启注解扫描,解析包路径下的注解,在这里是@Service,可以直接将对应的类作为服务发布出去。 也可以选择在本文件配置bean,不开启注解扫描,等价于下面的两个配置 -->
  10. <dubbo:annotation package="org.xujiale.dubbodemo.service"/>
  11. <!--<bean id="systemService" class="org.xujiale.dubbodemo.service.SystemServiceImpl"/>-->
  12. <!--<dubbo:service interface="org.xujiale.dubbodemo.api.SystemService" ref="systemService"/>-->
  13. </beans>

web 项目的 web.xml 配置文件:

  1. <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" >
  2. <web-app>
  3. <!-- 配置文件的路径 -->
  4. <context-param>
  5. <param-name>contextConfigLocation</param-name>
  6. <!-- 官方的demo中这个路径类似/WEB-INF/classes/xxx,其实和这个是等价的,只不过是build之后, 打开target文件夹就能找到对应的目录结构,编辑时IDE可能会报找不到文件,但运行时不会出错 -->
  7. <param-value>classpath:provider-context.xml</param-value>
  8. </context-param>
  9. <!-- dubbo的监听器,需要定义在其他监听器之前 -->
  10. <listener>
  11. <listener-class>com.alibaba.dubbo.remoting.http.servlet.BootstrapListener</listener-class>
  12. </listener>
  13. <!-- spring的监听器 -->
  14. <listener>
  15. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  16. </listener>
  17. <servlet>
  18. <servlet-name>dispatcher</servlet-name>
  19. <servlet-class>com.alibaba.dubbo.remoting.http.servlet.DispatcherServlet</servlet-class>
  20. <load-on-startup>1</load-on-startup>
  21. </servlet>
  22. <!-- 接收(拦截)所有请求路径 -->
  23. <servlet-mapping>
  24. <servlet-name>dispatcher</servlet-name>
  25. <url-pattern>/*</url-pattern>
  26. </servlet-mapping>
  27. </web-app>

这里再给出 IDEA 配置的 Tomcat:
在这里插入图片描述

(二)服务类代码

这里给出接口和实现,具体可以看 demo 的代码:

  1. package org.xujiale.dubbodemo.api;
  2. import org.xujiale.dubbodemo.bean.Response;
  3. public interface SystemService {
  4. Response getServerIpList();
  5. }
  6. package org.xujiale.dubbodemo.service;
  7. import com.alibaba.dubbo.config.annotation.Service;
  8. import com.alibaba.dubbo.rpc.protocol.rest.support.ContentType;
  9. import org.xujiale.dubbodemo.api.SystemService;
  10. import org.xujiale.dubbodemo.bean.Response;
  11. // 注意引入下面的包,参考pom文件,下面这几个注解和dubbo没有关系,不需要开启包扫描
  12. import javax.ws.rs.Consumes;
  13. import javax.ws.rs.GET;
  14. import javax.ws.rs.Path;
  15. import javax.ws.rs.Produces;
  16. import javax.ws.rs.core.MediaType;
  17. @Path("system")
  18. @Service // 只有这个是dubbo的注解,需要开启包扫描
  19. @Consumes({ MediaType.APPLICATION_JSON, MediaType.TEXT_XML}) // 接受参数的序列化模式
  20. @Produces({ ContentType.APPLICATION_JSON_UTF_8, ContentType.TEXT_XML_UTF_8}) // 返回的序列化模式,支持json和xml,utf-8编码
  21. public class SystemServiceImpl implements SystemService {
  22. @GET
  23. @Path("serverIpList")
  24. public Response getServerIpList() {
  25. return new Response("succeed", "本地地址:127.0.0.1");
  26. }
  27. }

(三)运行结果

默认 json 格式返回:
在这里插入图片描述
指定 xml 格式:
在这里插入图片描述


REST 开发本身并不复杂,Dubbo 支持得很好,相对来说开发环境的搭建反而比较复杂,特别是对初学者来说,希望这篇文章能帮到各位,Github上的项目注释很仔细,大家不妨本地试着运行一下。

如果要更了解 REST 开发或者 Dubbo 的话,建议大家去官方网站学习。网上知识太零散,学习这种大框架特别容易出问题。

  • Dubbo 官方开发文档
  • 在Dubbo中开发REST风格的远程调用(RESTful Remoting)

发表评论

表情:
评论列表 (有 0 条评论,529人围观)

还没有评论,来说两句吧...

相关阅读