spark在服务器运行示例_创建示例HTTPS服务器以获取乐趣和收益

spark在服务器运行示例

通常,在开发或/和针对真实场景进行测试期间,我们(开发人员)面临着运行成熟的HTTPS服务器的需求,可能同时进行一些模拟。 在JVM平台上,除非您知道适合此工作的正确工具,否则它过去并不是一件容易的事。 在这篇文章中,我们将使用出色的Spray框架和Scala语言创建一个完全可操作的HTTPS服务器的框架。

首先,我们需要分别生成x509证书和私钥。 幸运的是,使用openssl命令行工具非常容易。

openssl req -x509 -sha256 -newkey rsa:2048 -keyout certificate.key -out certificate.crt -days 1024 -nodes

正如我们在JVM平台上一样,我们的基本目标是拥有Java密钥库 ( JKS ),这是安全证书的存储库。 但是,要将我们新生成的证书导入JKS ,我们必须以PKCS#12格式导出它,然后从中创建密钥库。 同样,在resque上使用openssl

openssl pkcs12 -export -in certificate.crt -inkey certificate.key -out server.p12 -name sample-https-server -password pass:change-me-please

请注意,存档服务器.p12受密码保护。 现在,最后一步涉及JDK发行版中的命令行工具keytool 。

keytool -importkeystore -srcstorepass change-me-please -destkeystore sample-https-server.jks -deststorepass change-me-please -srckeystore server.p12 -srcstoretype PKCS12 -alias sample-https-server

结果是受密码保护的sample-https-server.jks密钥库,我们可以在HTTPS服务器应用程序中使用它来配置SSL上下文。 Spray有非常好的文档和大量示例,其中一个示例SslConfiguration ,我们可以用来配置KeyManagerTrustManagerSSLContext

trait SslConfiguration {// If there is no SSLContext in scope implicitly, the default SSLContext is // going to be used. But we want non-default settings so we are making // custom SSLContext available here.implicit def sslContext: SSLContext = {val keyStoreResource = "/sample-https-server.jks"val password = "change-me-please"val keyStore = KeyStore.getInstance("jks")keyStore.load(getClass.getResourceAsStream(keyStoreResource), password.toCharArray)val keyManagerFactory = KeyManagerFactory.getInstance("SunX509")keyManagerFactory.init(keyStore, password.toCharArray)val trustManagerFactory = TrustManagerFactory.getInstance("SunX509")trustManagerFactory.init(keyStore)val context = SSLContext.getInstance("TLS")context.init(keyManagerFactory.getKeyManagers, trustManagerFactory.getTrustManagers, new SecureRandom)context}// If there is no ServerSSLEngineProvider in scope implicitly, // the default one is going to be used. But we would like to configure// cipher suites and protocols  so we are making a custom ServerSSLEngineProvider// available here.implicit def sslEngineProvider: ServerSSLEngineProvider = {ServerSSLEngineProvider { engine =>engine.setEnabledCipherSuites(Array("TLS_RSA_WITH_AES_128_CBC_SHA"))engine.setEnabledProtocols(Array( "TLSv1", "TLSv1.1", "TLSv1.2" ))engine}}
}

这里有几点要强调。 首先,使用以前创建的我们自己的密钥库(为方便起见,我们将其存储为类路径资源):

val keyStoreResource = "/sample-https-server.jks"
val password = "change-me-please"

另外,我们仅配置TLSTLS v1.0TLS v1.1TLS v1.2 ),不支持SSLv3 。 除此之外,我们仅启用一种密码: TLS_RSA_WITH_AES_128_CBC_SHA 。 这样做主要是为了说明,因为在大多数情况下,可以启用所有受支持的密码。

engine.setEnabledCipherSuites(Array("TLS_RSA_WITH_AES_128_CBC_SHA"))
engine.setEnabledProtocols(Array( "TLSv1", "TLSv1.1", "TLSv1.2" ))

