คุณจะสร้าง Hello World API ด้วย Scala และ Akka HTTP ได้อย่างไร

ใช่มันยังคงเป็นสิ่งที่

Akka เป็นชุดเครื่องมือสำหรับนักแสดงยอดนิยมสำหรับการสร้างแอปพลิเคชันพร้อมกันและกระจายใน JVM แอปพลิเคชันเหล่านี้ส่วนใหญ่ใช้ Scala หรือ Java

มีโมดูลหลายโมดูลที่ช่วยในการสร้างแอปพลิเคชันดังกล่าวและ Akka HTTP ก็เป็นหนึ่งในนั้น

Akka HTTP มียูทิลิตี้ทั้งฝั่งไคลเอ็นต์และฝั่งเซิร์ฟเวอร์ เราจะเน้นที่เซิร์ฟเวอร์ในบทช่วยสอนนี้

คุณควรคุ้นเคยกับ Scala และคุณควรมีการตั้งค่า SBT และ IntelliJ และติดตั้ง หากไม่เป็นเช่นนั้นให้ตรวจสอบเอกสารอย่างเป็นทางการ

โดยไม่ต้องกังวลใจอีกต่อไปเรามาสร้าง Hello world API โดยใช้ Scala และ Akka HTTP กันเถอะ!

การตั้งค่าโครงการ

รู้สึกอิสระที่จะโคลน repo 2.1-review-projectให้แน่ใจว่าคุณกำลังใช้สาขา

ถ้าไม่ได้เราจะใช้ SBT และสกาล่า1.1.6 2.12.6ตรวจสอบbuild.propertiesและbuild.sbtไฟล์ของคุณเพื่อให้แน่ใจว่าเวอร์ชันนั้นตรงกับสิ่งเหล่านี้

เริ่มต้นด้วยการเพิ่มการอ้างอิงที่จำเป็น เนื่องจาก Akka HTTP ขึ้นอยู่กับนักแสดงและสตรีมเราจึงต้องเพิ่มไลบรารีเหล่านั้นด้วย

เพิ่มข้อมูลโค้ดต่อไปนี้ที่ท้ายbuild.sbtไฟล์ของคุณ:

libraryDependencies ++= Seq( "com.typesafe.akka" %% "akka-actor" % "2.5.13", "com.typesafe.akka" %% "akka-stream" % "2.5.13", "com.typesafe.akka" %% "akka-http" % "10.1.3",)

หากคุณได้รับแจ้งให้เปิดใช้การนำเข้าอัตโนมัติให้ทำ มิฉะนั้นคุณสามารถเปิดเทอร์มินัลและcdเข้าไปในไดเรกทอรีรากของโครงการของคุณได้ จากนั้นเรียกใช้sbt updateเพื่อรับการอ้างอิง

การนำเข้าอัตโนมัติจะทำให้แน่ใจว่าได้อัปเดตโครงการของคุณทุกครั้งที่มีการอัปเดตไฟล์บางไฟล์รวมถึงbuild.sbtไฟล์

สร้างการอ้างอิง

ขอสร้างวัตถุ Scala ภายใต้“src / main / สกาล่า” Serverชื่อ เราจะเริ่มต้นด้วยการสร้างอินสแตนซ์การอ้างอิงที่จำเป็นในการสร้างเซิร์ฟเวอร์ด้วย Akka HTTP

ขั้นแรกวัตถุจะขยายAppลักษณะ:

object Server extends App {}

สิ่งนี้จะช่วยให้Serverวัตถุของเราสามารถรันได้

เราจะต้องมีโฮสต์และพอร์ตเพื่อผูกเซิร์ฟเวอร์ดังนั้นมาเพิ่มกันเลย:

val host = "0.0.0.0"val port = 9000

เนื่องจาก Akka HTTP ใช้นักแสดงและสตรีม Akka ที่อยู่ด้านล่างเราจึงจำเป็นต้องจัดหาการอ้างอิงด้วย:

implicit val system: ActorSystem = ActorSystem("helloworld")implicit val executor: ExecutionContext = system.dispatcherimplicit val materializer: ActorMaterializer = ActorMaterializer()

แม้ว่าคุณจะไม่จำเป็นต้องรู้ว่าพวกเขาทำอะไรเพื่อเริ่มพัฒนาแอปพลิเคชัน Akka HTTP แต่คุณควรตระหนักถึงสิ่งที่พวกเขาทำ

