`
senvon
  • 浏览: 37227 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

替代CXF

 
阅读更多

开发那么多年,厌烦了CXF,但回头看看好像也没有比较好的框架和协议可以替代CXF

一方面,不是所有的公司都有能力搭建一套dubbo,也不是所有的功能都需要使用cxf的方式暴露

有时候就一个接口暴露,一个接口访问,要引入一个CXF整个包,我认为那是一种有病的行为

恶心CXF的地方主要有以下几点

1.重量级,CXF的引入会让一个应用增加至少10M的大小

2.CXF本身的版本不兼容.之前被CXF蹂躏过,2.3.x版本和2.4.x几2.5以后的版本都是相互不兼容

3.SOAP本身就不是一个标准协议,都是各种杂七杂八的协议拼凑而成,导致CXF依赖的jar包冲突严重

 

CXF流行的优点不能放弃

1.接口声明,接口调用,方便好用

所以,httpservice,继承CXF的优点,把底层协议从SOAP替换成HTTP+JSON

使用方式 maven引入 

<dependency> 
<groupId>com.9istock.base</groupId> 
<artifactId>http-service</artifactId> 
<version>1.0.0-SNAPSHOT</version> 
<scope>test</scope> 
</dependency>

 

spring的方式使用client

<bean name="messageService3" class="com.istock.base.httpService.client.HttpProxyFactoryCglib"> 
<property name="targetClass" value="com.ncf.sampleService.MessageService"></property> 
<property name="endPoint" value="http://localhost:8081/sampleService"></property> 
<property name="signKey" value="xxxxxxxxxxx"></property> 
<property name="systemCode" value="002"></property> 
<property name="needSign" value="true"></property> 
</bean>

 

在代码里面直接使用@autowaired自动装载接口实现 @Resource(name="messageService3") private MessageService messageService;

或者使用webClient的方式实现. MessageService messageService = HttpServiceClient.createClient(MessageService.class, "http://localhost:8081/sampleService", null, false, null, null, null);

接口的声明方式

@Path("message") 
public interface MessageService{
public int sendMessage(MessageInfo message);

@Consumes("application/json;charset=utf-8")
public int sendMessage2(MessageInfo message);

@Consumes("application/json;charset=utf-8")
public int sendMessage3(MessageInfo message,@QueryParam("name")String name);

public List<MessageInfo> queryMessage();

public int testList(@QueryParam("list") String[] list);
}

 

使用rest标准的annotation @Consumes用来标识request的参数组装类型,如果是json,requestBody整体的提交方式就会变成json格式 如果没有声明方式,默认使用post,接口参数会自动使用post方式提交.参数和参数出现重名,自己解决.

@QueryParam,如果在@Consumes里面,该参数将使用url的queryString提交

如果不在@Consumes里面,只是为了一个变量名.

实现部分不做干预,建议使用springMVC的方式包装 spring的MVC定义controller,可以实现一个接口.

@Controller @RequestMapping("message") 
public class MessageServiceExpose implements MessageService { 
@Override @RequestMapping("sendMessage") 
public @ResponseBody int sendMessage(MessageInfo message) { 
return 1; 
}
@Override
@RequestMapping("queryMessage")
public @ResponseBody List<MessageInfo> queryMessage() {
    List<MessageInfo> result = new ArrayList<MessageInfo>();
    MessageInfo m1 = new MessageInfo();
    m1.setContent("this is m1");
    m1.setId(1);
    m1.setReceiver("来点中文1");
    m1.setSender("就是要中文2");
    m1.setType(TypeEnum.SUCCESS);
    result.add(m1);

    MessageInfo m2 = new MessageInfo();
    m2.setContent("this is m2");
    m2.setId(2);
    m2.setReceiver("senvon s2");
    m2.setSender("senvon r2");
    m2.setType(TypeEnum.FAIL);
    result.add(m2);

    MessageInfo m3 = new MessageInfo();
    m3.setContent("this is m3");
    m3.setId(3);
    m3.setReceiver("senvon s3");
    m3.setSender("senvon r3");
    m3.setType(TypeEnum.SUCCESS);
    result.add(m3);

    MessageInfo m4 = new MessageInfo();
    m4.setContent("this is m4");
    m4.setId(4);
    m4.setReceiver("senvon s4");
    m4.setSender("senvon r4");
    m4.setType(TypeEnum.SUCCESS);
    result.add(m4);
    return result;
}

@Override
@RequestMapping("sendMessage2")
public @ResponseBody int sendMessage2(@RequestBody MessageInfo message) {
    System.out.println(message.getType());
    return 2;
}

@Override
@RequestMapping("sendMessage3")
public @ResponseBody int sendMessage3(@RequestBody MessageInfo message, @RequestParam String name) {
    // TODO Auto-generated method stub
    System.out.println("====================="+name);
    return 3;
}

@Override
@RequestMapping("testList")
public @ResponseBody int testList(String[] list) {
    System.out.println(ToStringBuilder.reflectionToString(list));
    return 1;
}
}

 POST请求

POST /sampleService/message/sendMessage.htm HTTP/1.1

Content-type: application/x-www-form-urlencoded;charset=UTF-8

Accept: application/json

Accept-Charset: utf-8

systemCode: 002

sign: A49A065D47D6688C16ADBD57DBE14AAE

Cache-Control: no-cache

Pragma: no-cache

User-Agent: Java/1.8.0_45

Host: localhost:8080

Connection: keep-alive

Content-Length: 53

 
不带@consumes的body
id=1&receiver=aaa&type=FAIL&sender=bbb&content=senvon
 
带@consumers的body
{"content":"senvon","id":1,"receiver":"aaa","sender":"bbb","type":"FAIL"}
 
具体的请参考源码
http-service源代码地址:https://github.com/senvon/http-service
http-service-example源代码地址:https://github.com/senvon/http-service-example

如果超过50个应用,效率要求比较高,强烈建议使用dubbo

 

分享到:
评论
1 楼 wjpiao 2015-07-22  
学习了,还是下代码来跑下看看!

相关推荐

    cxf与spring整合

    2. **配置简化**:Spring的XML配置文件可以替代CXF的XML配置,使得整体配置更加简洁。 3. **统一管理**:Spring容器可以统一管理CXF的bean,包括服务实现类、数据源、事务管理器等。 4. **测试友好**:利用Spring的...

    apache cxf_jar包

    虽然不常用,但在某些场景下,Aegis可以作为替代JAXB的数据绑定选项。 7. **cxf-rt-ws-policy-2.7.12.jar**: Web服务策略模块,支持WS-Policy规范,允许在Web服务中声明和验证服务行为和约束。 8. **cxf-rt-...

    cxf-2.7.18. jar及其依赖包

    描述中提到的“**可解决客户端调用提示source 1.5已过时问题**”是指在使用较早的Java源代码版本(如Java 1.5)编译或运行时,可能会遇到警告或错误,因为这些版本已经被Java的新版本所替代。CXF 2.7.18可能已经更新...

    cxf最少依赖jar包

    - 在构建CXF最少依赖包时,需要仔细分析其依赖关系,剔除不必要或可替代的库,确保仅保留最基础的功能。 - 使用工具如Maven或Gradle的依赖管理功能,可以自动解决和优化依赖树,找出最小集。 3. **JAX-WS和JAXB**...

    CXF support WAS Weblogic

    - 清除Oracle提供的JAX-WS库,使用CXF自带的相关库替代。 - **部署过程** - 根据所使用的应用服务器类型,按照特定指南部署CXF应用。 - 如果使用JBoss AS,则需要确保开启类加载隔离机制。 #### 常见问题解答 ...

    ssh服务端cxf相关jar包

    在描述中提到的服务端SSH框架中,CXF通常被用来替代Struts,以实现更灵活、高性能的Web服务。Spring MVC作为Spring的一部分,提供了一个轻量级的MVC框架,可以处理HTTP请求,并将这些请求转发给应用程序逻辑。 集成...

    采用(rest ,hession,cxf)几种技术实现webservice

    在本文中,我们将探讨三种常用的技术:REST、Hessian和CXF,它们都可以用来实现Web服务,尤其是当我们使用Maven作为构建工具时。 首先,REST(Representational State Transfer,表述性状态转移)是一种基于HTTP...

    apache-cxf-2.3.全部的包

    4. **数据绑定**:CXF支持多种数据绑定技术,如JAXB(Java Architecture for XML Binding)用于将XML文档映射到Java对象,以及 JiBX 和 Castor 作为替代方案。这些数据绑定技术简化了XML数据的处理。 5. **MTOM/XOP...

    cxf框架中的neethi.jar包

    这意味着在更新的Java环境中,可能需要寻找替代的策略处理库,或者使用`CXF`框架的特定版本来保持兼容性。 `Neethi-2.0.4`是该库的一个特定版本,它修复了之前版本的一些已知问题,并提供了与当时其他软件(如`CXF`...

    http-service:使用http&json访问界面

    http-serviceaccess the interface use http&json.开发那么多年,厌烦了CXF,但回头看看好像也没有比较好的框架和协议可以替代CXF一方面,不是所有的公司都有能力搭建一套dubbo,也不是所有的功能都需要使用cxf的方式...

    apache-cxf-2.5.1

    SOAP(简单对象访问协议)是Web服务中最常见的通信协议之一,而REST(表述性状态转移)则是一种轻量级的替代方案,通常用于更现代化的应用。 Apache CXF提供了一套全面的工具和服务,帮助开发者实现这些协议。例如...

    java webservice AXIS,XFire , CXF

    然而,随着技术的发展,AXIS逐渐被功能更强大、更现代的框架所替代。 XFire是另一个Java WebService框架,它强调易用性和与Spring框架的集成。XFire后来与CeltiXfire合并,演变成了现在的Apache CXF项目。 Apache ...

    apache-cxf-2.3.3.zip

    包括jar包、doc、sample 超越axis、替代XFire,轻松发布及使用WebService

    webservice,cxf

    在"CXF整合"部分,我们将学习如何利用CXF来替代JDK原生的Web服务实现,以获取更高级的功能和更好的性能。 当CXF与Spring框架整合时,可以实现更高效的依赖注入和管理,简化Web服务的配置和部署。"CXF+Spring整合...

    cxf-lazy-clients:更快地部署 CXF 客户端

    该库为 CXF 的 JAXRSClientFactoryBean 和 JaxWsProxyFactoryBean 提供了替代品。 两者都有一个额外的惰性参数,用于控制工厂是否创建代理的、未初始化的(惰性)客户端。 一个懒惰的客户端会延迟所有昂贵的初始化...

    spring dm cxf

    在OSGi环境下,模块化开发是其核心特性,Spring DM(现已被Spring OSGi替代)允许开发者将Spring应用分解为可独立部署的模块,每个模块都可以有自己的生命周期管理和依赖注入。这为开发人员提供了更高的灵活性和可...

    如何在MyEclipse和Eclipse下安装XFire插件CXF插件 WebService.pdf

    总结来说,虽然XFire已经被CXF所替代,但在某些场景下,了解如何在IDE中安装和配置这些插件仍然是必要的。通过以上步骤,开发者可以在MyEclipse和Eclipse中顺利地使用CXF或XFire进行Web服务的开发工作。记得保持软件...

    restdoc-cxf:用于RestDoc的Apache CXF实用程序

    【标题】"restdoc-cxf:用于...对于Apache CXF用户,转向Swagger等替代方案可以继续享受类似的功能和更广泛的社区支持。了解RESTful API的最佳实践、使用合适的工具进行文档和测试,是任何API开发者不可或缺的技能。

    webservice五种发布方式及客户端调用.pdf

    当CXF与某些环境不兼容时,Axis2是一个很好的替代方案。发布WebService的步骤与CXF类似,包括设置依赖、配置XML文件以及定义服务接口和实现。 **客户端调用WebService**: 无论使用CXF还是Axis2发布,客户端调用...

Global site tag (gtag.js) - Google Analytics