1. eureka是什么
Eureka在spring cloud中作为一个服务的注册与发现的关键角色
只是springcloud中的一个组件,就是一个单独的项目作为注册中心
2.创建eureka注册中心
1.创建项目
..
2.导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
3.在启动类上添加
@EnableEurekaServer //包含@EnableEurekaClient
4.配置文件
server:
port : 8761
eureka:
client:
register-with-eureka: false #默认为true,会将自身注册到指定的eureka中
fetch-register: false #默认为true,会拉取eureka上的信息
service-url:
defualtZone: http://localhost:8761/eureka/ #默认eureka的路径
3.创建eureka客户端并注册到注册中心
1.创建项目
...
2.导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
3.在启动类上添加
//@EnableDiscoveryClient //如果注册中心不是eureka,使用@EnableDiscoveryClient
@EnableEurekaClient
4.配置文件
spring:
application:
name: client #改个名
eureka:
client:
service-url:
defualtZone: http://localhost:8761/eureka/ #默认eureka的路径
4.给eureka注册中心添加监听器
//每当注册中心有任何变化时都会监听到
@Component
public class EurekaListener {
//服务下线
@EventListener
public void canceledEvent(EurekaInstanceCanceledEvent event){
String appName = event.getAppName();
System.out.println(appName+"已经下线!!!");
}
//服务注册到注册中心
@EventListener
public void canceledEvent(EurekaInstanceRegisteredEvent event){
String appName = event.getInstanceInfo().getAppName();
System.out.println(appName+"刚刚注册到注册中心!!!");
}
//服务续约
@EventListener
public void canceledEvent(EurekaInstanceRenewedEvent event){
String appName = event.getAppName();
System.out.println(appName+"前来续约!!!");
}
//注册中心启动
@EventListener
public void canceledEvent(EurekaRegistryAvailableEvent event){
System.out.println("注册中心启动中!!!");
}
//注册中心已经启动
@EventListener
public void canceledEvent(EurekaServerStartedEvent event){
System.out.println("注册中心已经启动!!!");
}
}
5.关于eureka客户端心跳和自我保护机制
1.eureka的service的保护机制
如果当服务在指定时间内,没有发送心跳时,默认eureka会认为由于网络延迟导致,并不会立即清除这个服务.
在开发环境下,服务下线看不到指定效果.
-> 关闭自我保护,并设置清空不开服务的间隔时间
eureka:
server:
enable-self-preservation: false #开发环境下,可以关闭,生产环境一定要开启
eviction-interval-timer-in-ms: 5000 #每隔多久清除一个不可用的服务
2.eureka的客户端
在默认情况下,eureka的客户端默认是每30秒发送一次心跳,90秒没发送就认为宕机.
手动设置发送心跳的间隔和持续时间.
eureka:
instance:
lease-renewal-interval-in-seconds: 5 #服务发送心跳的时间间隔
lease-expiration-duration-in-seconds: 10 #多久没发送心跳就挂掉
6.给eureka添加安全机制
进入eureka需要做认证机制
1.在eureka端:
1.导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2.编写配置文件
spring.security.user.name=admin
spring.security.password=admin
3.编写配置类
@Configuration
public class WebSecurityConfig extends WebSecurityConfigureAdapter{
public void configure(HttpSecurity http){
//1.直接关闭csrf机制
http.csrf().disable(); //会导致csrf完全失效
//2.忽略某个路径.通过csrf进来
http.csrf.ignoringMatchers("/eureka/**"); //指定路径放行
}
}
2.在eureka的客户端
1.在注册eureka的路径上添加用户名:密码@路径
eureka:
client:
service-url:
defualtZone: http://admin:admin@localhost:8761/eureka/
7.eureka的高可用
准备两个yml文件
application-8761.yml:
eureka:
client:
register-with-eureka: true #默认为true,会将自身注册到指定的eureka中
fetch-registry: true #默认为true,会拉取eureka上的信息
service-url:
defaultZone: http://localhost:8762/eureka/ #默认eureka的路径
server:
enable-self-preservation: true #开发环境下,可以关闭,生产环境一定要开启
eviction-interval-timer-in-ms: 5000 #每隔多久清除一个不可用的服务
server:
port: 8761
spring:
application:
name: eureka
application-8762.yml:
eureka:
client:
register-with-eureka: true #默认为true,会将自身注册到指定的eureka中
fetch-registry: true #默认为true,会拉取eureka上的信息
service-url:
defaultZone: http://localhost:8761/eureka/ #默认eureka的路径
server:
enable-self-preservation: true #开发环境下,可以关闭,生产环境一定要开启
eviction-interval-timer-in-ms: 5000 #每隔多久清除一个不可用的服务
server:
port: 8762
spring:
application:
name: eureka
克隆两个相同的服务,分别指向不同的配置)
启动两个服务
出现如上所述说明集群搭建成功,然后再启动客户端
把8761的服务关闭,客户端会在经过默认时间之后会关闭,因为这时客户端的ip指向的是8761,所以这里客户的service-url要配置为所有eureka集群的路径
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/
8.常用配置解析
# 应用名称,将会显示在Eureka界面的应用名称列
spring.application.name=eureka-server
# 应用端口,Eureka服务端默认为:8761
server.port=8761
# 是否允许开启自我保护模式,缺省:true
# 当Eureka服务器在短时间内丢失过多客户端时,自我保护模式可使服务端不再删除失去连接的客户端
eureka.server.enable-self-preservation = false
# Eureka服务器清理无效节点的时间间隔,单位:毫秒,缺省:60000,即60秒
eureka.server.eviction-interval-timer-in-ms = 60000
# 服务名,默认取 spring.application.name 配置值,如果没有则为 unknown
eureka.instance.appname = eureka-client
# 实例ID
eureka.instance.instance-id = eureka-client-instance1
# 应用实例主机名
eureka.instance.hostname = localhost
# 客户端在注册时使用自己的IP而不是主机名,缺省:false
eureka.instance.prefer-ip-address = false
# 应用实例IP
eureka.instance.ip-address = 127.0.0.1
# 服务失效时间,失效的服务将被剔除。单位:秒,默认:90
eureka.instance.lease-expiration-duration-in-seconds = 90
# 服务续约(心跳)频率,单位:秒,缺省30
eureka.instance.lease-renewal-interval-in-seconds = 30
# 是否向注册中心注册自己,缺省:true
# 一般情况下,Eureka服务端是不需要再注册自己的
eureka.client.register-with-eureka = true
# 是否从Eureka获取注册信息,缺省:true
# 一般情况下,Eureka服务端是不需要的
eureka.client.fetch-registry = true