2.Eureka Server
本节介绍如何设置Eureka服务器。
2.1项目导入Eureka-server依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2.2如何运行Eureka服务器
下面的例子显示了一个最小的Eureka服务器:
@SpringBootApplication
@EnableEurekaServer
public class Application {
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).web(true).run(args);
}
}
服务器有一个主页,在 /Eureka/* 下有一个用于正常Eureka功能的UI和HTTP API端点。
以下链接有一些Eureka的背景阅读:flux capacitor and google group discussion.
由于Gradle的依赖解决规则和缺少父bom特性,依赖spring-cloud-starter-netflix-eureka-server可能会导致应用程序启动失败。为了解决这个问题,添加Spring Boot Gradle插件并导入Spring cloud starter父bom如下:
build.gradle。
buildscript {
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:{spring-boot-docs-version}")
}
}
apply plugin: "spring-boot"
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:{spring-cloud-version}"
}
}
2.3高可用性、Zones and Regions
Eureka服务器没有后端存储,但是注册表中的服务实例都必须发送心跳来保持它们的注册是最新的(因此这可以在内存中完成)。客户端还有一个Eureka注册的内存缓存(这样他们就不必每次向服务请求时都去注册中心)。
默认情况下,每个Eureka服务器也是一个Eureka客户机,需要(至少一个)服务URL来定位对等点。如果您不提供它,服务就会运行并正常工作,但是它会给您的日志带来很多关于无法向对等方注册的噪音。
有关Zones and Regions的客户端Ribbon支持的详细信息,请参阅下面的内容。
2.4独立模式
这两个缓存(客户机和服务器)和心跳的组合使一个独立的Eureka服务器能够相当灵活地应对失败,只要有某种类型的监视器或弹性运行时(如云计算)保持它的活力。在独立模式下,您可能更喜欢关闭客户端行为,这样它就不会一直尝试,也不会失败。下面的例子展示了如何关闭客户端行为:
application.yml (独立的 Eureka Server).
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
注意,serviceUrl指向与本地实例相同的主机。
2.5对等意识
通过运行多个实例并让它们相互注册,Eureka可以变得更有弹性和可用性。实际上,这是一种默认行为,所以要使其正常工作,您所需要做的就是向对等服务器添加一个有效的serviceUrl,如下面的示例所示:
application.yml (两个对等感知的Eureka Servers).
---
spring:
profiles: peer1
eureka:
instance:
hostname: peer1
client:
serviceUrl:
defaultZone: http://peer2/eureka/
---
spring:
profiles: peer2
eureka:
instance:
hostname: peer2
client:
serviceUrl:
defaultZone: http://peer1/eureka/
在前面的示例中,我们有一个YAML文件,通过在不同的Spring配置文件中运行它,可以在两台主机(peer1和peer2)上运行同一个服务器。通过操作/etc/hosts来解析主机名,您可以使用此配置在单个主机上测试对等感知(在生产环境中这样做没有多大价值)。事实上,eureka.instance.hostname
如果在知道自己主机名的机器上运行,则不需要主机名(默认情况下,通过使用java.net.InetAddress查找主机名)。
您可以向系统添加多个对等点,并且,只要它们都通过至少一条边互相连接,它们之间就会同步注册。如果对等点在物理上是分开的(在数据中心内部或在多个数据中心之间),那么系统原则上可以在“裂脑”类型的故障中存活。您可以向系统中添加多个对等点,只要它们彼此都是直接连接的,它们就会在彼此之间同步注册。
application.yml (三个对等感知的Eureka Servers).
eureka:
client:
serviceUrl:
defaultZone: http://peer1/eureka/,http://peer2/eureka/,http://peer3/eureka/
---
spring:
profiles: peer1
eureka:
instance:
hostname: peer1
---
spring:
profiles: peer2
eureka:
instance:
hostname: peer2
---
spring:
profiles: peer3
eureka:
instance:
hostname: peer3
2.6何时选择IP地址
252/5000
在某些情况下,Eureka更可取的做法是公布服务的IP地址,而不是主机名。设置eureka.instance.preferIpAddress = true
。当应用程序在eureka注册时,它使用它的IP地址而不是主机名。
如果Java无法确定主机名,那么IP地址将发送给Eureka。唯一明确的设置主机名的方法是设置eureka.instance.hostname
。主机名。您可以使用环境变量在运行时设置主机名—例如,eureka.instance.hostname=${HOST_NAME}。
2.7保护Eureka服务器
您可以通过Spring -boot-start - Security将Spring安全性添加到服务器的类路径,从而保护您的Eureka服务器。默认情况下,当Spring Security在类路径上时,它将要求在向应用程序发送每个请求时发送一个有效的CSRF令牌。Eureka客户机通常不会拥有一个有效的跨站点请求伪造(cross site request forgery, CSRF)令牌,您需要禁用/Eureka/**端点的这一要求。例如:
@EnableWebSecurity
class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().ignoringAntMatchers("/eureka/**");
super.configure(http);
}
}
有关CSRF的更多信息,请参阅Spring Security文档。
在Spring Cloud示例repo中可以找到Eureka服务器的演示。
https://github.com/spring-cloud-samples/eureka/tree/Eureka-With-Security