一图胜千言
先看一看要做事情,需要在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
参考
- Spring Cloud Consul