dubbox REST服务使用fastjson替换jackson

上一节讲解了resteasy如何使用fastjson来替换默认的jackson,虽然dubbox内部采用的就是resteasy,但是大多数情况下,dubbox服务是一个独立的app,并不需要以war包形式部署在外置容器中,也就没有web.xml。好在dubbox扩展性不错,很容易扩展,有此类需求的可以参考下面的做法:

 

一、rest协议指定fastjson做为序列化

 <dubbo:protocol name="rest" port="8080"  server="tomcat" contextpath="/" serialization="fastjson" charset="GBK"/>

注意这里的:serialization="fastjson" charset="GBK" 这里指定了采用fastjson作为json序列化的框架,同时字符编码格式为GBK。

 

二、修改BaseRestServer源码

dubbo采用了"URL总线"设计思想,所有服务的信息,最终都拼成一个URL注册到zk中, com.alibaba.dubbo.rpc.protocol.rest.BaseRestServer的start方法里,可以拿到这些URL的信息,参考以下代码:

public void start(URL url) {
        getDeployment().getMediaTypeMappings().put("json", "application/json");
        getDeployment().getMediaTypeMappings().put("xml", "text/xml");
        getDeployment().getProviderClasses().add(RpcContextFilter.class.getName());

        //增加对serialization、charset的解析 杨俊明 2017-04-26
        String serialization = url.getParameter("serialization");
        if (StringUtils.isNotEmpty(serialization)) {
            String charset = url.getParameter("charset", "UTF-8");
            if (serialization.equals("fastjson")) {
                getDeployment().setRegisterBuiltin(false);
                getDeployment().getScannedProviderClasses().clear();
                FastJsonConfig fastJsonConfig = new FastJsonConfig();
                fastJsonConfig.setSerializerFeatures(SerializerFeature.DisableCircularReferenceDetect);
                fastJsonConfig.setCharset(Charset.forName(charset));
                FastJsonProvider jsonProvider = new FastJsonProvider();
                jsonProvider.setCharset(Charset.forName(charset));
                jsonProvider.setFastJsonConfig(fastJsonConfig);
                ResteasyProviderFactory.getInstance().register(jsonProvider);
                getDeployment().setProviderFactory(ResteasyProviderFactory.getInstance());
            }
        }

        getDeployment().getProviderClasses().add(RpcExceptionMapper.class.getName());
        loadProviders(url.getParameter(Constants.EXTENSION_KEY, ""));
        doStart(url);
    }

上述代码7-22行,解释下,如果URL里指定了serialization而且是fastjson,就把默认的其它已经扫描到的provider清空,同时注册一个FastJsonProvider。为了满足各种编码格式的要求,对charset也一并做了解析,并传递到FastJsonConfig中。  

注:上述代码已经提交到github的个人dubbox分支,需要的朋友们直接down最新源码即可。

 

三、405 Method Not Allowed 等状态码的处理

上一节的处理方式类似,自己扩展一个ExceptionHandler即可,然后在dubbox中参考以下配置:

<dubbo:protocol name="rest" ...
extension="xxx.xxx.NotAllowedExceptionHandler,xxx.xxx.NotSupportedExceptionHandler" serialization="fastjson"
/>

extension这里可以随意扩展,多个扩展之间用英文逗号分隔即可,读取extensions的源代码见com.alibaba.dubbo.rpc.protocol.rest.BaseRestServer#loadProviders

    protected void loadProviders(String value) {
        for (String clazz : Constants.COMMA_SPLIT_PATTERN.split(value)) {
            if (!StringUtils.isEmpty(clazz)) {
                getDeployment().getProviderClasses().add(clazz.trim());
            }
        }
    }
时间: 2024-10-26 21:57:28

dubbox REST服务使用fastjson替换jackson的相关文章

spring cloud 学习(11) - 用fastson替换jackson及用gb2312码输出

