首先,Service A 通过 Eureka Client 发送注册请求(Register)到同一可用区的 Eureka Server 1。之后通过发送心跳请求(Renew)到这个 Eureka Server 1. Eureka Server 1 收到这些请求的时候,会处理这些请求并将这些请求转发到其他的集群内的 Eureka Server 2 和 Eureka Server 3. Eureka Server 2 和 Eureka Server 3 不会再转发收到的 Eureka Server 1 转发过来的请求。然后,Service B 还有 Service C 通过 Eureka 获取到了 Service A 的位置,最后调用了 Service A。
对于本地没有查询到的微服务,Eureka Server 还会从远程 Region 的 Eureka Server 去获取,例如这里对于 Service D,本地没有查到,Eureka Server 会返回远程 Region 的 Service D 的实例。由于本地有 Service A,所以肯定不会返回远程 Region 的 Service A 的实例。并且,本地是定时拉取的远程 Region 的 Service 列表,并不是每次查询的时候现查询的。
一般的,微服务之间的互相调用,并不经过 Eureka,也不会涉及到 Eureka 客户端了,而是通过负载均衡器调用,这个我们后面就会提到。
spring.application.name 指定的服务名称。eureka:
instance:
#一般不用我们自己设置,EurekaInstanceConfigBean 的构造器会通过 InetUtils 获取 ip 地址
#ip-address:
#一般不用我们自己设置,EurekaInstanceConfigBean 的构造器会通过 InetUtils 获取 hostname
#hostname:
#注册到 eureka 上面供其他实例访问的地址使用 ip 进行注册,其他实例会通过 ip 进行访问
prefer-ip-address: true
#不用设置 non-secure-port,自动使用 server.port 作为 non-secure-port
#non-secure-port:
#如果 secure-port-enabled 是 true,则会自动使用 server.port 作为 secure-port;我们一般内部调用不用 ssl,所以不需要配置 secure-port
#secure-port:
#默认是启用 non-secure-port 的
non-secure-port-enabled: true
#默认是不启用 secure-port 的,我们一般内部调用不用 ssl
secure-port-enabled: false
#个性化的实例id,包括 ip:微服务名称:端口
instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
# app名称,不填写在 Spring-cloud-netflix 体系下默认就是 spring.application.name
appname: ${spring.application.name}
#app组名称归类用的,目前也没什么用
app-group-name: common
#实例命名空间,目前也没什么用
namespace: public
eureka:
instance:
# 健康检查地址,默认是 /actuator/health
health-check-url-path: /actuator/health
# 实例状态地址,默认是 /actuator/info
status-page-url-path: /actuator/info
# 首页地址,默认是 /
home-page-url-path: /
eureka:
instance:
# 服务过期时间配置,超过这个时间没有接收到心跳EurekaServer就会将这个实例剔除
# 注意,EurekaServer一定要设置eureka.server.eviction-interval-timer-in-ms否则这个配置无效
# 这个配置一般为服务刷新时间配置的三倍
# 默认90s
lease-expiration-duration-in-seconds: 15
#服务刷新时间配置,每隔这个时间会主动心跳一次
#默认30s
lease-renewal-interval-in-seconds: 5
registry:
#请参考 wait-time-in-ms-when-sync-empty 配置说明
default-open-for-traffic-count: 1
#初始期望发送心跳请求的实例个数,默认为1,在有新实例注册的时候,会 +1,有注销的时候会 -1,初始默认为 1 一般因为自己也注册到 eureka 上
expected-number-of-clients-sending-renews: 1
#实例注册后是否立刻开始服务,默认为 false,一般注册后还需要做一些操作,所以注册实例的状态是 STARTING。后面改变状态后会更新为 UP
instance-enabled-onit: false
eureka:
instance:
#元数据map,我们可以自己使用,放一些个性化的元数据,目前只有 configPath 和 zone 比较有用。 configPath 是使用 spring-cloud-config 的时候会设置
metadata-map:
# spring cloud 体系中,可用区的配置放入元数据中,key 为 zone
zone: zone1
eureka:
instance:
# 可用区列表,key 为 region,value 为 zone
availability-zones:
region1: zone1, zone2
region2: zone3
# 所在区域,通过这个读取 availability-zones 获取 zone,然后通过 zone 读取 service-url 获取对应的 eureka url
# 这里的逻辑对应的类是 ConfigClusterResolver 和 ZoneAffinityClusterResolver
region: region1
# key 为 zone,value 为 eureka 链接,以逗号分隔
service-url:
# 默认eureka集群,这里必须是defaultZone,不能用-替换大写,与其他的配置不一样,因为实在EurekaClientConfigBean里面写死的
defaultZone: http://127.0.0.1:8211/eureka/
zone1: http://127.0.0.1:8212/eureka/
zone2: http://127.0.0.1:8213/eureka/
zone3: http://127.0.0.1:8214/eureka/
# 如果上面 eureka server 地址相关配置更新了,多久之后会重新读取感知到
eureka-service-url-poll-interval-seconds: 300
# 是否使用 dns 获取,如果指定了则通过下面的 dns 配置获取,而不是上面的 service-url
use-dns-for-fetching-service-urls: false
# dns 配置
# eureka-server-d-n-s-name:
# dns 配置的 eureka server 的 port
# eureka-server-port:
# dns 配置的 eureka server 的 port 后面的 uri 前缀 context
# eureka-server-u-r-l-context:
# 如果设置为 true,则同一个 zone 下的 eureka 会跑到前面优先访问。默认为 true
prefer-same-zone-eureka: true
eureka:
instance:
# 是否从 eureka 上面拉取实例
fetch-registry: true
# 如果只想获取一个特定 virtual host name 的实例列表,就配置 registry-refresh-single-vip-address
#registry-refresh-single-vip-address:
# 客户端请求头指定服务端返回的实例信息是压缩的信息还是完整信息,默认是完整信息
# full, compact
client-data-accept: full
# eureka client 刷新本地缓存时间
# 默认30s
registry-fetch-interval-seconds: 5
# eureka client 刷新本地缓存(定时拉取 eureka 实例列表)线程池大小,默认为 2
cache-refresh-executor-thread-pool-size: 2
# eureka client 刷新本地缓存(定时拉取 eureka 实例列表)线程池任务最大延迟时间,这个配置是定时拉取任务延迟(registry-fetch-interval-seconds)的倍数,默认 10 倍
cache-refresh-executor-exponential-back-off-bound: 10
# 是否禁用增量拉取,如果网络条件不好,可以禁用,每次都会拉取全量
disable-delta: false
# 只保留状态为 UP 的实例,默认为 true
filter-only-up-instances: true
#可以指定也从某些 region 拉取服务实例
#fetch-remote-regions-registry:
# 是否打日志记录每次拉取实例信息与当前缓存内的实例信息变化
log-delta-diff: true
#在spring cloud 环境中,DiscoveryClient 用的其实都是 CompositeDiscoveryClient,这个 CompositeDiscoveryClient 逻辑其实就是多个 DiscoveryClient 共存,先访问一个,没找到就通过下一个寻找
#这个order决定了顺序,默认为 0
order: 0
eureka:
instance:
# 是否将自己注册到 eureka 上面
register-with-eureka: true
# 是否在初始化的时候就注册到 eureka,一般设置为 false,因为实例还不能正常提供服务
should-enforce-registration-at-init: false
# 是否在关闭的时候注销实例,默认为 true
should-unregister-on-shutdown: true
# 是否对于实例状态改变更新进行限流,默认为 true
on-demand-update-status-change: true
# 实例信息同定时同步到 Eureka Server 的间隔时间。每隔这么长时间,检查实例信息(即eureka.instance配置信息)是否发生变化,如果发生变化,则同步到 Eureka Server,默认 30s
# 主要检查两类信息,分别是服务地址相关信息,以及服务过期时间与刷新时间配置信息
instance-info-replication-interval-seconds: 30
# 实例信息同定时同步到 Eureka Server 的初始延迟时间,默认 40s
initial-instance-info-replication-interval-seconds: 40
eureka:
instance:
# 代理相关配置
# proxy-host:
# proxy-port:
# proxy-user-name:
# proxy-password:
# 是否对于发往 Eureka Server 的 http 请求启用 gzip,目前已经过期了,只要 Eureka Server 启用了 gzip,请求就是 gzip 压缩的
g-zip-content: true
# httpclient 的链接超时,默认 5s
eureka-server-connect-timeout-seconds: 5
# httpclient 的读取超时,默认 5s
eureka-server-read-timeout-seconds: 8
# httpclient 的空闲连接超时,默认 30s
eureka-connection-idle-timeout-seconds: 30
# httpclient 的总连接数量,默认 200
eureka-server-total-connections: 200
# httpclient 的每个 host 的连接数量
eureka-server-total-connections-per-host: 50
# tls 相关配置,默认没有启用
# tls:
# enabled: false
# key-password:
# key-store:
# key-store-password:
# key-store-type:
# trust-store:
# trust-store-password:
# trust-store-type:
eureka:
server:
#主动检查服务实例是否失效的任务执行间隔,默认是 60s
eviction-interval-timer-in-ms: 3000
#这个配置在两个地方被使用:
#如果启用用了自我保护,则会 renewal-threshold-update-interval-ms 指定的时间内,收到的心跳请求个数是否小于实例个数乘以这个 renewal-percent-threshold
#定时任务检查过期实例,每次最多过期 1 - renewal-percent-threshold 这么多比例的实例
renewal-percent-threshold: 0.85
eureka:
server:
#注意,最好所有的客户端实例配置的心跳时间相关的配置,是相同的。这样使用自我保护的特性最准确。
#关闭自我保护
#我们这里不使用自我保护,因为:
#自我保护主要针对集群中网络出现问题,导致有很多实例无法发送心跳导致很多实例状态异常,但是实际实例还在正常工作的情况,不要让这些实例不参与负载均衡
#启用自我保护的情况下,就会停止对于实例的过期
#但是,如果出现这种情况,其实也代表很多实例无法读取注册中心了。
#并且还有一种情况就是,Eureka 重启。虽然不常见,但是对于镜像中其他的组件更新我们还是很频繁的
#我倾向于从客户端对于实例缓存机制来解决这个问题,如果返回实例列表为空,则使用上次的实例列表进行负载均衡,这样既能解决 Eureka 重启的情况,又能处理一些 Eureka 网络隔离的情况
#自我保护模式基于每分钟需要收到 renew (实例心跳)请求个数,如果启用了自我保护模式,只有上一分钟接收到的 renew 个数,大于这个值,实例过期才会被注销
enable-self-preservation: false
# 每分钟需要收到 renew (实例心跳)请求个数是需要动态刷新的,这个刷新间隔就是 renewal-threshold-update-interval-ms
#更新流程大概是:计算当前一共有多少实例,如果大于之前期望的实例量 * renewal-percent-threshold(或者没开启自我保护模式),则更新期望的实例数量为当前一共有多少实例
#之后根据期望的实例数量,计算期望需要收到的实例心跳请求个数 = 期望的实例数量 * (60 / expected-client-renewal-interval-seconds) * renewal-percent-threshold
#公式中 60 代表一分钟,因为公式用到了 expected-client-renewal-interval-seconds,也就是实例平均心跳间隔,为了使这个公式准确,最好每个实例配置一样的心跳时间
#默认 900000ms = 900s = 15min
renewal-threshold-update-interval-ms: 900000
#上面提到的实例平均心跳间隔,或者说是期望的心跳间隔,为了使这个公式准确,最好每个实例配置一样的心跳时间
#默认 30s
expected-client-renewal-interval-seconds: 30
#这个配置在两个地方被使用:
#如果启用用了自我保护,则会 renewal-threshold-update-interval-ms 指定的时间内,收到的心跳请求个数是否小于实例个数乘以这个 renewal-percent-threshold
#定时任务检查过期实例,每次最多过期 1 - renewal-percent-threshold 这么多比例的实例
renewal-percent-threshold: 0.85
eureka:
server:
#Eureka Server 从配置中更新同一区域内的其他 Eureka Server 实例列表间隔,默认10分钟
peer-eureka-nodes-update-interval-ms: 600000
#启动时从其他 Eureka Server 同步服务实例信息的最大重试次数,直到实例个数不为 0,默认为 0,这样其实就是不同步
registry-sync-retries: 0
#启动时从其他 Eureka Server 同步服务实例信息重试间隔
registry-sync-retry-wait-ms: 30000
#集群内至少有多少个 UP 的 Eureka Server 实例数量,当前 Eureka Server 状态为 UP。默认 -1,也就是 Eureka Server 状态不考虑 UP 的集群内其他 Eureka Server 数量。
min-available-instances-for-peer-replication: -1
#请求其他实例任务的最大超时时间,默认 30 秒
max-time-for-replication: 30000
#用来处理同步任务的线程数量,有两个线程池,一个处理批量同步任务,默认大小为20
max-threads-for-peer-replication: 20
#另一个处理非批量任务(如果没用 AWS Autoscaling 对接相关特性则没有啥用),默认大小为20
max-threads-for-status-replication: 20
#处理批量任务的线程池队列长度,默认为 10000
max-elements-in-peer-replication-pool: 10000
#处理非批量任务的线程池队列长度,默认为 10000
max-elements-in-status-replication-pool: 10000
#Eureka Server 通过 httpclient 访问其他 Eureka Server 同步实例,httpclient 的连接超时,默认 200ms
peer-node-connect-timeout-ms: 200
#httpclient 的读取超时,默认 200ms,一般不用太长
peer-node-read-timeout-ms: 200
#httpclient 的最大总连接数量,默认 1000
peer-node-total-connections: 1000
#httpclient 的对于某一 host 最大总连接数量,默认 500
peer-node-total-connections-per-host: 500
#httpclient 的连接空闲保持时间,默认 30s
peer-node-connection-idle-timeout-seconds: 30
eureka:
server:
#请求其他 Region 的 httpclient 的连接超时,默认 1000ms
remote-region-connect-timeout-ms: 1000
#请求其他 Region 的 httpclient 的读取超时,默认 1000ms
remote-region-read-timeout-ms: 1000
#请求其他 Region 的 httpclient 的最大总连接数量,默认 1000
remote-region-total-connections: 1000
#请求其他 Region 的 httpclient 的对于某一 host 最大总连接数量,默认 500
remote-region-total-connections-per-host: 500
#请求其他 Region 的 httpclient 的连接空闲保持时间,默认 30s
remote-region-connection-idle-timeout-seconds: 30
#请求其他 Region 的 http 请求是否开启 gzip,对于其他 Region 我们认为网络连接是比较慢的,所以默认开启压缩
g-zip-content-from-remote-region: true
# remote-region-urls-with-name:
# region2eureka1: http://127:0:0:1:8212/eureka/
# region2eureka2: http://127:0:0:1:8213/eureka/
# remote-region-app-whitelist:
#如果需要从其他 Region 获取实例信息,这个获取间隔,默认为 30s
remote-region-registry-fetch-interval: 30
#如果需要从其他 Region 获取实例信息,这个任务的线程池,默认为 20个
remote-region-fetch-thread-pool-size: 20
com.netflix.eureka.EurekaBootStrap 代码很类似的启动类,即 org.springframework.cloud.netflix.eureka.server.EurekaServerBootstrap。在我们启动 EurekaServer 实例的时候,只用加入对于 spring-cloud-starter-eureka-server 的依赖即可。之后通过 @EnableEurekaServer 注解即可启动一个 Eureka 服务器实例。
Eureka Server 的依赖:
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>spring-cloud-iiford</artifactId>
<groupId>com.github.hashjang</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>spring-cloud-iiford-eureka-server</artifactId>
<dependencies>
<dependency>
<groupId>com.github.hashjang</groupId>
<artifactId>spring-cloud-iiford-service-common</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
</project>
Eureka Server 的配置:
参考我们上面的配置即可:
application.yml
Eureka Server 的启动类:
EurekaServerApplication.java
package com.github.hashjang.iiford.eureka.server;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po