常用的RPC架构---WebService

webService在老项目中经常使用,包括现在有的银行,保险的项目中还在使用。WebService是一种跨平台的rpc技术协议。由SOAP,UDDI,WSDL组成。soap是一种使用xml进行数据编码的通信协议,独立于任何语言,简单可扩展,soap提供了一种标准方法使得不同机器上使用不同语言编写的程序可以相互通信。UDDI是一个独立于平台的框架。WSDL是使用XML编写的网络服务描述语言,用来描述WebService,以及如何访问WebService。

WebService有两种经典的实现方式:CXF,以及Axis2

CXF

Apache CXF是一个开源的WebService RPC框架。它有以下特点:

  • 支持WebService标准,包括soap规范,WSI Basic Profile,WSDL,WS-Addressing,WS-Policy等。
  • 支持JSR相关规范,包括JZX-WS,JAX-RS,SAAJ
  • 支持多种传输协议,协议绑定以及数据绑定。协议绑定:soap,rest/http,xml。数据绑定:JAXB 2.X,Apache XMLBeans 等。

Axis2

Axis2是Axis的后续版本,是新一代的soap引擎,是cxf之外另一个很经典的WebService的实现。它具备以下几个特点

  • 高性能。具有自己轻量级对象模型AXIOM,比Axis1的内存消耗耕地
  • 热部署。具备了在系统启动和运行时部署web服务和处理功能,也就是说,在不关闭服务的情况下可以将新服务添加到系统。
  • 支持异步服务。支持非阻塞客户端和传输的异步以及web服务和异步web服务调用。
  • WSDL支持。支持web服务描述语言版本1.1和2.0,它允许轻松构建存根以访问远程服务

spring boot集成cxf实现webservice

1)创建UserService

@WebService
public interface UserService {
    @WebMethod
    public String sayUserName(String username);
}

2)创建UserService实现类UserServiceImpl

// endpointInterface 接口地址 ; targetNamespace 命名空间 ,包名倒写。
@WebService(name = "user",endpointInterface = "com.webservice.server.UserService",targetNamespace = "http://server.webservice.com/")
public class UserServiceImpl implements UserService {
    @Override
    public String sayUserName(String username) {
        return "服务提供方发出:sayUserName:" + username;
    }
}

3)配置webService

@Configuration
public class CxfConfig {
    @Bean(name = Bus.DEFAULT_BUS_ID)
    public SpringBus springBus() {
        return new SpringBus();
    }

    //把实现类交给spring管理
    @Bean
    public UserService userService() {
        return new UserServiceImpl();
    }
    
    //终端路径
    @Bean
    public Endpoint endpoint() {
        EndpointImpl endpoint = new EndpointImpl(springBus(), userService());
        endpoint.publish("/user");
        return endpoint;
    }
}

4)编写application.yml

file

5)运行WebServiceApplication的main方法。用浏览器访问:http://localhost:8080/services/user?wsdl

file

出现以上效果证明,服务方配置成功

6)编写客户端调用:

public class WebServiceClient {
    public static void main(String[] args) {
        JaxWsDynamicClientFactory jaxWsDynamicClientFactory = JaxWsDynamicClientFactory.newInstance();
        Client client = jaxWsDynamicClientFactory.createClient("http://localhost:8080/services/user?wsdl");

        try {
            Object[] sobjects = client.invoke("sayUserName", "张三");
            System.out.println("返回数据:" + sobjects[0]);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

7),运行WebServiceClientmain方法,输出效果:

file

在集成的时候注意两个方面:
我的:

springboot版本 --> 2.1.7.RELEASE

cxf-spring-boot-starter-jaxws 版本 --> 3.3.1

注意在application.yml的配置:cxf.path: /services

以上就是webService的rpc实现方式。很简单,现在应该还有很多企业在用这种方式。

以上是我本人对的理解,如果有不对之处,证明本人学业不精,还望大家指正和谅解,提出宝贵意见。

你可能感兴趣的:(常用的RPC架构---WebService)