前几天遇到一个需求,因为要兼容旧项目的编码格式,需要spring-cloud的rest接口,输出gb2312编码,本以为是一个很容易的事情,比如下面这样: @RequestMapping(method = RequestMethod.POST, value = "syncPaymentList", consumes = {"application/json; charset=gb2312"}, produces = {"application/json;

基于资源编排在专有网络环境下快速部署高可用的Dubbox服务(ZooKeeper版)

本文将介绍在专有网络VPC(Virtual Private Cloud)下,基于资源编排服务,快速部署高可用的Dubbox服务的过程.Dubbox服务采用的注册中心是ZooKeeper集群.做这件事情的意义在于:节约部署Dubbox的时间,降低部署Dubbox过程中出错的风险. ROS阿里云资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务.用户通过模板描述多个云计算资源的依赖关系.配置等,并自动完成所有资源的创建和配置,以达到自动化部署.运维

DockOne微信分享(六十九):微服务选型之Modern Node.js

本文讲的是DockOne微信分享(六十九):微服务选型之Modern Node.js[编者的话]目前Node.js的发展非常快,大家可能还停留在:Node.js性能很好,Node.js里都是回调,写起来很恶心,Node.js只能做前端工具,Node.js是单线程部署会有问题,以及这样的八卦<uber用go替代Node.js重写了地理位置服务>... 可是真相呢? 在微服务盛行的今天,为什么我们要选用Node.js去构建微服务呢?本次分享将试图从以下2个方面给出答案: 被误解的Node.js:除

WF从入门到精通(第十九章):把工作流发布为Web服务

学习完本章,你将掌握: 1.了解要把你的工作流暴露为XML Web服务来使用的话,各个工作流活动该怎样进行设计 2.了解在ASP.NET中宿主工作流需要些什么 3.看看在基于XML Web服务的工作流中如何进行错误(fault)处理 4.针对各种情况对你的基于XML Web服务的工作流进行配置 在前一章"在你的工作流中调用Web服务"中,你看到了如何从你客户端一侧的工作流中使用WF所提供的InvokeWebService活动来调用XML Web服务.但是,在那章的应用程序范例中的XML

详解在Linux系统中如何管理systemd服务

  (1) 什么是单元 在RHEL7之前,服务管理是分布式的被SysV init或UpStart通过/etc/rc.d/init.d下的脚本管理.这些脚本是经典的Bash脚本,允许管理员控制服务的状态.在RHEL7中,这些脚本被服务单元文件替换. 在systemd中,服务.挂载等资源统一被称为单元,所以systemd中有许多单元类型,服务单元文件的扩展名是.service,同脚本的功能相似.例如有查看.启动.停止.重启.启用或者禁止服务的参数. systemd单元文件放置位置: /usr/lib

简述 Microservices(微服务)

自 2014 年始,Microservices(微服务)一词越来越火爆,不谈 Microservices 彷佛就 out 了.那么什么是 Microservices?Microservices 架构与传统的架构有什么区别?何时应该采用 Microservices?如何构建 Microservices? 本文,就针对上述提到的问题,来简单介绍下 Microservices. 什么是 Microservices 微服务的诞生并非偶然: 领域驱动设计指导我们如何分析并模型化复杂的业务:敏捷方法论帮助我

resteasy经验谈

resteasy 是java体系中比较成熟的rest框架,也是jax-rs规范的实现之一,dubbox的REST服务框架,就是采用的resteasy实现,近日在实际项目中遇到了几个问题,记录于此:   一.如何用fastjson替换默认的jackson   默认情况下,resteasy使用jackson和jaxb来实现json及xml格式的序列化.应用启动时,会自动扫描带@Provider的包,找到最合适的provider.fastjson也提供了jax-rs的Provider实现,如果希望使用

spring boot跨域处理

使用spring boot开发web应用时,有时会需要对跨域访问进行处理.本文包含了服务端跨域和客户端跨域的处理,对于json数据的处理包含了fastjson和jackson两种方式 一. 客户端跨域 对于客户端跨域,原理这里就不做详解,大家熟知的应该是jquery jsonp请求.这种方式会在请求的url上增加一个callback参数(表示请求返回后的回调js函数,参数名可以配置),服务端返回的数据实际是一段js,而js的内容就是执行这个回调js函数,服务端返回的数据就是这个回调js函数的参数

Android 使用android-support-multidex解决Dex超出方法数的限制问题

   随着应用不断迭代,业务线的扩展,应用越来越大(比如集成了各种第三方sdk或者公共支持的jar包,项目耦合性高,重复作用的类越来越多),相信很多人都遇到过如下的错误: [java] view plaincopy UNEXPECTED TOP-LEVEL EXCEPTION:   java.lang.IllegalArgumentException: method ID not in [0, 0xffff]: 65536   at com.android.dx.merge.DexMerger$