{"id":2985,"date":"2021-08-20T22:19:28","date_gmt":"2021-08-20T13:19:28","guid":{"rendered":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=2985"},"modified":"2021-08-21T21:10:56","modified_gmt":"2021-08-21T12:10:56","slug":"spring-boot-app-%ec%b5%9c%ec%86%8c-%ed%95%84%ec%9a%94-%eb%a9%94%eb%aa%a8%eb%a6%ac-%ec%b0%be%ea%b8%b0","status":"publish","type":"post","link":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=2985","title":{"rendered":"Nomad + Spring Boot App \uad8c\uc7a5 \uc124\uc815"},"content":{"rendered":"<h1>Nomad + Spring Boot App \uad8c\uc7a5 \uc124\uc815<\/h1>\n<p><a href=\"https:\/\/inyl.github.io\/programming\/2021\/04\/21\/k8s_production_in_java.html\">\ucc38\uc870<\/a><\/p>\n<h2>\ubaa9\ud45c<\/h2>\n<p>Nomad \uc5d0\uc11c Spring Boot App \uc2e4\ud589\uc744 \uc704\ud55c \uad8c\uc7a5 \uc124\uc815\uc744 \ucc3e\uc544\ubd05\ub2c8\ub2e4.<\/p>\n<h2>\ud544\uc694 \ud234 \uc124\uce58<\/h2>\n<p>AWS AMI \uc778\uc2a4\ud134\uc2a4\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4.<br \/>\n\uba54\ubaa8\ub9ac\ub294 2G \ub85c \ud569\ub2c8\ub2e4.<\/p>\n<p>\ub0b4 IP \ub85c\ubd80\ud130\uc758 \ubaa8\ub4e0 \uc811\uc18d\uc744 \ud5c8\uc6a9\ud558\ub3c4\ub85d \ubcf4\uc548\uadf8\ub8f9\uc744 \uc124\uc815\ud574 \uc90d\ub2c8\ub2e4.<\/p>\n<p>JDK, Docker \uc640 \uc2a4\ud2b8\ub798\uc2a4 \ud234 hey \ub97c \uc124\uce58\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-bash\">sudo yum install java-11-amazon-corretto-headless -y\njava -version<\/code><\/pre>\n<pre><code class=\"language-bash\">sudo yum install docker -y\ndocker -v\nsudo service docker start\nsudo systemctl enable docker.service<\/code><\/pre>\n<pre><code class=\"language-bash\">wget https:\/\/hey-release.s3.us-east-2.amazonaws.com\/hey_linux_amd64\nchmod 777 hey_linux_amd64\nsudo mv hey_linux_amd64 \/usr\/bin\/hey\n\nhey -help<\/code><\/pre>\n<h2>Consul \uc124\uce58<\/h2>\n<pre><code class=\"language-bash\">sudo mkdir -p \/etc\/consul.d\nsudo mkdir -p \/opt\/consul\n\nsudo vi \/etc\/consul.d\/consul.hcl\n-----------------------------------------\ndatacenter       = &quot;dc1&quot;\nadvertise_addr   = &quot;127.0.0.1&quot;\nclient_addr      = &quot;0.0.0.0&quot;\ndata_dir         = &quot;\/opt\/consul&quot;\nserver           = true\nbootstrap_expect = 1\nui               = true\n\ntelemetry {\n  prometheus_retention_time = &quot;30s&quot;\n}\n-----------------------------------------<\/code><\/pre>\n<pre><code class=\"language-bash\">sudo docker run -d --name consul \\\n     -p 8500:8500 -p 8600:8600 -p 8600:8600\/udp \\\n     -v \/opt\/consul:\/opt\/consul \\\n     -v \/etc\/consul.d:\/etc\/consul.d \\\n     --restart=always \\\n     consul<\/code><\/pre>\n<h2>Nomad \uc124\uce58<\/h2>\n<p>\uc544\ub798 \uba85\ub839\uc73c\ub85c nomad \ub97c \uc124\uce58\ud574 \uc90d\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-bash\">wget https:\/\/releases.hashicorp.com\/nomad\/1.1.3\/nomad_1.1.3_linux_amd64.zip\nunzip nomad_1.1.3_linux_amd64.zip\nsudo mv nomad \/usr\/bin\/\n\nnomad version<\/code><\/pre>\n<p>\ud14c\uc2a4\ud2b8\uc6a9\uc774\ubbc0\ub85c, \ud55c \uc11c\ubc84\uc5d0 Server\/Client \ub97c \ud55c\ubc88\uc5d0 \ud65c\uc131\ud654 \ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-bash\">sudo mkdir -p \/etc\/nomad.d\nsudo mkdir -p \/opt\/nomad\n\nsudo vi \/etc\/nomad.d\/nomad.hcl\n-----------------------------------------\ndatacenter = &quot;dc1&quot;\ndata_dir   = &quot;\/opt\/nomad\/data&quot;\nbind_addr  = &quot;0.0.0.0&quot;\n\nserver {\n  enabled          = true\n  bootstrap_expect = 1\n}\n\nclient {\n  enabled = true\n}\n-----------------------------------------<\/code><\/pre>\n<p>nomad client \ub294 root \uad8c\ud55c\uc774 \ud544\uc694\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-bash\">sudo nomad agent -config=\/etc\/nomad.d\/nomad.hcl<\/code><\/pre>\n<h2>\uc571 \uc2e4\ud589\uc744 \uc704\ud55c \ucd5c\uc18c \uba54\ubaa8\ub9ac \ucc3e\uae30<\/h2>\n<h3>hello \uc124\uc815<\/h3>\n<pre><code class=\"language-bash\">vi hello.nomad\n------------------------------\njob &quot;hello&quot; {\n  datacenters = [&quot;dc1&quot;]\n  type = &quot;service&quot;\n\n  group &quot;helloGroup&quot; {\n    network {\n      # port &quot;http&quot; {}\n      port &quot;https&quot; {}\n      port &quot;lb&quot; { static = 8080 }\n    }\n\n    count = 1\n\n    # Define a task to run\n    task &quot;helloTask&quot; {\n      driver = &quot;java&quot;\n\n      config {\n        jar_path = &quot;local\/TestPublic-0.0.2-SNAPSHOT.jar&quot;\n      }\n\n      env {\n        PORT    = &quot;${NOMAD_PORT_http}&quot;\n        NODE_IP = &quot;${NOMAD_IP_http}&quot;\n      }\n\n      service {\n        # name = &quot;helloService&quot;\n        port = &quot;lb&quot;\n        port = &quot;http&quot;\n\n        check {\n          type     = &quot;http&quot;\n          path     = &quot;\/hello&quot;     # health check \uc6a9 url\n          interval = &quot;2s&quot;\n          timeout  = &quot;2s&quot;\n        }\n      }\n\n      resources {\n        cpu = 500         # 500 Mhz\n        memory = 256      # 256 MB\n      }\n\n      # \uc6d0\uaca9\uc5d0\uc11c \ub2e4\uc6b4\ubc1b\uc544\uc57c \ud569\ub2c8\ub2e4.\n      artifact {\n        source = &quot;https:\/\/github.com\/skyer9\/TestPublic\/raw\/master\/TestPublic-0.0.2-SNAPSHOT.jar&quot;\n      }\n    }\n  }\n}\n------------------------------<\/code><\/pre>\n<pre><code class=\"language-bash\">nomad run hello.nomad<\/code><\/pre>\n<h3>\uc2a4\ud2b8\ub808\uc2a4 \ud14c\uc2a4\ud2b8 \ud558\uae30<\/h3>\n<p>5\ubd84\uac04 200\uac1c\uc758 \ub3d9\uc2dc \ucee4\ub125\uc158\uc744 \ud558\ub3c4\ub85d \ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-bash\">hey -z 5m -c 200 http:\/\/172.31.5.55:8080\/hello<\/code><\/pre>\n<p>Tomcat Thread \uac00 \ucd5c\ub300 200\uac1c\uac00 \uc0dd\uc131\ub418\uace0, Thread \ud558\ub098\ub2f9 1M \uc758 \uba54\ubaa8\ub9ac\uac00 \ud560\ub2f9\ub429\ub2c8\ub2e4.<\/p>\n<p>\uc989, Hello World \uc571\uc744 \uc704\ud55c \uba54\ubaa8\ub9ac + 200M \ub97c \ud560\ub2f9\ud558\ub294 \uac83\uc774 \uc88b\uc2b5\ub2c8\ub2e4.<\/p>\n<h2>Spring Boot \uad8c\uc7a5 \uc124\uc815<\/h2>\n<h3>JDK, Spring Boot \ubc84\uc804\uc740 \ucd5c\uc2e0 \ubc84\uc804\uc73c\ub85c<\/h3>\n<p>JDK 11 \uc774\uc0c1\uc758 \ubc84\uc804\uc774 \uad8c\uc7a5\ub418\uace0, Spring Boot \ub294 2.3.0 \uc774\uc0c1\uc758 \ubc84\uc804\uc73c\ub85c \ud569\ub2c8\ub2e4.<\/p>\n<h3>-Xms -Xmx \uc0ac\uc6a9\uc548\ud568<\/h3>\n<p>Nomad \uc5d0\uc11c \uba54\ubaa8\ub9ac\ub97c \ud560\ub2f9\ud558\uba74, JDK \uac00 \ud560\ub2f9\ubc1b\uc740 \uba54\ubaa8\ub9ac\ub97c \uae30\ubc18\uc73c\ub85c \ucd5c\uc801\uc758 Heap \uba54\ubaa8\ub9ac\ub97c \uc124\uc815\ud569\ub2c8\ub2e4.<\/p>\n<p>\ub530\ub77c\uc11c, \ubcc4\ub3c4\uc758 \uc124\uc815\uc744 \ud558\uae30\ubcf4\ub2e4\ub294 Nomad \uba54\ubaa8\ub9ac \uc124\uc815\ub9cc \ud558\uace0 <code>-Xms -Xmx<\/code> \ub294 JDK \uac00 \uc790\ub3d9\ud560\ub2f9\ud558\ub3c4\ub85d \ub450\ub294 \uac83\uc774 \ucd5c\uc801\uc758 \uc124\uc815\uc774 \ub429\ub2c8\ub2e4.<\/p>\n<h3>Graceful Shutdown<\/h3>\n<p>Spring Boot 2.3.0 \ubd80\ud130 \ucd94\uac00\ub41c \uc124\uc815\uc785\ub2c8\ub2e4.<\/p>\n<p>\uc544\ub798 \uc124\uc815\ub9cc\uc73c\ub85c \uc167\ub2e4\uc6b4\uc2dc \uc624\ub958 \ubc1c\uc0dd\uc744 \uc5c6\uc568 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>application.yml<\/p>\n<pre><code class=\"language-yaml\">server:\n  shutdown: graceful<\/code><\/pre>\n<pre><code class=\"language-bash\">vi hello.nomad\n------------------------------\njob &quot;hello&quot; {\n  datacenters = [&quot;dc1&quot;]\n  type = &quot;service&quot;\n\n  group &quot;helloGroup&quot; {\n    network {\n      # port &quot;http&quot; {}\n      port &quot;https&quot; {}\n      port &quot;lb&quot; { static = 8080 }\n    }\n\n    count = 1\n\n    # Define a task to run\n    task &quot;helloTask&quot; {\n      driver = &quot;java&quot;\n\n      config {\n        jar_path = &quot;local\/TestPublic-0.0.4-SNAPSHOT.jar&quot;\n      }\n\n      env {\n        PORT    = &quot;${NOMAD_PORT_http}&quot;\n        NODE_IP = &quot;${NOMAD_IP_http}&quot;\n      }\n\n      service {\n        name = &quot;helloService&quot;\n        port = &quot;lb&quot;\n        # port = &quot;http&quot;\n\n        check {\n          type     = &quot;http&quot;\n          path     = &quot;\/health&quot;     # health check \uc6a9 url\n          interval = &quot;2s&quot;\n          timeout  = &quot;2s&quot;\n        }\n      }\n\n      resources {\n        cpu = 500         # 500 Mhz\n        memory = 448      # 448 MB\n      }\n\n      # \uc6d0\uaca9\uc5d0\uc11c \ub2e4\uc6b4\ubc1b\uc544\uc57c \ud569\ub2c8\ub2e4.\n      artifact {\n        source = &quot;https:\/\/github.com\/skyer9\/TestPublic\/raw\/master\/TestPublic-0.0.4-SNAPSHOT.jar&quot;\n      }\n    }\n  }\n}\n------------------------------<\/code><\/pre>\n<pre><code class=\"language-bash\">nomad stop -purge hello\nnomad run hello.nomad<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Nomad + Spring Boot App \uad8c\uc7a5 \uc124\uc815 \ucc38\uc870 \ubaa9\ud45c Nomad \uc5d0\uc11c Spring Boot App \uc2e4\ud589\uc744 \uc704\ud55c \uad8c\uc7a5 \uc124\uc815\uc744 \ucc3e\uc544\ubd05\ub2c8\ub2e4. \ud544\uc694 \ud234 \uc124\uce58 AWS AMI \uc778\uc2a4\ud134\uc2a4\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4. \uba54\ubaa8\ub9ac\ub294 2G \ub85c \ud569\ub2c8\ub2e4. \ub0b4 IP \ub85c\ubd80\ud130\uc758 \ubaa8\ub4e0 \uc811\uc18d\uc744 \ud5c8\uc6a9\ud558\ub3c4\ub85d \ubcf4\uc548\uadf8\ub8f9\uc744 \uc124\uc815\ud574 \uc90d\ub2c8\ub2e4. JDK, Docker \uc640 \uc2a4\ud2b8\ub798\uc2a4 \ud234 hey \ub97c \uc124\uce58\ud569\ub2c8\ub2e4. sudo yum install java-11-amazon-corretto-headless -y java -version sudo\u2026 <span class=\"read-more\"><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=2985\">Read More &raquo;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-2985","post","type-post","status-publish","format-standard","hentry","category-spring-boot"],"_links":{"self":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/2985","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2985"}],"version-history":[{"count":30,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/2985\/revisions"}],"predecessor-version":[{"id":3015,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/2985\/revisions\/3015"}],"wp:attachment":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2985"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2985"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2985"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}