一,Eureka简介
Eureka是Netflix开源的服务发现组件,本身是基于Rest的服务。包含了Server和Client两部分,Spring Cloud将它集成在子项目Spring Cloud Netflix项目中,从而实现微服务的注册与发现。
二,Eureka原理

Eureka Server提供服务发现的能力,各个微服务启动时,会向Eureka Server注册自己的IP、端口、微服务名称等信息。
Eureka Client是一个Java客户端,用于简化与Eureka Server的交互。
微服务启动后会周期性的(默认30S)向Eureka Server发送心跳。
如果Eureka Server在一定的时间内没有接受到某个微服务实例的心跳,会注销该实例(默认90S)。
默认情况下,Eureka Server同时也是Eureka Client,相互之间通过复制的方式实现数据间的同步。
Eureka Client 会缓存服务注册表中的信息,优势是:首先,无须每次请求都查询Eureka Server,降低了Eureka Server的压力;其次,当所有的Eureka Server都宕机了,消费者也能通过缓存列表中的信息找到服务提供者并完成调用。
三,Eureka Server相关配置
1,pom.xml文件添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
<version>1.4.2.RELEASE</version>
</dependency>
2,启动类上添加@EnableEurekaServer ,声明Eureka Server
@EnableEurekaServer //声明Eureka Server
@SpringBootApplication(exclude = {org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class})
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
3,在application.yml文件中增加以下内容:
server:
port: 8090
spring:
profiles: peer1
application:
name: eureka-cluster
eureka:
instance:
hostname: peer1
client:
register-with-eureka: false # 表示是否将自己注册到Eureka Server,默认为true。由于当前的应用就是Eureka Server,故而设为false
fetch-registry: true #表示是否从Eureka Server获取注册信息,默认为true,表示将自己注册到其他Eureka Server
service-url:
defaultZone: http://peer2:8190/eureka/ #设置与peer2交互地址,查询与注册服务都需要用到此地址,多个地址用,分隔
server:
#默认情况下,Eureka Server 90S内没有接收到微服务心跳就会注销该实例。但是当网络故障发生时,Eureka Server与微服务无法正常通信,以上形为就会变得非常危险了,因为微服务本身是
#健康的,此时不应该注销该实例。
#开启微服务自我保护模式,一旦开启该模式,Eureka Server就会保护服务注册表中的信息,不会删除服务注册表中的数据(也就是不会注销任何微服务)
#当网络故障恢复后,Eureka Server会自动退出自我保护模式
enable-self-preservation: true
四,将微服务注册到Eureka Server上
1,在pom.xml文件中添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
2,在applicaton.yml文件中添加配置
server:
port: 8091
spring:
datasource:
url: jdbc:h2:mem:h2test;DB_CLOSE_DELAY=-1;MODE=MYSQL
driver-class-name: org.h2.Driver
username: sa
password: sa
data-username: sa
data-password: sa
schema: classpath:h2/ddl/.sql
data: classpath:h2/dml/.sql
initialization-mode: always
platform: h2
h2:
console:
enabled: true
jpa:
database-platform: org.hibernate.dialect.H2Dialect
generate-ddl: true
hibernate:
ddl-auto: update
show-sql: true
application:
name: movie-provider #用于指定注册到Eureka Server上的应用名称
eureka:
client:
service-url:
defaultZone: http://peer1:8090/eureka/,http://peer2:8190/eureka/
instance:
prefer-ip-address: true # 表示将自己的IP注册到Eureka Server,如果不配置或设置为false,则表示注册微服务所在操作系统的hostname到Eureka Server
3,编写启动类
/**
- 1,@EnableDiscoveryClient 声明这是一个Eureka Client,此处可用@EnableEurekaClient代替。
- 2,spring cloud 中服务发现组件有多种,如:Zookeeper,Consul等,@EnableDiscoveryClient为各种组件提供了支持。
- 3,@EnableDiscoveryClient是spring-cloud-commons项目的注解,是一个高度的抽象。
- 4,@EnableEurekaClient表明是Eureka 的Client,该注解是是spring-cloud-netflix项目的,只能与Eureka一起工作。
*/
@EnableDiscoveryClient
//@EnableEurekaClient
@SpringBootApplication
public class MovieProviderApplication {
public static void main(String[] args) {
SpringApplication.run(MovieProviderApplication.class, args);
}
}
五,Eureka的高可用
一般情况下Eureka Server发生宕机也不会影响服务间的调用,但如果宕机了,某些微服务也出现了不可用的情况,Eureka Client中的缓存不被更新,就会影响到微服务的调用,甚至影响到整个系统的高可用性。因此,在生产环境下,通常会部署一个高可用的Eureka Server集群。
Eureka Server通过运行多个实例并相互注册的方式来实现高可用性,Eureka Server彼此增量同步信息,从而确保所有节点数据一致。事实上,Eureka Server节点的相互注册是默认行为。
六,Eureka Server 添加用户认证
如果不添加认证,Eureka Server是匿名访问的,为了保护数据的安全性,需要添加安全认证。
步骤:
1,pom.xml中添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2,在application.yml中添加以下内容
security:
basic:
enabled: true #开启基于http basic的认证
user:
name: admin #配置登录的账号
password: admin #配置登录的密码
七,Eureka的元数据
Eureka的元数据分为两类:一,标准元数据,包括:主机名、IP、端口、状态页、健康检查等信息,这些信息会被发布到服
务注册表中,用于服务间的调用。二,自定义元数据,可以使用eureka.instance.metadata-map配置,这些元数据可以在远
程客户端中访问,但一般不会改变客户端的行为,除非客户端知道该元数据的含义。
application.yml中的配置如下:
eureka:
client:
service-url:
defaultZone: http://peer1:8090/eureka/,http://peer2:8190/eureka/
instance:
prefer-ip-address: true # 表示将自己的IP注册到Eureka Server,如果不配置或设置为false,则表示注册微服务所在操作系统的hostname到Eureka Server
metadata-map:
#自定义的元数据,key/value可以随便写
my-metadata:1131313 #自定义的元数据