文章目录
- 服务发现
- eureka
- 简介
- 架构图
- 使用方法
- 创建Eureka Server
-
- 创建Eureka Client
-
- Eureka Server高可用
-
- 用户认证
-
- Eureka元数据
- Eureka的自我保护模式
- 多网卡环境下的IP选择
- 忽略指定名称的网卡
- 指定使用网络地址
- 只使用站点本地地址
- 手动指定IP地址
- Eureka的健康检查
服务发现
1.各个微服务启动时,将自己的网络地址等信息注册到服务发现组件中,各个微服务与会使用一定机制通信,若服务发现组件长时间无法与某微服务实例通信,就会注销该实例。
2.服务消费者首先从服务发现组件获取服务提供者的网络地址,然后通过该地址调用服务提供者的接口。
eureka
简介
Eureka是Netflix开源的服务发现组件,本身是一个基于REST的服务,包含Server和Client两部分。
Eureka的GitHub
Eureka的典故:阿基米德发现浮力时,非常开心,于是说:“Eureka!”意思是“我找到了!”。Netflix将它们的服务发现组件命名为Eureka实在是非常形象。
架构图
- Application Service:服务提供者
- Application Client:服务消费者
- Make Remote Call:调用RESTful API的行为
包含两个组件:
- Eureka Server:提供服务发现的能力,各个微服务启动时,会向Eureka Server注册自己的信息(例如IP、端口、微服务名称等),Eureka Server会存储这些信息。
- Eureka Client:是一个Java客户端,用于简化与Eureka Server的交互。
- 微服务启动后,会周期性地向Eureka Server发送心跳(默认周期为30秒)以续约自己的信息。如果Eureka Server在一定时间内没有接收到某个微服务节点的心跳,Eureka Server将会注销该微服务节点(默认90秒)。
- 默认情况下,Eureka Server同时也是Eureka Client,多个Eureka Server实例互相之间通过复制的方式来实现服务注册表中数据的同步。
- Eureka Client会缓存服务注册表中的信息。因此,微服务无需每次请求都查询Eureka Server,从而降低了Eureka Server的压力;其次,即使所有的Eureka Server节点都宕掉,服务消费者依然可以使用缓存中的信息找到服务提供者并完成调用。
使用方法
创建Eureka Server
引入依赖
在pom文件中增加Eureka Server的starter:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
增加注解
在启动类上增加注解@EnableEurekaServer
,申明这是一个Eureka Server:
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
修改配置文件
打开配置文件application.yml,进行修改:
server:
port: 8761
eureka:
instance:
hostname: localhsot
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
创建Eureka Client
接下来实现将微服务注册到Eureka Server上,在启动类上不增加 @EnableDiscoveryClient
注解也能注册到微服务上。
引入依赖
新建项目,并且在pom中引入Eureka Client依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
修改配置文件
打开配置文件application.yml,进行修改:
spring:
application:
name: eureka-client1
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
instance:
prefer-ip-address: true
-
若不想微服务注册到Eureka Server,只需设置:spring.cloud.service-registry.auto-registration.enabled=false
,或@EnableDiscoveryClient(autoRegister = false)
即可。
-
设置向服务中心发送一条续约指令间隔时间(秒):eureka.instance.lease-renewal-interval-in-seconds=10
-
设置判定服务过期时间(秒):eureka.instance.lease-expiration-duration-in-seconds=60
Eureka Server高可用
Eureka Client会定时连接Eureka Server,获取服务注册表中的信息缓存在本地。微服务在远程消费API时总是使用本地缓存中的数据。因此一般来说,即使Eureka Server发生宕机,也不会影响服务之间的调用。但如果Eureka Server宕机时,某些微服务也出现了不可用的情况,Eureka Client中的缓存若不被更新,就可能会影响微服务的调用,甚至影响整个应用系统的高可用性。因此,在生产环境中,通常会部署一个高可用的Eureka Server集群。
编写高可用Eureka Server
与创建单体Eureka Server的区别在于配置文件不同,依照上文创建Eureka Server后修改配置文件,修改配置文件:
spring:
application:
name: eureka-server-ha
eureka:
client:
service-url:
defaultZone: http://localhost:8762/eureka,http://localhost:8763/eureka/
---
spring:
profiles: ha1
server:
port: 8762
eureka:
instance:
hostname: ha1
---
spring:
profiles: ha2
server:
port: 8763
eureka:
instance:
hostname: ha2
- 打包项目后启动时通过
java -jar 项目.jar--spring.profiles.active=profiles名称
指定profile。 - 微服务注册到Eureka Server集群时最好是以逗号(,)分割配置多个defaultzone,虽然配置一个defaultZone后,多个Eureka Server之间的数据会同步,但是为适应某些极端场景,建议配置多个。
用户认证
在实际项目中可能需要用户认证才允许访问Eureka Server,而不是匿名访问。
新增依赖
在原有依赖上新增security的starter依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-security</artifactId>
</dependency>
修改配置文件
server:
port: 8761
spring:
security:
user:
name: admin
password: 123456
eureka:
client:
fetch-registry: false
register-with-eureka: false
service-url:
defaultZone: http://admin:123456@localhost:8761/eureka/
增加配置类
如果不增加如下配置文件,使用微服务连接时,会报错:
com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
这种客户端链接的方式是:HttpBasic,
所以security需要改成这种链接方式验证。
package com.clouddemo.eureka_server_auth.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER);
http.csrf().disable();
http.authorizeRequests().anyRequest().authenticated().and().httpBasic();
}
}
- 微服务注册到需要认证的Eureka Server上时,只需要将defaultZone设置为:
http://user:password@EUREKA_HOST:EUREKA_PORT/eureka/
的形式。
Eureka元数据
Eureka的元数据分为两种,分别是标准元数据和自定义元数据。
- 标准元数据:主机名、IP地址、端口号、状态页和健康检查等信息,这些信息都会被发布在服务注册表中,用于服务之间的调用。
- 自定义元素据:使用
eureka.instance.metadata-map
配置,这些元数据可以在远程客户端中访问,但一般不会改变客户端的行为,除非客户端知道该元数据的含义。
访问 http://localhost:8761/eureka/apps
可以查看Eureka的metadata
Eureka的自我保护模式
自我保护模式是一种应对网络异常的安全保护措施,它宁可同时保留所有微服务(正常与异常的微服务),也不盲目注销任何正常的微服务。
在Eureka Server节点配置文件中,可以使用 eureka.server.enable-self-preservation= false
来禁用自我保护模式。
进入自我保护模式最直观的体现,是Eureka Server首页输出的警告:
默认情况下,如果Eureka Server在一定时间内(默认90秒)没有接收到某个微服务的心跳,Eureka Server将注销该实例。但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通讯,会导致的结果是微服务是正常的,却在Eureka Server中被注销了。
Eureka通过自我保护模式来解决这个问题——当Eureka Server节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。Eureka Server就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不再注销任何微服务)。当网络故障恢复后,该Eureka Server节点会自动退出自我保护模式。
设置触发服务剔除的间隔时间(ms): eureka.server.eviction-interval-timer-in-ms: 10000
多网卡环境下的IP选择
对于多网卡的服务器,微服务可使用Spring Cloud提供的按需选择IP的能力:
忽略指定名称的网卡
spring:
cloud:
inetutils:
ignored-interfaces:
- docker0
- veth.*
eureka:
instance:
prefer-ip-address: true
指定使用网络地址
spring:
cloud:
inetutils:
preferred-networks:
- 192.168
- 10.0
eureka:
instance:
prefer-ip-address: true
只使用站点本地地址
spring:
cloud:
inetutils:
use-only-site-local-interfaces: true
eureka:
instance:
prefer-ip-address: true
手动指定IP地址
在某些极端场景下,可以手动指定注册到Eureka Server的微服务IP:
eureka:
instance:
prefer-ip-address: true
ip-address: 127.0.0.1
Eureka的健康检查
只需启用Eureka的健康检查,应用程序就会将自己的健康状态传播到Eureka Server。在微服务application.yml中配置以下内容,即可开启健康检查:
eureka:
client:
healthcheck:
enabled: true
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)