1. 程式人生 > >Consul+Spring boot的服務註冊和服務登出

Consul+Spring boot的服務註冊和服務登出

一圖勝千言

consul架構

先看一看要做事情,需要在Consul上面實現註冊中心的功能,並以2個Spring boot專案分別作為生產者,消費者。

Consul

假設已經完成文章《Consul的開發者模式之Docker版》中的所有的配置,並啟動了Consul,訪問:http://localhost:8500/ui/dc1/services 即如下圖: Consul Web介面

生產者

生產者-目錄結構

專案目錄結構

這裡就是一個簡單的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了。

呼叫效果

consul註冊中心呼叫效果

原始碼

https://github.com/fxtxz2/consul-springboot

參考