代码地址:https://github.com/huiyiwu/spring-boot-simple/spring-boot-webservice
WebService是一个SOA(面向服务的编程)的架构,它是不依赖于语言,不依赖于平台,可以实现不同的语言间的相互调用,通过Internet进行基于Http协议的网络应用间的交互。 其实WebService并不是什么神秘的东西,它就是一个可以远程调用的类,或者说是组件,把你本地的功能开放出去共别人调用。
文章目录
1. 概述
1.1. 使用场景
- 不考虑客户端类型和性能时发布服务,建议使用WebService
- 服务端已经确定使用WebService,客户端必须使用WebService
1. 软件集成
通过远程调用技术,将两个系统整合在一起,从而实现软件集成
2. 软件复用
同一款软件的多次集成,最终实现复用
1.2. 不适用场景
- 考虑性能时不建议使用:采用xml格式封装数据,在传输过程中,要传输额外的标签,随着soap协议的不断完善,标签越来越大,导致WebService性能下降
- 同构程序下不建议使用,比如Java使用RMI,不需要翻译成XML的数据
2. 原理
2.1. 角色
- 服务提供者,也叫服务生成者
- 服务请求者,也叫服务消费者
- 服务注册中心,也叫服务代理
2.2. 操作
- 发布:服务提供者把服务按照规范格式发布到服务注册中心
- 查找:服务请求者根据服务注册中心提供的规范接口发出查找请求,获取绑定服务所需的相关信息
- 绑定:服务请求者根据服务绑定信息对请求系统进行配置,从而可以调用服务提供者提供的服务
3. 实现
3.1. 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web-services</artifactId>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.1.6</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.1.6</version>
</dependency>
3.2. 服务端
3.2.1. 服务接口
HuchxService.java
/**
* Author: Huchx
* Date: 2021/3/1 15:48
*/
@WebService(name = "HuchxService",//服务名
targetNamespace = "http://webservice.huchx.com"//服务命名空间
)
public interface HuchxService {
public String sayHello(String name);
}
3.2.2. 服务实现
HuchxServiceImpl.java
/**
* Author: Huchx
* Date: 2021/3/1 15:51
*/
@WebService(
name = "HuchxService",//服务名,与接口类中一致
targetNamespace = "http://webservice.huchx.com",//命名空间
endpointInterface = "com.huchx.webservice.service.HuchxService"//接口类地址
)
public class HuchxServiceImpl implements HuchxService {
@Override
public String sayHello(String name) {
String formDate = "yyyy-MM-dd HH:mm:ss";
return "Hello World!"+ name+", Now is "+ new SimpleDateFormat(formDate).format(new Date());
}
}
3.2.3. CXF配置
CXFConfig.java
/**
* Author: Huchx
* Date: 2021/3/1 15:59
*/
@Configuration
public class CxfConfig {
//注入服务
@Bean
public HuchxService huchxService(){
return new HuchxServiceImpl();
}
@Bean(name = Bus.DEFAULT_BUS_ID)
public SpringBus springBus(){
return new SpringBus();
}
//使用ServletRegistrationBean以使Spring Boot支持Servlet功能
// 此处通过CXFServelet处理/huchx/路径下的所有请求
@Bean
public ServletRegistrationBean dispatcherServelet(){
return new ServletRegistrationBean(new CXFServlet(),"/huchx/*");
}
//通过端点发布WebService服务器
@Bean
public Endpoint endpoint(){
EndpointImpl endpoint =new EndpointImpl(springBus(),huchxService());
endpoint.publish("/service");
return endpoint;
}
}
3.2.4. 查看WebService服务信息
启动工程,在浏览器输入http://localhost:8080/huchx/service?wsdl
,其中huchx
、service
为CXFConfig文件中配置的路径。?wsdl
表示基于XML语言描述WebService服务信息,包括定义的方法、属性、binding协议部分、port端口以及服务URL
结果如图:
3.3. 客户端
代码地址:https://github.com/huiyiwu/spring-boot-simple/spring-boot-webservice-client
3.3.1. 添加依赖
新建Maven项目,添加依赖:
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-spring-boot-starter-jaxws</artifactId>
<version>3.2.5</version>
</dependency>
3.3.2. 调用代码
@RequestMapping("/webservice")
public String visitService(){
JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory.newInstance();
//此处地址为配置的WebService
地址
Client client = factory.createClient("http://localhost:8080/huchx/service?wsdl");
try {
Object[] objects = client.invoke("sayHello","huchx");
System.out.println("sayHello 返回结果:"+objects[0].toString());
return objects[0].toString();
} catch (Exception e) {
e.printStackTrace();
return "获取失败";
}
}
3.3.3. 测试
启动客户端,在浏览器中输入http://localhost:8081/huchx/webservice
,结果如图: