{"id":6543,"date":"2022-10-13T20:21:54","date_gmt":"2022-10-13T11:21:54","guid":{"rendered":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=6543"},"modified":"2022-10-14T11:07:09","modified_gmt":"2022-10-14T02:07:09","slug":"spring-consul-%ec%97%b0%eb%8f%99%ed%95%98%ea%b8%b0","status":"publish","type":"post","link":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=6543","title":{"rendered":"Spring Consul Feign \uc5f0\ub3d9\ud558\uae30"},"content":{"rendered":"<h1>Spring Consul Feign \uc5f0\ub3d9\ud558\uae30<\/h1>\n<h2>Consul \uc124\uce58<\/h2>\n<p><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=6541\">\uc5ec\uae30<\/a> \ub97c \ucc38\uc870\ud558\uc5ec \uac1c\ubc1c\uc6a9 Consul \uc11c\ubc84\ub97c \uc124\uce58\ud55c\ub2e4.<\/p>\n<h2>Spring Boot \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc0dd\uc131<\/h2>\n<p>\uac04\ub2e8\ud55c Spring Boot \uc571\uc744 \uc0dd\uc131\ud55c\ub2e4.<\/p>\n<h2>Consul Discovery \ud65c\uc131\ud654<\/h2>\n<h3>\uc758\uc874\uc131 \ucd94\uac00<\/h3>\n<p><code>spring-cloud-starter-consul-discovery<\/code>, <code>spring-boot-starter-actuator<\/code> \ub97c \ucd94\uac00\ud574\uc900\ub2e4.<\/p>\n<pre><code class=\"language-gradle\">dependencies {\n    implementation &#039;org.springframework.boot:spring-boot-starter-web&#039;\n    implementation &#039;org.springframework.boot:spring-boot-starter-actuator&#039;\n    implementation &#039;org.springframework.cloud:spring-cloud-starter-consul-discovery:3.1.2&#039;\n    compileOnly &#039;org.projectlombok:lombok&#039;\n    annotationProcessor &#039;org.projectlombok:lombok&#039;\n    testImplementation &#039;org.springframework.boot:spring-boot-starter-test&#039;\n}<\/code><\/pre>\n<h3>\uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc218\uc815<\/h3>\n<pre><code class=\"language-java\">@RestController\n@SpringBootApplication\npublic class Application {\n\n    @RequestMapping(&quot;\/&quot;)\n    public String home() {\n        return &quot;Hello world&quot;;\n    }\n\n    public static void main(String[] args) {\n        new SpringApplicationBuilder(Application.class).web(true).run(args);\n    }\n\n}<\/code><\/pre>\n<pre><code class=\"language-yaml\">spring:\n  application:\n    name: myApp\n  cloud:\n    consul:\n      host: localhost\n      port: 8500\n      discovery:\n        instance-id: ${spring.application.name}:${random.value}\n        serviceName: myprefix-${spring.application.name}\n        healthCheckPath: \/actuator\/health\n        healthCheckInterval: 15s<\/code><\/pre>\n<h3>\ud655\uc778\ud558\uae30<\/h3>\n<p>\ube0c\ub77c\uc6b0\uc800\uc5d0\uc11c <a href=\"http:\/\/localhost:8080\/\">http:\/\/localhost:8080\/<\/a> \uc811\uc18d\ud558\uba74 \uc11c\ube44\uc2a4\uac00 \uc2e4\ud589\uc911\uc778\uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\ub2e4.<\/p>\n<p>\ube0c\ub77c\uc6b0\uc800\uc5d0\uc11c <a href=\"http:\/\/localhost:8500\/\">http:\/\/localhost:8500\/<\/a> \uc811\uc18d \ud6c4,<br \/>\n\uc11c\ube44\uc2a4\ud0ed\uc5d0 \ub4e4\uc5b4\uac00\uba74 \uc11c\ube44\uc2a4\uac00 \ub4f1\ub85d\ub41c \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\ub2e4.<\/p>\n<p>(healthCheckInterval \uc774 15\ucd08\uc774\ubbc0\ub85c 15\ucd08\uac00 \uc9c0\ub098\uc57c \ud655\uc778\uac00\ub2a5\ud558\ub2e4.)<\/p>\n<h2>Feign \uc5f0\ub3d9\ud558\uae30<\/h2>\n<h3>\uc758\uc874\uc131 \ucd94\uac00<\/h3>\n<p><code>spring-cloud-starter-openfeign<\/code> \uc744 \ucd94\uac00\ud55c\ub2e4.<\/p>\n<pre><code class=\"language-gradle\">dependencies {\n    implementation &#039;org.springframework.boot:spring-boot-starter-web&#039;\n    implementation &#039;org.springframework.boot:spring-boot-starter-actuator&#039;\n    implementation &#039;org.springframework.cloud:spring-cloud-starter-consul-discovery:3.1.2&#039;\n    implementation &#039;org.springframework.cloud:spring-cloud-starter-openfeign:3.1.4&#039;\n    compileOnly &#039;org.projectlombok:lombok&#039;\n    annotationProcessor &#039;org.projectlombok:lombok&#039;\n    testImplementation &#039;org.springframework.boot:spring-boot-starter-test&#039;\n}<\/code><\/pre>\n<h3>\uc571 \uc218\uc815 01<\/h3>\n<p><code>@EnableDiscoveryClient<\/code>, <code>@EnableFeignClients<\/code> \ub97c \ucd94\uac00\ud55c\ub2e4.<\/p>\n<pre><code class=\"language-java\">@RestController\n@EnableFeignClients\n@EnableDiscoveryClient\n@SpringBootApplication\n@RequiredArgsConstructor\npublic class Application {\n\n    private final DiscoveryClient discoveryClient;\n\n    @RequestMapping(&quot;\/serviceUrl&quot;)\n    public String serviceUrl() {\n        List&lt;ServiceInstance&gt; list = discoveryClient.getInstances(&quot;myprefix-myApp&quot;);\n        if (list != null &amp;&amp; list.size() &gt; 0) {\n            return list.get(0).getUri().toString();\n        }\n        return null;\n    }\n\n    public static void main(String[] args) {\n        new SpringApplicationBuilder(Application.class).web(true).run(args);\n    }\n\n}<\/code><\/pre>\n<p><code>http:\/\/localhost:8080\/serviceUrl\/<\/code> \uc5d0 \uc811\uc18d\ud558\uba74,<br \/>\nserviceId \uac00 \ubc18\ud658\ub418\ub294 \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\ub2e4.<\/p>\n<h3>\uc571 \uc218\uc815 02<\/h3>\n<pre><code class=\"language-java\">@RestController\n@EnableFeignClients\n@EnableDiscoveryClient\n@SpringBootApplication\n@RequiredArgsConstructor\npublic class ConsulTestApplication {\n\n    private final DistributionClient distributionClient;\n\n    @RequestMapping(&quot;\/use-feign&quot;)\n    public String sendData() {\n        return distributionClient.sendData(&quot;Lee&quot;);\n    }\n\n    @GetMapping(&quot;\/data&quot;)\n    public String test(@RequestParam(required = false) String query) {\n        return &quot;Hello &quot; + query;\n    }\n\n    @RequestMapping(&quot;\/&quot;)\n    public String home() {\n        return &quot;Hello world&quot;;\n    }\n\n    public static void main(String[] args) {\n        SpringApplication.run(ConsulTestApplication.class, args);\n    }\n\n}<\/code><\/pre>\n<pre><code class=\"language-java\">@FeignClient(value = &quot;myprefix-myApp&quot;)\npublic interface DistributionClient {\n\n    @GetMapping(value = &quot;\/data&quot;, consumes = &quot;application\/json&quot;)\n    String sendData(@RequestParam(required = false) String query);\n}<\/code><\/pre>\n<p><a href=\"http:\/\/localhost:8080\/use-feign\">http:\/\/localhost:8080\/use-feign<\/a> \uc5d0 \uc811\uc18d\ud558\uba74,<br \/>\nfeign \uc774 <code>myprefix-myApp<\/code> \uc11c\ube44\uc2a4\uba85\uc73c\ub85c consul \ub85c\ubd80\ud130 \ud638\uc2a4\ud2b8\uc640 \ud3ec\ud2b8\ub97c \ubc1b\uc544\uc624\uace0,<br \/>\n\ud574\ub2f9 \uc11c\ube44\uc2a4\uc758 <code>\/data<\/code> URL \uc744 \ud638\ucd9c\ud574 \uac12\uc744 \ubc1b\uc544\uc624\uace0,<br \/>\n\uacb0\uacfc\uac12\uc744 \ub9ac\ud134\ud558\ub294 \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Spring Consul Feign \uc5f0\ub3d9\ud558\uae30 Consul \uc124\uce58 \uc5ec\uae30 \ub97c \ucc38\uc870\ud558\uc5ec \uac1c\ubc1c\uc6a9 Consul \uc11c\ubc84\ub97c \uc124\uce58\ud55c\ub2e4. Spring Boot \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc0dd\uc131 \uac04\ub2e8\ud55c Spring Boot \uc571\uc744 \uc0dd\uc131\ud55c\ub2e4. Consul Discovery \ud65c\uc131\ud654 \uc758\uc874\uc131 \ucd94\uac00 spring-cloud-starter-consul-discovery, spring-boot-starter-actuator \ub97c \ucd94\uac00\ud574\uc900\ub2e4. dependencies { implementation &#039;org.springframework.boot:spring-boot-starter-web&#039; implementation &#039;org.springframework.boot:spring-boot-starter-actuator&#039; implementation &#039;org.springframework.cloud:spring-cloud-starter-consul-discovery:3.1.2&#039; compileOnly &#039;org.projectlombok:lombok&#039; annotationProcessor &#039;org.projectlombok:lombok&#039; testImplementation &#039;org.springframework.boot:spring-boot-starter-test&#039; } \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc218\uc815 @RestController @SpringBootApplication public class Application { @RequestMapping(&quot;\/&quot;)\u2026 <span class=\"read-more\"><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=6543\">Read More &raquo;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[31],"tags":[],"class_list":["post-6543","post","type-post","status-publish","format-standard","hentry","category-nomad"],"_links":{"self":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/6543","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=6543"}],"version-history":[{"count":10,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/6543\/revisions"}],"predecessor-version":[{"id":6555,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/6543\/revisions\/6555"}],"wp:attachment":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=6543"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=6543"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=6543"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}