这样,我们就可以创建一个真正的HTTPS服务器了,这要归功于Spray框架只有几行:

class HttpsServer(val route: Route = RestService.defaultRoute) extends SslConfiguration {implicit val system = ActorSystem()implicit val timeout: Timeout = 3 seconds val settings = ServerSettings(system).copy(sslEncryption = true)val handler = system.actorOf(Props(new RestService(route)), name = "handler")def start(port: Int) = Await.ready(IO(Http) ? Http.Bind(handler, interface = "localhost", port = port, settings = Some(settings)), timeout.duration)def stop() = {IO(Http) ? Http.CloseAllsystem.stop(handler)}
}

任何根本不执行任何操作的HTTPS服务器不是很有用。 这就是路由属性发挥作用的地方:使用Spray路由扩展,我们将映射(或路由)传递给HTTP服务参与者RestService )直接处理请求。

class RestService(val route: Route) extends HttpServiceActor with ActorLogging {def receive = runRoute {route}
}

使用默认路由就是:

object RestService {val defaultRoute = path("") {get {complete {"OK!\n"}}}
}

基本上,这就是我们所需要的,我们的HTTPS服务器已准备好进行测试! 运行它的最简单方法是使用Scala应用程序。

object HttpsServer extends App {val server = new HttpsServerserver.start(10999)
}

尽管是用Scala编写的,但我们可以轻松地将其嵌入到任何Java应用程序中(对于Java开发人员来说,使用一些非标准的命名约定),例如:

public class HttpsServerRunner {public static void main(String[] args) {final HttpsServer server = new HttpsServer(RestService$.MODULE$.defaultRoute());server.start(10999);}
}

一旦启动并运行(最简单的方法是sbt run ),就可以从浏览器或使用curl命令行客户端访问我们简单的HTTPS服务器的公开默认路由( -k命令行参数关闭SSL证书验证) :

$ curl -ki https://localhost:10999HTTP/1.1 200 OK
Server: spray-can/1.3.3
Date: Sun, 04 Oct 2015 01:25:47 GMT
Content-Type: text/plain; charset=UTF-8
Content-Length: 4OK!

或者,可以将证书与curl命令一起传递,以便进行完整的SSL证书验证,例如:

$  curl -i --cacert src/main/resources/certificate.crt  https://localhost:10999HTTP/1.1 200 OK
Server: spray-can/1.3.3
Date: Sun, 04 Oct 2015 01:28:05 GMT
Content-Type: text/plain; charset=UTF-8
Content-Length: 4OK!

一切看起来不错,但是我们可以使用HTTPS服务器作为集成测试套件的一部分来验证/存根/模拟,例如,与第三方服务的交互吗? 答案是肯定的,这要归功于JUnit规则。 让我们看一下HttpsServerRule的最简单实现:

class HttpsServerRule(@BeanProperty val port: Int, val route: Route) extends ExternalResource {val server = new HttpsServer(route)override def before() = server.start(port)override def after() = server.stop()
}object HttpsServerRule {def apply(port: Int) = new HttpsServerRule(port, RestService.defaultRoute);def apply(port: Int, route: Route) = new HttpsServerRule(port, route);
}

我们默认实现的JUnit测试用例使用了出色的RestAssured库,该库提供了Java DSL,可轻松测试REST服务。

public class DefaultRestServiceTest {@Rule public HttpsServerRule server = HttpsServerRule$.MODULE$.apply(65200);@Testpublic void testServerIsUpAndRunning() {given().baseUri("https://localhost:" + server.getPort()).auth().certificate("/sample-https-server.jks", "change-me-please").when().get("/").then().body(containsString("OK!"));}
}

可以肯定的是,您无法对默认实现执行任何操作,因此提供自定义选项是必须的选择。 幸运的是,我们很早就通过接受路线来解决了这一问题。

object CustomRestService {val route = path("api" / "user" / IntNumber) { id =>get {complete {"a@b.com"}}}
}

