服务发现:Spring Cloud Netflix Eureka
2020-05-19 本文已影响0人
睦月MTK
声明:入门级文档,更多内容会持续更新,不足之处,望不吝指点
一、服务(注册)中心
- 依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
- 启用当前应用为Eureka服务中心
@EnableEurekaServer
@EnableEurekaServer
@SpringBootApplication
public class ServiceRegistryAndDiscoverServerEndApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceRegistryAndDiscoverServerEndApplication.class, args);
}
}
- 配置
#不向注册中心注册自己
eureka.client.register-with-eureka=false
#注册中心本身不需要拉去服务列表
eureka.client.fetch-registry=false
- 额外-心跳机制与保护模式
Eureka通过设置心跳机制来判断注册的服务是否还存在,Renews threshold
值表示一分钟应当收到的心跳数,Renews (last min)
表示上一分钟实际收到的心跳数,如果实际收到的心跳数小于阈值,则Eureka认为是网络出现了波动,此时Eureka将会开启保护模式,保护模式期间所有的服务信息将不会被删除,不论该服务是否真的不可用了。如果实际心跳数高于阈值,但某个服务在一定时间内还是没有发来心跳数据,则Eureka将该服务注销。这一块涉及的配置有
#是否开启保护模式
eureka.server.enableSelfPreservation = true
#设置应收心跳数与实际心跳数的比值,其实就是根据理论实际心跳数来设置阈值
eureka.server.renewal-percent-threshold=0.85
#设置Eureka清理无效服务的间隔
eureka.server.eviction-interval-timer-in-ms=60000
- 额外-敏感界面加密
默认情况下,Eureka的服务中心是可以直接在浏览器上访问的,为了将该界面加密,可以引入spring security
为其加密,具体步骤如下:- 依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
- 配置
spring.security.user.name=username spring.security.user.password=password
- 开启
WebSecurity
@SpringBootApplication @EnableEurekaServer @EnableWebSecurity public class ServiceRegistryAndDiscoverServerEndApplication { public static void main(String[] args) { SpringApplication.run(ServiceRegistryAndDiscoverServerEndApplication.class, args); } @Bean public WebSecurityConfigurerAdapter webSecurityConfiguration(){ return new WebSecurityConfigurerAdapter() { @Override public void configure(HttpSecurity http) throws Exception { //关闭csrf防护,避免其他服务无法访问服务中心 http.csrf().disable(); http.authorizeRequests().anyRequest().authenticated().and().formLogin().and().httpBasic(); } }; } }
-
实际效果
spring-security-login.PNG
- 额外-Eureka状态监听器
Eureka提供了一些列事件来满足对特定事件监听的需求,比如注册中心的启动,服务的上线与下线等等。- EurekaInstanceCanceledEvent --- 服务下线事件
- EurekaInstanceRegisteredEvent --- 服务注册事件
- EurekaInstanceRenewedEvent --- 服务续约事件
- EurekaRegistryAvailableEvent Eureka --- 注册中心启动事件
- EurekaServerStartedEvent ---
Eureka Server
启动事件
@EventListener
public void listen(EurekaRegistryAvailableEvent event){
System.out.println("注册中心启动");
}
二、客户端(服务)
- 依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 启动当前应用为Eureka客户端(服务)
@SpringBootApplication
@EnableEurekaClient
public class ServiceRegistryAndDiscoverApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceRegistryAndDiscoverApplication.class, args);
}
}
- 配置
# 应用(服务)的名字
spring.application.name=server-client-1
#Eureka 注册中心的地址
eureka.client.service-url.defaultZone=http://username:password@localhost:8761/eureka/
实际上注册中心的配置是
eureka.client.service-url
,defaultZone
不过是个键名罢了
- 额外-使用ip地址进行服务的注册
开启该配置后Eureka将会使用ip地址来注册该服务,而不是使用主机名来注册
eureka.instance.prefer-ip-address=true
- 额外-设置服务的实例id显示格式
eureka.instance.instance-id=${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
- 额外-心跳相关设置
#每隔多少秒发送一次心跳信息
eureka.instance.lease-renewal-interval-in-seconds=30
#自上次发送心跳数据后,多少秒后未接到该服务的心跳数据,可以认为该服务下线并可以进行删除
eureka.instance.lease-expiration-duration-in-seconds=90
#是否启用/actuator/health来进行服务的健康检查而不是使用心跳数据
eureka.client.healthcheck.enabled=false
- 额外-使用安全的https协议来进行与Eureka之间的交互
eureka.instance.non-secure-port-enabled=false
eureka.instance.secure-port-enabled=true
- 额外-使用
RestTemplate
而不是Jersey
来进行Rest服务的访问
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<exclusions>
<exclusion>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jersey.contribs</groupId>
<artifactId>jersey-apache-client4</artifactId>
</exclusion>
</exclusions>
</dependency>
- 额外-客户端配置刷新机制
Eureka Client会定时进行配置的检查并刷新,当刷新行为发生时,将会导致服务暂时的不可用。可以通过下列配置来关闭该功能
eureka.client.refresh.enable=false
- 额外-配置服务的状态和健康信息页面(如果你没有使用
actuator
的话)
#配置服务的状态信息页面,第一个是绝对路径,第二个是相对路径
#eureka.instance.status-page-url
eureka.instance.status-page-url-path=${server.servletPath}/info
#配置服务的健康信息页面,第一个是绝对路径,第二个是相对路径
#eureka.instance.health-check-url
eureka.instance.health-check-url-path=${server.servletPath}/health
- 额外-使用
DiscoveryClient
(org.springframework.cloud.client.discovery.DiscoveryClient
)类来手动拉去服务中心的服务信息-
DiscoveryClient#getServices
拉去服务中心的服务名列表 -
DiscoveryClient#getInstances
获取指定服务的服务实例对象
List<ServiceInstance> list = discoveryClient.getInstances(instanceId);
-
参考文档:
[1] Spring Cloud Netflix