Consul+Spring boot的服務註冊和服務登出
阿新 • • 發佈:2019-06-24
一圖勝千言
先看一看要做事情,需要在Consul上面實現註冊中心的功能,並以2個Spring boot專案分別作為生產者,消費者。
Consul
假設已經完成文章《Consul的開發者模式之Docker版》中的所有的配置,並啟動了Consul,訪問:http://localhost:8500/ui/dc1/services 即如下圖:
生產者
生產者-目錄結構
這裡就是一個簡單的spring boot工程。
生產者-build.gradle
plugins { id 'org.asciidoctor.convert' version '1.5.3' id 'org.springframework.boot' version '2.1.6.RELEASE' id 'java' } apply plugin: 'io.spring.dependency-management' group = 'com.zyl' version = '0.0.1-SNAPSHOT' sourceCompatibility = '1.8' configurations { developmentOnly runtimeClasspath { extendsFrom developmentOnly } compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } ext { set('snippetsDir', file("build/generated-snippets")) set('springCloudVersion', "Greenwich.SR1") } dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.cloud:spring-cloud-starter-consul-discovery' implementation "org.springframework.boot:spring-boot-starter-actuator" compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' developmentOnly 'org.springframework.boot:spring-boot-devtools' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' } dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" } } test { outputs.dir snippetsDir } asciidoctor { inputs.dir snippetsDir dependsOn test }
生產者-bootstrap.properties
spring.application.name=consul-producer
生產者-application.properties
server.port=0 spring.cloud.consul.host=localhost spring.cloud.consul.port=8500 spring.cloud.consul.discovery.prefer-ip-address=true spring.cloud.consul.discovery.health-check-critical-timeout=90m management.endpoints.web.exposure.include=* management.endpoint.health.show-details=always spring.jackson.serialization.indent_output=true
生產者-config.properties
這個檔案什麼都沒有,主要是解決一個警告。
生產者-Application.java
@EnableDiscoveryClient
表示啟用服務發現客戶端。
消費者
消費者包含以上配置,只是在呼叫生產者介面都部分有所不同。
消費者-目錄結構
消費者-Application.java
package com.zyl.consulconsumer; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; import java.time.Duration; @SpringBootApplication @EnableDiscoveryClient public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } @LoadBalanced @Bean public RestTemplate restTemplate(RestTemplateBuilder builder) { return builder.setConnectTimeout(Duration.ofMillis(100)) .setReadTimeout(Duration.ofMillis(500)) .build(); } }
這裡主要就是啟用服務發現客戶端,和啟用resttemplate的負載均衡。
消費者-DemoController.java
package com.zyl.consulconsumer.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class DemoController {
private final RestTemplate restTemplate;
public DemoController(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@RequestMapping("/")
public String home() {
return restTemplate.getForObject("http://consul-producer/", String.class);
}
}
注意這裡呼叫的時候只要使用consul註冊中心發現的服務名,進行呼叫即可。
註冊後效果
這是consul註冊中心的頁面效果,生產者和消費者都已經註冊到consul了。
呼叫效果
原始碼
https://github.com/fxtxz2/consul-springboot