WebService是一个SOA(面向服务的编程)的架构,它是不依赖于语言,不依赖于平台,可以实现不同的语言间的相互调用,通过Internet进行基于Http协议的网络应用间的交互。 其实WebService并不是什么神秘的东西,它就是一个可以远程调用的类,或者说是组件,把你本地的功能开放出去共别人调用。
为什么使用WebService?
简单解释一下WebService,比如你的项目需要查询某银行账户余额。你能直接查吗,肯定不行,因为数据库是银行的,他不可能给你权限。你想访问他的数据库获取数据,这就需要用到WebService。通过调用银行暴露的接口来得到你想要的数据。
适用场景:
软件的集成和复用,如气象局(服务端系统)、天气查询网站等。
- 发布一个服务(对内/对外),不考虑客户端类型,不考虑性能,建议WebService
- 服务端已经确定使用webservice,客户端不能选择,必须使用WebService
软件集成:通过远程调用技术,将两个系统整合到一起,从而实现软件集成。
软件复用:同一个款软件的多次集成,最终实现复用。
不适用场景:
- 考虑性能时不建议使用WebService
- 同构程序下不建议使用WebService
Axis2与CXF的区别
目前java开发WebService的框架主要包括Axis2和CXF,如果你需要多语言的支持,你应该选择Axis2。如果你需要把你的实现侧重java并希望和Spring集成,CXF就是更好的选择,特别是把你的WebService嵌入其他的程序中。
区别 | Axis2 | CXF |
---|---|---|
简述 | WebService引擎 | 简易的SOA框架,可以作为ESB |
spring集成 | 不支持 | 支持 |
应用集成 | 困难 | 简单 |
是否跨语言 | 是 | 否 |
部署方式 | web应用 | 嵌入式 |
服务的管控和治理 | 支持 | 不支持 |
SpringBoot使用CXF集成WebService
1.向pom.xml中添加集成WebService的相关依赖
org.springframework.boot spring-boot-starter-web-services org.apache.cxf cxf-rt-frontend-jaxws 3.1.6 org.apache.cxf cxf-rt-transports-http 3.1.6
2.创建服务端接口
package com.primeton.mq.service; import javax.jws.WebService; @WebService(name = "DemoService", // 暴露服务名称 targetNamespace = "http://service.mq.primeton.com"// 命名空间,一般是接口的包名倒序 ) public interface DemoService { public String sayHello(String user); }
3.创建服务端接口实现类
package com.primeton.mq.service.impl; import com.primeton.mq.service.DemoService; import javax.jws.WebService; import java.util.Date; @WebService(serviceName = "DemoService", // 与接口中指定的name一致 targetNamespace = "http://service.mq.primeton.com", // 与接口中的命名空间一致,一般是接口的包名倒 endpointInterface = "com.primeton.mq.service.DemoService"// 接口地址 ) public class DemoServiceImpl implements DemoService { @Override public String sayHello(String user) { return user+",现在时间:"+"("+new Date()+")"; } }
4.创建CXF配置类
package com.primeton.mq.webServiceConfig; import com.primeton.mq.service.DemoService; import com.primeton.mq.service.impl.DemoServiceImpl; import org.apache.cxf.Bus; import org.apache.cxf.bus.spring.SpringBus; import org.apache.cxf.jaxws.EndpointImpl; import org.apache.cxf.transport.servlet.CXFServlet; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.xml.ws.Endpoint; @Configuration public class CxfConfig { @Bean public ServletRegistrationBean dispatcherServlet() { return new ServletRegistrationBean(new CXFServlet(),"/demo/*"); } @Bean(name = Bus.DEFAULT_BUS_ID) public SpringBus springBus() { return new SpringBus(); public DemoService demoService() { return new DemoServiceImpl(); public Endpoint endpoint() { EndpointImpl endpoint = new EndpointImpl(springBus(), demoService()); endpoint.publish("/api"); return endpoint; }
5.启动SpringBoot服务
输入http://localhost:8090/demo/api?wsdl即可,注意我设置的端口是8090,视情况而定。
6.创建客户端
在idea中进入File > New Project…菜单打开新建项目窗口,依次选择Java、WebServices,Version项选择Apache Axis,Libraries项选择 Download。然后点击Next按钮进入下一页。
在下一页中输入项目名称,然后点击Finish
按钮开始下载依赖包。依赖包下载完成后进入新建的项目。
选WebServices > Generate Wsdl From Java Code,生成wsdl
然后选择服务地址
确定之后,创建一个测试类,代码如下:
package test; import example.DemoServiceImplService; public class demo { public static void main(String[] args) { DemoServiceImplService webServiceImpl = new DemoServiceImplService(); String result = webServiceImpl.getDemoServiceImplPort().sayHello("没有说"); System.out.println("==========================================="); System.out.println(result); } }
注意:实现WebService客户端不一定要生成客户端的代码,可以通过地址动态调用。
package com.primeton.mq.test; import com.primeton.mq.service.DemoService; import org.apache.cxf.endpoint.Client; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory; import org.apache.cxf.transport.http.HTTPConduit; import org.apache.cxf.transports.http.configuration.HTTPClientPolicy; public class demo { public static void main(String[] args) { //创建动态客户端 JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory.newInstance(); Client client = factory.createClient("http://localhost:8090/demo/api?wsdl"); // 需要密码的情况需要加上用户名和密码 //client.getOutInterceptors().add(new ClientLoginInterceptor(USER_NAME,PASS_WORD)); HTTPConduit conduit = (HTTPConduit) client.getConduit(); HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy(); httpClientPolicy.setConnectionTimeout(2000); //连接超时 httpClientPolicy.setAllowChunking(false); //取消块编码 httpClientPolicy.setReceiveTimeout(120000); //响应超时 conduit.setClient(httpClientPolicy); //client.getOutInterceptors().addAll(interceptors);//设置拦截器 try{ Object[] objects = new Object[0]; // invoke("方法名",参数1,参数2,参数3....); objects = client.invoke("sayHello", "sujin"); System.out.println("返回数据:" + objects[0]); }catch (Exception e){ e.printStackTrace(); } }
到此这篇关于SpringBoot整合WebService服务的文章就介绍到这了,更多相关SpringBoot整合WebService服务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!