Consul+Spring boot的服务注册和服务注销

一图胜千言

Consul+Spring boot的服务注册和服务注销_第1张图片

先看一看要做事情,需要在Consul上面实现注册中心的功能,并以2个Spring boot项目分别作为生产者,消费者。

Consul

假设已经完成文章《Consul的开发者模式之Docker版》中的所有的配置,并启动了Consul,访问:http://localhost:8500/ui/dc1/services 即如下图: Consul+Spring boot的服务注册和服务注销_第2张图片

生产者

生产者-目录结构

Consul+Spring boot的服务注册和服务注销_第3张图片

这里就是一个简单的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

表示启用服务发现客户端。

消费者

消费者包含以上配置,只是在调用生产者接口都部分有所不同。

消费者-目录结构

Consul+Spring boot的服务注册和服务注销_第4张图片

消费者-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+Spring boot的服务注册和服务注销_第5张图片

这是consul注册中心的页面效果,生产者和消费者都已经注册到consul了。

调用效果

源代码

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

参考

  • Spring Cloud Consul

转载于:https://my.oschina.net/fxtxz2/blog/3065663

你可能感兴趣的:(Consul+Spring boot的服务注册和服务注销)