这是一个测试用例:

public class CustomRestServiceTest {@Rule public HttpsServerRule server = HttpsServerRule$.MODULE$.apply(65201, CustomRestService$.MODULE$.route());@Testpublic void testServerIsUpAndRunning() {given().baseUri("https://localhost:" + server.getPort()).auth().certificate("/sample-https-server.jks", "change-me-please").when().get("/api/user/1").then().body(containsString("a@b.com"));}
}

事实证明,创建完整的HTTPS服务器一点也不难,而且一旦您知道执行此操作的正确工具,它就会变得非常有趣。 Spray框架是那些魔术工具之一。 你们中许多人都知道, Spray将被Akka HTTP取代, Akka HTTP最近已经发布了1.0版本,但目前缺乏很多功能(包括HTTPS支持),这使Spray作为可行的选择。

  • 完整的项目可以在Github上找到 。

翻译自: https://www.javacodegeeks.com/2015/10/creating-sample-https-server-for-fun-and-profit.html

spark在服务器运行示例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336810.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么说php单线程,php单线程的缺点是什么?

PHP即“超文本预处理器”,是一种通用开源脚本语言。PHP是在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言。PHP独特的语法混合了C、Java、Perl以及 PHP 自创的语法。利于学习,使用广泛,主要适用于Web开发领…

sidecar_Spring Cloud Sidecar –节点初始化

sidecar在上一篇博客文章中,我描述了Sidecar应用程序如何用于在Eureka中注册Cassandra节点,更一般地,它可以用于在Eureka中注册任何非JVM应用程序。 在本文中,我将介绍应用程序如何查询Sidecar注册节点。 发现注册节点–初始化后…

php 对象 final,PHP7_OOP_对象重载以及魔术方法_对象遍历_final关键字

//对象遍历:class MyClass{public$var1 "value 1";public$var2 "value 2";public$var3 "value 3";protected$protected "pro var";private $private "privar";functioninterateVisible(){echo "MyClas…

供给测结构性改革内容_智能包装结构,提高可测性

供给测结构性改革内容有很多方法可以将整个应用程序分成多个包。 关于按功能或按层打包的优缺点的讨论可以在许多编程博客和论坛上找到。 我想从可测试性开始讨论这个主题,看看它是否会带来任何有意义的结果。 首先,让我们尝试描述我们通常希望跨不同层…

openshift_在OpenShift上扩展Java EE微服务

openshift这个小系列的前两个部分介绍了如何使用WildFly Swarm构建一个小型的JAX-RS服务并将其打包到Docker映像中 。 您学习了如何将此示例部署到OpenShift ,现在是时候对其进行一些扩展了。 为什么扩展很重要 基于微服务的体系结构的关键方面之一是分解为高性能的…

php 异步post,php – 使用POST的异步cURL

我正在制作一个命令行应用程序.在执行登录过程后,我需要同时通过cURL发出多个POST请求 – 这意味着传出请求必须发送会话ID等.事件链如下:>我用curl_init打开cURL连接>我使用curl_exec登录远程站点发送POST请求,并获得返回的HTML代码作为响应>我同时向同一…

log4j2 logger_简单一致的Log4j2 Logger命名

log4j2 logger在“ 带有Java 7方法句柄的可移植记录器名称”一文中 ,我写了关于使用Java 7的方法句柄来命名类的记录器的文章。 我在那篇文章中说过,这种方法的优点包括记录器命名的一致性,并避免了意外的代码复制和粘贴,这可能导…

java 子类tostring,JAVA中Object类的toString()方法,objecttostring

JAVA中Object类的toString()方法,objecttostringtoStringpublic String toString()返回该对象的字符串表示。通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。Objec…

openshift 部署_在OpenShift上部署Java EE微服务

