spring cloud 实现Eureka注册服务

来源:互联网 发布:欧美经济数据 编辑:程序博客网 时间:2024/06/08 09:22

服务注册和发现

原文网址: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.8targetCompatibility = 1.8repositories {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.8targetCompatibility = 1.8repositories {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@SpringBootApplicationpublic class EurekaServiceApplication {    public static void main(String[] args) {        SpringApplication.run(EurekaServiceApplication.class, args);    }}

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

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

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

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


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

server.port=8761eureka.client.register-with-eureka=falseeureka.client.fetch-registry=falselogging.level.com.netflix.eureka=OFFlogging.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@SpringBootApplicationpublic class EurekaClientApplication {    public static void main(String[] args) {        SpringApplication.run(EurekaClientApplication.class, args);    }}@RestControllerclass 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/


原创粉丝点击