An ActorSystemใช้ในการจัดการนักแสดง ใช้สำหรับสร้างและค้นหา นักแสดงในระบบเดียวกันมักใช้การกำหนดค่าเดียวกัน

ExecutionContextเป็นค่าใช้จ่ายในการดำเนินการFutureของ มันรู้ว่าควรดำเนินการที่ไหนและอย่างไรตัวอย่างเช่นในเธรดพูล

และสุดท้ายActorMaterializerคือผู้รับผิดชอบในการดำเนินการสตรีม

เมื่อเสร็จแล้วเราสามารถสร้างเส้นทางสวัสดีของเราได้!

สร้างเส้นทาง

ในการสร้างเส้นทางของเราเราจะใช้ DSL การกำหนดเส้นทางของ Akka HTTP มันขึ้นอยู่กับ "เลเยอร์" ของสิ่งที่เรียกว่าคำสั่ง สำหรับภาพรวมอย่าลังเลที่จะเรียกดูเอกสารอย่างเป็นทางการของพวกเขา

เพิ่มเส้นทางด้านล่างการอ้างอิง:

def route = path("hello") { get { complete("Hello, World!") }}

เรามีเลเยอร์แรกซึ่งเราพยายามจับคู่เส้นทางของคำขอที่เข้ามาเป็น“ / สวัสดี” หากไม่ตรงจะถูกปฏิเสธ

หากตรงจะพยายามจับคู่ "คำสั่ง" ภายใน ในกรณีของเราเรากำลังจับคู่คำขอ GET เราดำเนินการตามรอบคำขอ / การตอบกลับด้วยข้อความ“ สวัสดีชาวโลก”

เริ่มต้นเซิร์ฟเวอร์

ด้วยการสร้างเส้นทางของเราสิ่งที่เราต้องทำคือเริ่มเซิร์ฟเวอร์:

Http().bindAndHandle(route, host, port)

เรากำลังผูกเส้นทางของเรากับโฮสต์และพอร์ตที่กำหนดโดยใช้Httpอ็อบเจ็กต์Akka HTTP

เมื่อต้องการเรียกใช้เราServerวัตถุคุณสามารถคลิกขวาและกดRun 'เซิร์ฟเวอร์'

ให้เวลาสองสามวินาทีในการรวบรวมจากนั้นไปที่เบราว์เซอร์ นำทางไป//localhost:9000/helloและคุณจะเห็น“ สวัสดีชาวโลก!” ข้อความ.

เจ๋งใช่มั้ย?

การบันทึก

ก่อนสรุปบทช่วยสอนนี้เราจะเพิ่มการบันทึกพื้นฐานลงในเซิร์ฟเวอร์ของเรา

คุณอาจสังเกตเห็นว่าไม่มีข้อเสนอแนะใด ๆ เมื่อเราเรียกใช้Serverวัตถุของเรา เราไม่มีเงื่อนงำว่าจะสำเร็จหรือล้มเหลว

เราสามารถสันนิษฐานได้ว่ามันใช้งานได้เพราะแอปพลิเคชันไม่ขัดข้อง

มาเพิ่มการบันทึกกัน

If you look into the bindAndHandle function from the Http object, it returns a future of ServerBinding . We can hook some logs into the future’s onComplete function.

Let’s do that:

val bindingFuture = Http().bindAndHandle(route, host, port)bindingFuture.onComplete { case Success(serverBinding) => println(s"listening to ${serverBinding.localAddress}") case Failure(error) => println(s"error: ${error.getMessage}")}

Run the Server again, and this time you should see:

listening to /0:0:0:0:0:0:0:0:9000

Wrapping up

While using Scala and Akka HTTP is not the fastest way to develop APIs, it allows you to integrate other Akka modules, such as actors, streams, clusters, and more, making it easier to develop resilient and scalable systems.

Having said that, it’s good to keep in mind that developing an application using Scala and/or Akka doesn’t necessarily mean that it will be resilient and scalable. You’ll still need to perform work to accomplish that, but it’s easier than with other technologies.

If you liked Akka HTTP, we’ve got a free course that’ll quickstart your way into developing APIs with it. You’ll build an API for a Todo application, explained step by step. Check it out! ??

Akka HTTP Quickstart

Learn how to create web applications and APIs with Akka HTTP in this free course!link.codemunity.io