openshift 部署我昨天用WildFly Swarm在博客上发布了有关简单JAX-RS微服务的博客。 您学习了如何使用Maven构建所谓的“胖子”,还使用Maven Docker插件对我们的微服务进行了Docker化并在Docker Machine上本地运行。 这是在本地测试事物的好方法。 到目前为止&#x…

在程序中实现java源文件编译,在程序中实现对java源文件编译的3种方法

一般情况下对java源文件的编译均是在代码完成后使用javac编译的,不管是使用 IDE还是直接使用命令行。这里要说的情况是比较特别的,就是在代码内动态的编译一些代码。比如你想通过在某个目录下通过放置一些源代码的方式来实现对程序功能的动态扩展&#x…

apache.camel_Apache Camel 2.16发布–十大亮点

apache.camelApache Camel 2.16于上周五发布。 这篇博客文章是我尝试在此新版本中进行前10名(加1作为奖励)的亮点。 1.动态到 来自骆驼用户的最常见的常见问题是,如何将消息发送到端点,uri应该使用消息中的动态值(例…

设计模式示例_责任链设计模式示例

设计模式示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 &#x…

edmonds算法matlab,匈牙利算法的matlab实现

匈牙利算法算法简介算法原理算法实现(附代码)测试算法简介下面摘用百度百科中的解释。匈牙利算法(Hungarian method)是由匈牙利数学家Edmonds于1965年提出,因而得名。匈牙利算法是基于Hall定理中充分性证明的思想,它是二分图匹配最常见的算法&#xff0c…

php sqlsrv 分页,Php+SqlServer如何实现分页显示

PhpSqlServer如何实现分页显示$idmssql_connect("ddy","sa"," ") or die("连接不上");$dbmssql_select_db("ddy",$id);$query"select * from lr00 order by lr0012 desc";$resultmssql_query($query);if($result)…

java jooq_将Java EE与jOOQ结合使用的初学者指南

java jooqJava EE附带了自己的持久性API:JPA。 当您想要将RDBMS实体(表/关系)映射到Java实体(类)时,JPA最强大,主要遵循1:1映射策略。 其背后的思想是,业务逻辑通常不像关…

java ee编译器_Java EE 8 MVC:控制器的详细介绍

java ee编译器Java EE MVC是为Java EE 8计划并在JSR-371中指定的基于动作的新MVC框架。 这是我的Java EE 8 MVC教程的第二篇文章。 第一篇文章介绍了基础知识,并展示了如何开始使用 Java EE 8 MVC参考实现Ozark 。 在本文中,我们将更详细地介绍MVC控制器…

php扩展 waf,基于PHP扩展的WAF实现

访问一下看看结果:可以看到ls命令成功的执行了,也就是说我们的正常文件是不会被拦截的,而只有upload目录中的文件会被拦截,这样做又会引发另一个弊端,倘若攻击者通过某种方法将shell写入正常的文件中,或是与…

junit4 集成测试_使用JUnit规则进行干净的集成测试

junit4 集成测试JUnit Rules的优势,尤其是在进行集成测试时,几乎不能被高估。 在本文中,我们将阐明ExternalResource扩展的有用性。 在我们必须使用抽象外部资源的第三方库的情况下,这简化了灯具控制。 作为示例,我们将…

多项式在matlab中的应用,matlab的应用-多项式函数及多项式拟合

matlab的应用-多项式函数及多项式拟合 Matlab 的应用- 多项式函数及多项式拟合 本节将向大家简要介绍 matlab 在多项式处理方面的应用。 多项式函数主要有: roots 求多项式的根 poly 特征多项式 polyval 多 项式的计算 poly2str(p, x )多项式代换 polyfit 多项式曲线…

java8 从数组获取流_从数组到流再到Java 8

java8 从数组获取流不久前,我们将一些Eclipse插件项目升级到Java8。此后再也没有回头。 除其他事项外,使用lambda和streams API ,过滤,映射和查找集合中的元素变得更加容易和简洁。 我想到目前为止,对于大多数人来说&a…