Eureka 是 Netflix 开发的,一个基于 REST 服务的,服务注册与发现的组件
Eureka 包含两个组件:Eureka Server 和 Eureka Client。
Eureka Server 提供服务注册服务,各个节点启动后,会在 Eureka Server 中进行注册,这样 Eureka Server 中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
Eureka Client 是一个java客户端,用于简化与 Eureka Server 的交互,客户端同时也就是一个内置的、使用轮询(round-robin)负载算法的负载均衡器。
各个微服务启动时,会通过 Eureka Client 向 Eureka Server 注册自己,Eureka Server 会存储该服务的信息
也就是说,每个微服务的客户端和服务端,都会注册到 Eureka Server,这就衍生出了微服务相互识别的话题
- 同步:每个 Eureka Server 同时也是 Eureka Client(逻辑上的)
多个 Eureka Server 之间通过复制的方式完成服务注册表的同步,形成 Eureka 的高可用 - 识别:Eureka Client 会缓存 Eureka Server 中的信息
即使所有 Eureka Server 节点都宕掉,服务消费者仍可使用缓存中的信息找到服务提供者 - 续约:微服务会周期性(默认30s)地向 Eureka Server 发送心跳以Renew(续约)信息(类似于heartbeat)
- 续期:Eureka Server 会定期(默认60s)执行一次失效服务检测功能
它会检查超过一定时间(默认90s)没有Renew的微服务,发现则会注销该微服务节点
Spring Cloud 已经把 Eureka 集成在其子项目 Spring Cloud Netflix 里面
1. 部署
因为只有一台机器模拟集群,所以可以在host文件下映射多个不同的域名到本机地址。
这里使用的是: master 127.0.0.1 backup1 127.0.0.1 backup2 127.0.0.1
首先我们通过maven导入依赖包
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
</dependencies>
<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><properties>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
</dependencies>
<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>
其次我们写好配置文件(以下全部采用yml)
application.yml
spring:
profiles:
active: master
customize:
username: "yourusername"
password: "yourpassword"
application-master.yml
spring:
profiles: master
application:
name: EurekaMaster
server:
port: 10237
eureka:
instance:
# 主机名
hostname: master
# 实例id(注册名)
instance-id: ${spring.application.name}:${server.port}
# 是否允许ip注册
prefer-ip-address: false
# 默认Unknow
appname: EurekaMaster
# 安全端口
secure-port: ${server.port}
# 指示是否应为流量启用安全端口
secure-port-enabled: true
client:
# 是否将自身注册为服务中心(true)
register-with-eureka: true
# 是否开启服务查找(true)
fetch-registry: true
# 默认注册地址
serviceUrl:
defaultZone: http://${customize.username}:${customize.password}@backup1:10238/eureka/,http://${customize.username}:${customize.password}@backup2:10239/eureka/
server:
# 指定 Eviction Task 定时任务的调度频率,用于剔除过期的实例,此处未使用默认频率,频率为:5/秒,默认为:60/秒
# 有效防止的问题是:应用实例异常挂掉,没能在挂掉之前告知Eureka server要下线掉该服务实例信息。这个就需要依赖Eureka server的EvictionTask去剔除。
eviction-interval-timer-in-ms: 4000
# 指定每分钟需要收到的续约次数的阈值,默认值是:0.85
renewal-percent-threshold: 0.49
# 是否开启自身保护
enable-self-preservation: true
application-backup1.yml
spring:
profiles: backup1
application:
name: EurekaBackup1
server:
port: 10238
eureka:
# 主机名
hostname: backup1
# 实例id(注册名)
instance-id: ${spring.application.name}:${server.port}
# 是否允许ip注册
prefer-ip-address: false
# 默认Unknow
appname: EurekaBackup1
# 安全端口
secure-port: ${server.port}
# 指示是否应为流量启用安全端口
secure-port-enabled: true
client:
# 是否将自身注册为服务中心(true)
register-with-eureka: true
# 是否开启服务查找(true)
fetch-registry: true
# 默认注册地址
service-url:
defaultZone: http://${customize.username}:${customize.password}@master:10237/eureka/,http://${customize.username}:${customize.password}@backup2:10239/eureka/
server:
# 指定 Eviction Task 定时任务的调度频率,用于剔除过期的实例,此处未使用默认频率,频率为:5/秒,默认为:60/秒
# 有效防止的问题是:应用实例异常挂掉,没能在挂掉之前告知Eureka server要下线掉该服务实例信息。这个就需要依赖Eureka server的EvictionTask去剔除。
eviction-interval-timer-in-ms: 4000
# 指定每分钟需要收到的续约次数的阈值,默认值是:0.85
renewal-percent-threshold: 0.49
# 是否开启自身保护
enable-self-preservation: true
application-backup2.yml
spring:
profiles: backup2
application:
name: EurekaBackup2
server:
port: 10239
eureka:
# 主机名
hostname: backup2
# 实例id(注册名)
instance-id: ${spring.application.name}:${server.port}
# 是否允许ip注册
prefer-ip-address: false
# 默认Unknow
appname: EurekaBackup2
# 安全端口
secure-port: ${server.port}
# 指示是否应为流量启用安全端口
secure-port-enabled: true
client:
# 是否将自身注册为服务中心(true)
register-with-eureka: true
# 是否开启服务查找(true)
fetch-registry: true
# 默认注册地址
service-url:
defaultZone: http://${customize.username}:${customize.password}@master:10237/eureka/,http://${customize.username}:${customize.password}@backup1:10238/eureka/
server:
# 指定 Eviction Task 定时任务的调度频率,用于剔除过期的实例,此处未使用默认频率,频率为:5/秒,默认为:60/秒
# 有效防止的问题是:应用实例异常挂掉,没能在挂掉之前告知Eureka server要下线掉该服务实例信息。这个就需要依赖Eureka server的EvictionTask去剔除。
eviction-interval-timer-in-ms: 4000
# 指定每分钟需要收到的续约次数的阈值,默认值是:0.85
renewal-percent-threshold: 0.49
# 是否开启自身保护
enable-self-preservation: true
配置启动类
@EnableEurekaServer
@SpringBootApplication
public class EurekaserverApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaserverApplication.class, args);
}
}
配置类
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Value("${customize.username}")
private String username;
@Value("${customize.password}")
private String password;
/**
* 添加SpringSecurity默认帐号密码
* 密码需要经过编码
* @param auth
* @throws Exception
*/
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.passwordEncoder(new BCryptPasswordEncoder())
.withUser(username)
.password(new BCryptPasswordEncoder().encode(password))
.roles("ADMIN");
}
/**
* 一定要关闭csrf防护,否则无法注册
* 并且打开Http Authorize
* @param http
* @throws Exception
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
http.authorizeRequests().anyRequest().authenticated().and().httpBasic();
}
}
2. 客户端
启动类
// 加上EnableEurekaClient注解
@EnableEurekaClient
@SpringCloudApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
配置文件
eureka:
instance:
prefer-ip-address: true
client:
service-url:
defaultZone: http://${customize.username}:${customize.password}@master:10237/eureka/,http://${customize.username}:${customize.password}@backup1:10238/eureka/,http://${customize.username}:${customize.password}@backup2:10239/eureka/