2013-07-01 31 views
21

Tôi đang nghĩ về quá trình triển khai api đã được thử nghiệm cục bộ của mình lên đám mây, cho phép cơ sở hạ tầng như một dịch vụ (không phải nền tảng như một dịch vụ như Heroku) như amazon.Làm thế nào để triển khai API phun của tôi vào sản xuất?

Tôi có tư cách địa phương được thiết lập với sbt và chạy nhưng câu hỏi của tôi là Tôi nên triển khai điều này trong môi trường sản xuất như thế nào?

Có sane để xác định một quá trình trong đó devops kéo các thay đổi gần đây nhất từ ​​repo git và sau đó chỉ cần thực thi sbt run?

Tôi muốn biết các nhóm sử dụng scala + spray + sbt triển khai apis của họ như thế nào đối với môi trường sản xuất.

Trả lời

27

Trung tâm của các dịch vụ của chúng tôi là scala + akka + spray + mongo. Vì vậy, chúng tôi đang sử dụng GitHub để kiểm soát phiên bản. Sau khi hợp nhất các PR đã kiểm tra với nhánh master, Jenkins automaticaly tests'n'builds project. Nếu tất cả các xét nghiệm đã thành công sau đó Jenking chạy một vài kịch bản:

  1. phiên bản dự án Tăng (hiện bằng văn bản trong vỏ, nhưng sẽ được thay đổi để SBT) nhiệm vụ lắp ráp
  2. Run với sbt-assembly
  3. Run triển khai kịch bản (viết bằng Python với vải) Mà triển khai jar của chúng tôi để EC2

về cơ bản trên bước thrid bạn có một vài lựa chọn:

Thực hiện một jar Runnable sử dụng tập tin IO/Xịt khởi động:

object Boot extends App { 
    implicit val system = ActorSystem("ServiceName") 
    val log = system.log 
    val service = system.actorOf(Props[Service], name="serviceActor") 
    IO(Http) ! Http.Bind(service, interface = host, port = port) 
} 

Thực hiện một jar Runnable như microkernel Akka của:

Trong trường hợp này bạn nên mở rộng đặc điểm khả năng khởi động và ghi đè startupshutdown phương pháp:

class Kernel extends Bootable { 
    // many lines of code 
    def startup() { 
    scheduler.start() 
    SomeActorSystem.startup() 
    } 

    def shutdown() { 
    scheduler.shutdown() 
    SomeActorSystem.shutdown() 
    system.shutdown() 
    } 
} 

Sử dụng một startscript typesafe:

Không thể hiển thị ví dụ, nhưng nó có phần giới thiệu tốt trên github =)

Chúng tôi đang sử dụng tất cả theo cách này trong các trường hợp khác nhau.

+0

Bạn có thể giải thích về cách bạn xử lý tắt máy duyên dáng cho các dịch vụ phun thuốc vào lúc sản xuất không? Tôi có thể tạo ra một câu hỏi. – dmitry

+0

@dmitry Chúng tôi không có nhu cầu hỗ trợ kết nối lâu dài, nhưng nói chung bạn có thể sử dụng cụm akka với persistence + actors lifecycle (actor hooks). Mặt khác, Spray cũng được xây dựng trên đầu trang của Akka, vì vậy bạn có thể xây dựng mô-đun của riêng bạn để tắt máy chủ một cách duyên dáng với thông báo 'Unbind' cho diễn viên nghe. 'Unbind' mất một thời gian tắt máy duyên dáng, sau đó gửi nó cho người nghe và chờ cho Chấm dứt, sau đó bạn có thể' tắt máy 'bạn dịch vụ. – 4lex1v

+1

Chỉ cần cập nhật ở trên. Có vẻ như TypeSafe không sử dụng bản bắt đầu được thay thế bằng sbt-native-packager https://github.com/sbt/sbt-native-packager –

2

Bạn nên xây dựng một jar với các plugin sbt-assembly

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.9.0") 

Sau đó, bạn có thể chạy bình trong sản xuất với java -jar

Nếu bạn cung cấp cho số phiên bản để dự án của bạn, đây là một thay cổ điển quá trình.

Hy vọng điều đó sẽ hữu ích.

-1

Không bao giờ đến PRO với phun-akka. Chỉ có dự án thú cưng. Đề nghị của tôi ở đây nên được lấy làm cảm hứng. Tôi biết một số các tùy chọn tôi trình bày là tốn kém về bảo trì hoặc dễ bị lỗi.

Bao bì

tôi chỉ sử dụng maven-bóng-plugin (không có kinh nghiệm với SBT) nhưng tôi đoán có một giải pháp tương tự.

Bao bì vấn đề

Có vài vấn đề với cách tiếp cận này mặc dù. Akka và nhiều mô-đun phun sử dụng quy ước references.conf và application.conf. Khi lắp ráp/che tất cả các phụ thuộc của bạn, các tài nguyên (vì chúng được đặt tên giống nhau) có thể ghi đè lên và bạn không thể khởi động ứng dụng.

Giải pháp nhanh chóng và dơ bẩn mà tôi tìm thấy là sao chép/dán ứng dụng và tệp ref.conf của các phụ thuộc vào một gói được kiểm soát bởi tôi.

Các vấn đề liên quan