是否有可能在java 9发布之前编写基于SOAP的WebService和通过HTTP2进行通信的客户端?
如果是,我该如何处理这项任务?
背景。最近,我阅读并观看了一些关于HTTP2的很酷的东西。
文章: HTTP/2: A jump-start for Java developers
书籍章节: High Performance Browser Networking
视频:
unRESTful Web Services with HTTP2 by Fabian Stäber
Simone Bordet - HTTP 2.0 & Java: Current Status
简而言之,HTTP / 2更有效,解决了HTTP / 1.1的问题,并且对Web应用程序是透明的(简化了它在线上的不同消息表示)。
使用RESTful Web服务时,您似乎可以轻松切换到HTTP2。 您在服务器端需要做的就是在Jetty(或其他支持HTTP2的容器)上部署应用程序。
在客户端使用特殊的Jetty HttpClient:
// Standard HTTP/1.1 client
new HttpClient();
// HTTP/2 transport client
new HttpClient(new HttpClientTransportOverHTTP2());
你可以通过HTTP2进行交流。
另一方面,基于SOAP的Web服务非常不同(它们基于JAX-WS API)。 您可以像这样定义服务器端端点:
@WebService
public class HelloWorld {
public String hello(String name) {
return "Hello " + name;
}
}
使用java wsgen生成一些代码,并按照以下方式运行:
public class RunService {
public static void main(String[] args) {
Endpoint.publish("http://localhost:8080/wsServerExample", new HelloWorld());
}
}
对于客户端,当您从WSDL(使用java wsimport)生成代码时,您可以像这样调用此服务:
public class WsClient {
public static void main(String args[]) {
HelloWorldService shs = new HelloWorldService();
HelloWorld sh = shs.getHelloWorldPort();
((BindingProvider) sh).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://localhost:8080/wsServerExample");
System.out.println(sh.hello("bary"));
}
}
对于服务器,您可以通过更改属性com.sun.net.httpserver.HttpServerProvider来提供不同的HttpServer实现,例如:
System.setProperty("com.sun.net.httpserver.HttpServerProvider", "org.eclipse.jetty.http.spi.JettyHttpServerProvider");
但是这不会给你HTTP2传输(我是对的吗?)。
所以它找我,这个基于SOAP的Web服务的HTTP传输被埋没在Java API的内部,并且在java 9之前不能切换到HTTP2(或者至少我不知道如何做到这一点)?< / p>
我错过了什么吗?如果您有任何想法请求分享。
由于
答案 0 :(得分:0)
要使服务器端提供http / 2端点,您需要一台支持http / 2的服务器(jetty或者从2017年4月起支持它)。
此外,必须将服务器配置为提供https,即您必须添加ssl / tls-certificate。因此,您创建一个包含服务器证书的Java密钥库。
虽然http / 2不是必须的https工作,但大多数客户端都要求加密连接。此外,在使用jetty或者下载等服务器时,必须添加alpn-jar添加对alpn(应用层协议协商)的支持。
如果您使用Spring Boot和Undertow作为服务器,则可以这样配置:
@Bean
UndertowEmbeddedServletContainerFactory embeddedServletContainerFactory() {
UndertowEmbeddedServletContainerFactory factory = new UndertowEmbeddedServletContainerFactory();
factory.addBuilderCustomizers(
builder -> builder.setServerOption(UndertowOptions.ENABLE_HTTP2, true));
return factory;
}
这应该添加到你的application.properties:
server.port=8443
server.ssl.key-store=classpath:sample.jks
server.ssl.key-store-password=secret
server.ssl.key-password=password
启动服务器时,必须将ALPN-jar添加到引导类路径中:
-Xbootclasspath/p:/home/user_x/.m2/repository/org/mortbay/jetty/alpn/alpn-boot/8.1.8.v20160420/alpn-boot-8.1.8.v20160420.jar
您的http / 2客户端必须信任服务器的证书。如果您为服务器创建了自签名证书,则必须将其公钥添加到客户端的jvm信任存储中:
$ keytool -import -trustcacerts -keystore /opt/java/jre/lib/security/cacerts \
-storepass changeit -noprompt -alias mycert -file /tmp/examplecert.crt
这个答案的灵感来自这篇博文:https://vanwilgenburg.wordpress.com/2016/04/01/spring-boot-http2/