2. 服务发现:Eureka 服务器
本节介绍如何搭建Eureka服务器。
2.1. 如何包含Eureka服务器
要在项目中包含 Eureka Server,请使用组 ID 为 的起始文件org.springframework.cloud以及一个伪影IDSpring-cloud-starter-Netflix-Eureka-server.
请参阅 Spring Cloud Project 页面,了解如何使用当前的 Spring Cloud 发布列车来设置你的构建系统。
| 如果你的项目已经使用 Thymeleaf 作为模板引擎,Eureka 服务器的 Freemarker 模板可能加载不正确。此时需要手动配置模板加载器: |
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);
}
}
服务器有一个主页,里面有UI和HTTP API端点,用于Eureka的正常功能。/尤里卡/*.
|
由于Gradle的依赖解析规则以及缺乏父BOM功能,这取决于 build.gradle
|
2.3.defaultOpenForTrafficCount以及它对EurekaServer预热时间的影响
Netflix 尤里卡的waitTimeInMsWhenSyncEmptySpring Cloud Eureka 服务器开头时不考虑设置。为了启用热身时间,设置eureka.server.defaultOpenForTrafficCount=0.
2.4. 高可用性、区域与区域
Eureka服务器没有后端存储,但注册表中的服务实例都必须发送心跳以保持注册信息的更新(因此可以在内存中完成)。 客户端还拥有Eureka注册的内存缓存(因此不必每次请求服务都访问注册表)。
默认情况下,每个Eureka服务器也是Eureka客户端,并且需要(至少一个)服务URL来定位对等端。 如果你不提供,服务会运行并正常工作,但会在日志中充满无法注册的噪音。
2.5. 独立模式
两个缓存(客户端和服务器)和心跳缓存的结合,使得独立的 Eureka 服务器在某种监控或弹性运行时(如 Cloud Foundry)的维护下,具有相当的故障韧性。 在独立模式下,你可能更愿意关闭客户端行为,这样它就不会一直尝试但无法连接到对等端。 以下示例展示了如何关闭客户端行为:
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
注意服务网址指向与本地实例相同的主机。
2.6. 同伴意识
通过运行多个实例并要求它们相互注册,Eureka可以变得更加有弹性和可用。
事实上,这是默认行为,所以你只需要添加一个有效的服务网址与对等体,如下例所示:
---
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 文件,可以用来在两个主机上运行同一台服务器(对等1和Peer2通过在不同的 Spring 配置文件中运行。
你可以用这种配置测试单台主机上的对等感知(在生产环境中这样做没什么价值),通过作/等等/主持人用来解析主机名称。
事实上,Eureka.instance.hostname如果你运行在已知自身主机名的机器上(默认情况下,通过以下方式查找)则不需要java.net.Inet地址).
你可以向系统添加多个节点,只要它们至少通过一条边相互连接,它们就会同步 登记在彼此之间。 如果对等节点物理上分隔(在数据中心内或多个数据中心之间),那么系统原则上可以承受“分脑”类型的故障。 你可以向系统添加多个节点,只要它们都是 它们直接连接时会同步 登记在彼此之间。
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.7. 何时优先选择IP地址
在某些情况下,Eureka更倾向于广告服务的IP地址而非主机名。
设置eureka.instance.preferIpAddress自true当应用程序向Eureka注册时,使用其IP地址而非主机名。
|
如果Java无法确定主机名,则将IP地址发送给Eureka。
唯一明确设置主机名的方法是 |
2.8. 保护尤里卡服务器
你只需在你的 Eureka 服务器中添加 Spring Security 即可保护你的 Eureka 服务器
服务器的类路径通过Spring Boot启动.默认情况下,当 Spring Security 在类路径上时,它会要求
每次请求应用时都会发送有效的 CSRF Tokens。尤里卡客户通常不会拥有有效的
跨站请求伪造(CSRF)Tokens,你需要关闭该要求/尤里卡/**端点。
例如:
@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 Samples 仓库中有一个演示版的 Eureka 服务器。
2.9. JDK 11支援
尤里卡服务器依赖的JAXB模块在JDK 11中被移除。如果你打算用JDK 11 运行Eureka服务器时,必须在POM或Gradle文件中包含这些依赖。
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
</dependency>