一。什么是eureka
Pivotal团队通过Spring Boot形式的封装将Netflix公司开发的分布式系统组件封装了起来,其中就包括Eureka,Eureka是Spring Cloud的服务治理中心。在使用Spring Boot进行了二次封装后,Eureka的使用就显得十分简易了。Eureka作为一个微服务的治理中心,它是一个服务应用,可以接收其他服务的注册,也可以发现和治理服务实例。
二。服务治理中心
服务治理中心是微服务(分布式)架构中最基础和最核心的功能组件,它主要对各个服务实例进行管理,包括服务注册和服务发现等。常见的注册中心有:eureka,zookeeper,nacos等。
三。搭建Eureka服务治理中心
1.添加相关依赖
主要依赖:
<!-- eureka 注册中心依赖-->
<!-- 版本与相应的springboot 版本对应,所以不要写-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!--主要是定制Spring Cloud父项目的信息(如版本号),
当模块依赖Spring Cloud的开发包的时候,就会继承它,根据它的信息加载对应版本的依赖。-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
不过,如果选择JDK 8(不含)以上的版本,可能会启动失败,这是因为SpringCloud的Netflix组件是依赖于JDK 8(含)之前的版本开发的,所以在新的JDK版本中会缺少一些包,因此我们需要引入新的依赖才能正常启动Eureka服务器
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
完整依赖:
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.jsdyg</groupId>
<artifactId>eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-server</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- eureka 注册中心依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<!--主要是定制Spring Cloud父项目的信息(如版本号),
当模块依赖Spring Cloud的开发包的时候,就会继承它,根据它的信息加载对应版本的依赖。-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
2.设置启动类
只是加入了一个新的注解@EnableEurekaServer,它代表着在Spring Boot应用启用之时,也启动Eureka服务器。此时,我们以Java Application的形式运行,就能够启用Eureka服务治理中心了。
package com.jsdyg.springclouddemo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class SpringclouddemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringclouddemoApplication.class, args);
}
}
此时启动报错:
com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:112) ~[eureka-client-1.9.8.jar:1.9.8]
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56) ~[eureka-client-1.9.8.jar:1.9.8]
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$1.execute(EurekaHttpClientDecorator.java:59) ~[eureka-client-1.9.8.jar:1.9.8]
at
3.配置application.yml
当我们启动Eureka后,会发现日志中会不断地出现异常,那是因为Eureka服务治理中心会把自己作为微服务去寻找注册自己的治理中心。为了避免这种情况,需要进行额外的配置,让它停止注册自己。删除原有的application.properties文件,新建application.yml文件,然后对其进行配置。
spring:
application:
name: eureka-server
eureka:
client:
# 服务自身就是治理中心,所以这里设置为false,取消注册,毕竟自己挂了,也就看不到了
register-with-eureka: false
# 取消服务获取
fetch-registry: false
# 服务注册域地址
service-url:
defaultZone: http://127.0.0.1:8080/eureka/
instance:
# 服务实例服务器IP
hostname: 127.0.0.1
4.启动启动项
运行代码,就可以看到没有异常日志的Eureka服务治理中心的启动了。然后打开浏览器在地址栏输入http://localhost:8080/,就可以看到如下所示的界面了。
看到这个页面,就说明Eureka已经成功启动了。但是,我们可以看到,注册的微服务实例依旧为空,那是因为我们还没有注册。
四。遇到问题
1.报错内容:
Failed to load property source from location 'classpath:/application.yml
解决方案:
1.检查yml 文件是否有语法错误,一般可能是缩进问题。
2.yml 文件格式问题,我用的是IntelliJ,把FileEncoding设置成UTF-8:
3.去除中文注解。