spring cloud 实现Eureka注册服务

1 篇文章 0 订阅
1 篇文章 0 订阅

服务注册和发现

原文网址:https://spring.io/guides/gs/service-registration-and-discovery/

What you'll build

你将配置一个Eureka service注册中心和一个client,client能自动注册到注册中心来解决端口问题。一个服务注册中心非常有用,它使得client-side负载均衡,并从 consumers分离服务的providers而不需要DNS。

What you'll need

15分钟

一个自己喜欢的编辑器或IDE

JDK1.8以上

Gradle 2.3+ 或者 Maven 3.0+


How to complete this guide

获取源码

git clone https://github.com/spring-guides/gs-service-registration-and-discovery.git
build with Gradle

创建gradle工程,设置build.gradle

eureka-service/build.gradle

buildscript {
	ext {
		springBootVersion = '1.5.2.RELEASE'
	}
	repositories {
		mavenCentral()
	}
	dependencies {
		classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
	}
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'

jar {
	baseName = 'eureka-service'
	version = '0.0.1-SNAPSHOT'
}
sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
	mavenCentral()
}


dependencyManagement {
	imports {
		mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Camden.SR5'
	}
}

dependencies {
	compile('org.springframework.cloud:spring-cloud-starter-eureka-server')
	testCompile('org.springframework.boot:spring-boot-starter-test')
}


eclipse {
	classpath {
		 containers.remove('org.eclipse.jdt.launching.JRE_CONTAINER')
		 containers 'org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8'
	}
}
eureka-client/build.gradle

buildscript {
	ext {
		springBootVersion = '1.5.2.RELEASE'
	}
	repositories {
		mavenCentral()
	}
	dependencies {
		classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
	}
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'

jar {
	baseName = 'eureka-client'
	version = '0.0.1-SNAPSHOT'
}
sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
	mavenCentral()
}

dependencyManagement {
	imports {
		mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Camden.SR5'
	}
}

dependencies {
	compile('org.springframework.cloud:spring-cloud-starter-eureka')
	compile('org.springframework.boot:spring-boot-starter-web')
	testCompile('org.springframework.boot:spring-boot-starter-test')
	testCompile('org.springframework.cloud:spring-cloud-starter-eureka-server')
}

eclipse {
	classpath {
		 containers.remove('org.eclipse.jdt.launching.JRE_CONTAINER')
		 containers 'org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8'
	}
}
Spring Boot Gradle Plugin提供了许多便利的特性:

  • 它收集classpath中所有的jar包,并build一个独立的,可运行的“uber-jar”,使得执行和传递服务更为方便
  • 它寻找public static void main()方法来标记可执行的类
  • 它提供一个嵌入的依赖解析器,设置版本号匹配Spring Boot依赖。你可以重写成任意版本,但是他将默认为Boot的选择版本集。


build with Maven

 创建Maven工程

eureka-server/pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.example</groupId>
	<artifactId>eureka-service</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.2.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka-server</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>Camden.SR5</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>


</project>

eureka-client/pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.example</groupId>
	<artifactId>eureka-client</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.2.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka-server</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>Camden.SR5</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>


</project>

Spring Boot Maven plugin提高了许多方便的特性: 同上 gradle plugin


build with your IDE
Stand up a Eureka Service Registry

你首先需要一个Eureka Service注册中心,你可以使用Spring Cloud的@EnableEurekaServer来建立注册中心,以便其他应用访问。这是一个普通的Spring Boot应用,加上注解来提供服务注册功能。


service中创建一个application.java

package hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@EnableEurekaServer
@SpringBootApplication
public class EurekaServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaServiceApplication.class, args);
    }
}

当注册中心启动时,会发生错误,带有堆栈信息:“没有注册中心可连接的副本节点”。在生产环境下,你想要注册中心不止一个实例,然而,出于简单的目的,它足以使相关日志失效。

默认情况下,注册中心也将试图将自己也注册上,所以你也需要禁止它注册。

一般在本地使用时,协定将注册中心放在一个单独的端口上。

添加一些属性来处理这些要求:


配置文件eureka-service/src/main/resources/application.properties

server.port=8761

eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

logging.level.com.netflix.eureka=OFF
logging.level.com.netflix.discovery=OFF




Talking to the Registry

现在我们已经搭建好注册中心了,现在搭建一个客户端,让它在注册中心自己注册,并且使用Spring Cloud DiscoveryClient抽象去注册中心询问主机和端口。@EnableDiscoveryClient 激活Netflix Eureka DiscoveryClient实现。还有其他实现用于其他服务注册中心,如 Hashicorp’s Consul or Apache Zookeeper.

client中创建application.java

package hello;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@EnableDiscoveryClient
@SpringBootApplication
public class EurekaClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaClientApplication.class, args);
    }
}

@RestController
class ServiceInstanceRestController {

    @Autowired
    private DiscoveryClient discoveryClient;

    @RequestMapping("/service-instances/{applicationName}")
    public List<ServiceInstance> serviceInstancesByApplicationName(
            @PathVariable String applicationName) {
        return this.discoveryClient.getInstances(applicationName);
    }
}
无论你选择哪种实现,你将发现eureka-client注册在了你在spring.application.name定义的属性名下。这个属性在Spring Cloud中用的很多,通常在服务配置的最初阶段,此属性用在service bootstrap,所以为了方便,将它放在: eureka-client/src/main/resources/bootstrap.properties此文件将先于src/main/resources/application.properties被发现

eureka-client/src/main/resources/bootstrap.properties

spring.application.name=a-bootiful-client

eureka-client定义一个Spring MVC REST端点,ServiceInstanceRestController,它将返回一个枚举,其中包含了注册中心在http://localhost:8080/service-instances/a-bootiful-client注册的所有ServiceInstance实例。查阅 Building a RESTful Web Service指导来学习更多关于用Spring MVC 和 Spring Boot建立REST服务。


Test the application

测试end-to-end(端对端)结果,首先启动eureka-service,加载完毕后,启动eureka-client,客户端将花一分钟将它注册到注册中心,并从注册中心刷新它自己已注册是实例列表。所有的这些阈值都是可配置的,在浏览器中访问客户端http://localhost:8080/service-instances/a-bootiful-client。你将看到客户端的ServiceInstance 映射在响应中。


遇到的问题:

  1. 客户端注册不成功,找不到server,解决办法:在bootstrap.properties中配置server地址:eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值