SpringBoot使用webservice

webservice介绍

WebService是帮助多个应用程序与平台和编程语言之间以独立的方式互相通信的标准化技术。它是利用标准 XML messaging(主要 SOAP) 技术,可以访问网络上的其他计算机的记述多种操作的软件接口。此接口主要由 WSDL (WebService Description Language)记述,可以处理多种多样的系统运作。

构成技术:SOAP & WSDL

SOAP(Simple Object Access Protocol)

SOAP基于 HTTP或 SMTP等多种网络标准规约,它是向网络上的其他计算机传送 XML文档而定义标准Package结构的通信规约。

WSDL (WebServices Description Language)

WSDL是记述WebService的接口的基于XML的标准WebService技术语言。

为什么要使用webservice

1)WebService基于HTTP,我们不需要自己去实现收发数据,这是相比Socket的优点 。

2)HTTP只能传输字符串类型,需要我们自己解析,而WebService支持复杂的数据类型。

3)传统客户端调用服务器的方法的过程是,发送,接收,解析消息,触发方法,而WebService类似于RPC,不需要我们关心如何发送接收和解析数据,能够像调用本地方法那样调用远程方法。

4)WebService使用标准的Web协议 -- XML,HTTP和TCP/IP,相对易用和通用。

5)soap请求是HTTP POST的一个专用版本,遵循一种特殊的xml消息格式Content-type设置为: text/xml,任何数据都可以xml化。

webservice的缺点

1)不适合相互调用,仅能让客户端调用服务端API,类似于单工通信。

2)相当于HTTP+XML解析,所以会比HTTP还慢,不适合需要高效通信的场景

3)WebService会降低程序的性能,一台机器或一个局域网里面运行的同构应用程序就不应该用WebService进行通信

webservice开发的注意事项

1)服务接口的粒度要合适

2)接口的返回值应该是简单的语言无关的

3)webservice的API不能抛出异常。对Web Service 中的任何异常都应该进行相应的处理。

4)在设计分布式应用时,出于性能和可伸缩性的考虑,应当保证客户端和服务器端之间的调用尽可能地少。减少网络调用不仅有利于减少通信开销(如果只用 1 个 SOAP 消息可以达到目标,就绝对不要发3个消息),降低网络流量,而且提高了应用的性能。

webservice的适用/不适用场景

1)跨防火墙通信

2)应用程序集成:将不同语言写成的在不同平台上运行的各种程序集成起来。

3)软件重用

4)对内的接口不要使用webservice

SpringBoot使用webservice

服务端发布服务

引入相关依赖

<!--webservice start-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web-services</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-spring-boot-starter-jaxws</artifactId>
    <version>3.4.3</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-transports-http-jetty</artifactId>
    <version>3.4.3</version>
</dependency>
<!--webservice end-->

服务接口和服务实现

public interface HelloService {
    String sayHello(String name);
}

服务接口实现

@Service
public class HelloServiceServiceImpl implements HelloService {

    @Override
    public String sayHello(String name) {
        return "service=> Good morning : " + name;
    }
}

webservice的接口和实现

import javax.jws.WebMethod;
import javax.jws.WebService;

@WebService(
    name = "GreetWebService", // 暴露服务名称
    targetNamespace = "http://ws.demo.harvey.com"// 命名空间,一般是接口的包名倒序
)
public interface GreetWebService {

    //@WebResult(name = "String", targetNamespace = "")
    //@WebMethod
    //String greeting(@WebParam(name = "name") String name);

    //exclude声明该方法不发布
    //@WebMethod(exclude = true)
    //String greeting(String name);

    @WebMethod
    String greeting(String name);
}

webservice接口实现

@Service
@WebService(serviceName = "GreetWebService", // 与接口中指定的name一致, 都可以不写
        targetNamespace = "http://ws.demo.harvey.com", // 与接口中的命名空间一致,一般是接口的包名倒,都可以不用写
        endpointInterface = "com.harvey.demo.ws.GreetWebService" // 接口类全路径
)
public class GreetWebServiceImpl implements GreetWebService {

    @Autowired
    private HelloService helloService;

    @Override
    public String greeting(String name) {
        System.out.println("服务被调用 参数:" + name);
        return helloService.sayHello(name);
    }
}

webservice的配置类

发布服务。

@Configuration
public class CxfConfig {

    @Autowired
    private GreetWebService greetWebService;

    @Autowired
    private Bus bus;

    /**
     * 发布服务
     * @return
     */
    @Bean
    public Endpoint userServiceEndpoint() {
        System.out.println("服务发布");
        //这里指定的端口不能跟应用的端口冲突, 单独指定
        String path = "http://127.0.0.1:9090/greet";

        EndpointImpl userEndpoint = new EndpointImpl(bus, greetWebService);
        userEndpoint.publish(path);

        System.out.println("服务成功,path: " + path);
        System.out.println(String.format("在线的wsdl:%s?wsdl", path));
        return userEndpoint;
    }
}

启动springboot工程后,浏览器访问这个链接 http://127.0.0.1:9090/greet?wsdl 就可以得到WSDL :

WSDL(Web Services Description Language),web服务描述语言,它是webservice服务端使用说明书,说明服务端接口、方法、参数和返回值,WSDL是随服务发布成功,自动生成,无需编写。

生成客户端代码

file ->new -> modules -> java/webservice client

注:记得选择自己的JDK。

点击"OK"后生成如下的客户端代码:

删除所有class文件。

客户端调用ws服务

public class HelloWorldClient {
    
    public static void main(String[] argv) {
        GreetWebService_Service greetWebServiceService = new GreetWebService_Service();
        GreetWebService webService = greetWebServiceService.getGreetWebServiceImplPort();
        String result = webService.greeting("张三");
        System.out.println("result = " + result);
    }
}

输入日志:

 

posted @ 2022-04-27 11:50  残城碎梦  阅读(13262)  评论(2编辑  收藏  举报