背景
在开发过程中,dubbo接口自测时,通过控制台的invoke方式调用dubbo服务不方便,主要体现在入参设置和入参保存上(invoke方式调用dubbo服务请参考:命令行中调用dubbo服务及入参写法_Ypc_victor的专栏-CSDN博客)。postman对发送rest请求支持的很好,可以方便的设置和保存各种入参,因此考虑是否可以通过rest方式调用dubbo。得知dubbox提供了rest调用方式,想着如果可以通过简单的注解实现,便能够提升开发效率。
操作步骤
1、引入POM
<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo</artifactId><version>2.8.4</version>
</dependency>
<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-dependencies-zookeeper</artifactId><version>2.8.4</version>
</dependency>
<dependency><groupId>org.jboss.resteasy</groupId><artifactId>resteasy-jaxrs</artifactId><version>3.0.7.Final</version>
</dependency>
<dependency><groupId>org.jboss.resteasy</groupId><artifactId>resteasy-client</artifactId><version>3.0.7.Final</version>
</dependency>
<dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>1.0.0.GA</version>
</dependency><!-- 如果要使用json序列化 -->
<dependency><groupId>org.jboss.resteasy</groupId><artifactId>resteasy-jackson-provider</artifactId><version>3.0.7.Final</version>
</dependency>
2、添加注解
前提:该服务可以通过dubbo方式正常调用。只需添加@Path @POST @Consumes等注解即可。
@Service("riskMonitorDispatchService")
@Path("monitor")
public class RiskMonitorDispatchServiceImpl implements RiskMonitorDispatchService {@Override@POST@Path("dispatch")@Consumes({MediaType.APPLICATION_JSON})@Produces({MediaType.APPLICATION_JSON})public ResultDTO<String> dispatch(DispatchDTO dispatchDTO) {ResultDTO<String> resultDTO = new ResultDTO<>();if ("rest".equals(dispatchDTO.getTaskCode())) {resultDTO.setCode(ResultDTO.SUCCESS);resultDTO.setMsg("resut success");return resultDTO;}}
}
3、在dubbo配置文件dubbo.xml中添加rest配置
<!-- 用rest协议在8080端口暴露服务 -->
<dubbo:protocol name="rest" port="6666"/>
4、调用
遇到的问题
1、jar包冲突问题
报错,java.lang.NoSuchMethodError,排查后发现是pom依赖冲突导致。这个冲突比较隐蔽,通过Dependency Analyzer插件并没有发现问题。这个冲突不是jar包版本不一致导致的,而是由于不同jar用了相同的Interface导致。(传统冲突原理和解决办法参考:Notion – The all-in-one workspace for your notes, tasks, wikis, and databases.)
具体的问题是eureka里面的jsr311-api导致,只需exclude即可。
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId><exclusions><exclusion><groupId>javax.ws.rs</groupId><artifactId>jsr311-api</artifactId></exclusion></exclusions>
</dependency>
2、postman使用问题
请求入参为bean时,使用postman发送post请求,尝试了几种格式,只有JSON格式能够正确识别。form-data、x-www-form-urlencoded都无法正确识别。参考下图方式:

参考
1、当当官方说明:
rest
http://dangdangdotcom.github.io/dubbox/rest.html
2、Dubbox源码:
https://github.com/dangdangdotcom/dubbox
https://github.com/dangdangdotcom/dubbox
3、java.lang.NoSuchFieldError: SERVER_SENT_EVENTS_TYPE:
Resteasy 3.5.0.App Engine标准环境最终版-NoSuchFieldError SERVER_SENT_EVENTS_TYPE - IT屋-程序员软件开发技术分享社区Resteasy 3.5.0.Final on App Engine standard env - NoSuchFieldError SERVER_SENT_EVENTS_TYPE(Resteasy 3.5.0.App Engine标准环境最终版-NoSuchFieldError SERVER_SENT_EVENTS_TYPE) - IT屋-程序员软件开发技术分享社区https://www.it1352.com/2104019.html
4、NoClassDefFoundError: org/mortbay/log/StdErrLog:
dubbo框架中NoClassDefFoundError: org/mortbay/log/StdErrLog报错原因_s912683912的博客-CSDN博客2019-03-28 15:48:37.149 [main] ERROR org.springframework.boot.SpringApplication - Application run failedjava.lang.NoClassDefFoundError: org/mortbay/log/StdErrLog at com.alibaba.dubbo.remoting.htt...https://blog.csdn.net/s912683912/article/details/88870805
5、java.lang.NoSuchMethodError: javax.ws.rs.core.HttpHeaders.getHeaderString(Ljava/lang/String;)Ljava/lang/String:
http://www.blackzs.com/archives/1660http://www.blackzs.com/archives/1660
http://www.blackzs.com/archives/1660
6、Bad arguments passed to org.jboss.resteasy.spi.metadata.ResourceMethod:
https://blog.csdn.net/john1337/article/details/79130986/https://blog.csdn.net/john1337/article/details/79130986/
https://blog.csdn.net/john1337/article/details/79130986/









