英文原文链接——Service Discovery: Eureka Clients
本章将介绍如何配置一个Eureka服务器。
2.1 如何引入 Eureka Server
为了在您的项目中使用 Eureka 服务端,需要在 pom 中引入以下依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
注意:如果您的程序中已经使用了 Thymeleaf 作为模板引擎,Eureka 服务端的 Freemarker 模板可能不能正常加载。为此,手动配置模板加载器是有必要的。
application.yml
spring:
freemarker:
template-loader-path: classpath:/templates/
prefer-file-system-access: false
2.2 如何运行一个 Eureka 服务
以下示例将展示如何运行一个最简单的 Eureka 服务:
@SpringBootApplication
@EnableEurekaServer
public class Application {
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).web(true).run(args);
}
}
Eureka服务器有一个带有UI和用于正常 Eureka 功能的HTTP API端点的主页,URL为/eureka/*
。
下面的链接有一些Eureka背景的文章 flux capacitor 和 google group discussion。
注意:由于Gradle的依赖解析规则和缺少父bom特性,依赖spring-cloud-starter-netflix-eureka-server可能会导致应用程序启动失败。为了解决这个问题,添加Spring Boot Gradle插件并导入Spring cloud starter父bom,如下所示:
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)和地区(Regions)
Eureka服务器没有后端存储,但是注册中心中的服务实例都必须发送心跳来保持注册的最新(因此这可以在内存中完成)。客户端也有一个 Eureka 注册中心的内存缓存(因此他们不必为每个服务请求去注册中心)。
默认情况下,每个Eureka服务器也是一个Eureka客户机,并且需要(至少一个)Service URL 来定位服务中心。如果你不提供它(Service URL),服务也会运行和工作,但它会用很多关于找不到服务中心的垃圾信息来填满你的日志。
查看 下面的 Ribbon支持 以获取更多客户端关于区域(Zone)和地区(Region)的详情。
2.4 单机模式
只有有某种监控和或弹性的运行环境(比如 Cloud Foundry)来使它保持活跃,两个内存(客户端 client 和服务端 server)的组合和心跳机制使单机模式对故障具有不错的弹性。单机模式下,您可能更倾向于关闭客户端行为,这样它就不会一直尝试不可用的服务。以下示例将展示如何关闭客户端行为:
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 应指向本地实例的host
2.5. 对等意识
运行多个服务实例并让它们互相注册可以是 Eureka 变得更加可用和可扩展。实际上,这是 Eureka 的默认行为,所以你要做的就是在每个节点上添加一个正确的 serviceUrl
,如下所示:
application.yml (俩个对等互感的Eureka Server)
---
spring:
profiles: peer1
eureka:
instance:
hostname: peer1
client:
serviceUrl:
defaultZone: https://peer2/eureka/
---
spring:
profiles: peer2
eureka:
instance:
hostname: peer2
client:
serviceUrl:
defaultZone: https://peer1/eureka/
上面的例子中,我们编写了一个 YAML 文件用来将一个服务程序和两个不同的 Spring 配置文件运行在两个不同的主机上。您可以使用此配置通过操作 /etc/hosts
解析主机名来测试单个主机上的对等感知(在生产中这样做没有多大价值)。实际上,如果您在一台已知主机名(通常情况下,可以通过java.net.InetAddress
检索)的机器上运行程序, eureka.instance.hostname
不是必要的。
您可以在一个系统中添加多个对等实例,并且只要它们通过至少一条边彼此连接,它们就会在彼此之间同步注册。如果对等点在物理上是分开的(在一个数据中心内或在多个数据中心之间),那么系统原则上可以在“裂脑”类型的故障中存活下来。
application.yml (三个对等互感的 Eureka Server)
eureka:
client:
serviceUrl:
defaultZone: https://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 地址
在某些情况下,Eureka最好公布服务的IP地址,而不是主机名。将eureka.instance.preferIpAddress
设置为true
且应用程序注册到 Eureka 时,它将使用它的IP地址而不是它的主机名。
注意:如果主机名不能使用Java确定,那么IP地址将被发送到Eureka。显式设置主机名的唯一方法是设置
eureka.instance.hostname
属性。您可以在运行时使用环境变量来设置主机名,比如:eureka.instance.hostname=${HOST_NAME}
。
2.7. 保护 Eureka 服务
您可以通过直接添加 spring-boot-starter-security
到 classpath 中来保护您的 Eureka 服务。默认情况下,当Spring Security位于 classpath 中时,它将要求在向应用程序发送的每个请求中都携带一个有效的CSRF令牌。Eureka 客户端通常没有有效的跨站点请求伪造(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示例仓库可以找到一个Eureka Server的演示例子。
2.8. 在Eureka Server and Client starters 中禁用 RibbonEureka Server and
spring-cloud-starter-netflix-eureka-server
和 spring-cloud-starter-netflix-eureka-client
中包含了 spring-cloud-starter-netflix-ribbon
。 因为 Ribbon 负载均衡器现在处于维护模式,我们建议使用 Spring Cloud LoadBalancer
, 它同样包含在了Eureka starters中。
为了达到这个目的,您需要将 spring.cloud.loadbalancer.ribbon.enabled
属性设置为 false
。
然后您就可以在您的项目构建文件中移除 Eureka starters 中 Ribbon相关的依赖了,像这样:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</exclusion>
<exclusion>
<groupId>com.netflix.ribbon</groupId>
<artifactId>ribbon-eureka</artifactId>
</exclusion>
</exclusions>
</dependency>
2.9. JDK 11 支持
Eureka server 依赖的 JAXB 模块在 JDK 11 中移除了。如果您使用 JDK 11 运行 Eureka Server, 您需要在您的 POM 或 GRADLE 文件中包含这些依赖:
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
</dependency>