知乎专栏 | 多维度架构 |
<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"> <modelVersion>4.0.0</modelVersion> <groupId>cn.netkiller.spring.cloud</groupId> <artifactId>netflix.eureka.server</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>eureka.server</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.7.RELEASE</version> <relativePath /> </parent> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-netflix</artifactId> <version>1.3.5.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <skip>true</skip> </configuration> </plugin> </plugins> </build> </project>
package cn.netkiller.spring.cloud.netflix.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 Application { public static void main(String[] args) { System.out.println("Hello World!"); // new SpringApplicationBuilder(Application.class).web(true).run(args); SpringApplication.run(Application.class, args); } }
server.port=8761 eureka.client.register-with-eureka=false eureka.client.fetch-registry=false eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/ logging.level.com.netflix.eureka=OFF logging.level.com.netflix.discovery=OFF
<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"> <modelVersion>4.0.0</modelVersion> <groupId>cn.netkiller.spring.cloud</groupId> <artifactId>eureka.client</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>eureka.client</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.7.RELEASE</version> <relativePath /> </parent> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-netflix</artifactId> <version>1.3.5.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <skip>true</skip> </configuration> </plugin> </plugins> </build> </project>
package cn.netkiller.spring.cloud.eureka.client; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.context.annotation.Configuration; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @Configuration @EnableAutoConfiguration @EnableEurekaClient @RestController public class Application { @RequestMapping("/") public String home() { return "Hello World"; } public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
package cn.netkiller.spring.cloud.eureka.client; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class TestRestController { private static final Logger logger = LoggerFactory.getLogger(TestRestController.class); @RequestMapping("/") public String version() { logger.info("Hello!!!"); return "Version: v1.0.0"; } @RequestMapping(value = "/add", method = RequestMethod.GET) public Integer add(@RequestParam Integer a, @RequestParam Integer b) { Integer r = a + b; return r; } @RequestMapping("/greeting") public String greeting() { return "GREETING"; } }
spring.application.name=test-service server.port=8080 eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
<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"> <modelVersion>4.0.0</modelVersion> <groupId>cn.netkiller.spring.cloud.netflix</groupId> <artifactId>feign.client</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>feign.client</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.3.RELEASE</version> <relativePath /> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> <version>1.3.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> <version>1.3.1.RELEASE</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <skip>true</skip> </configuration> </plugin> </plugins> </build> </project>
package cn.netkiller.spring.cloud.netflix.feign.client; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.netflix.feign.EnableFeignClients; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @EnableEurekaClient @EnableFeignClients @RestController public class Application { @Autowired private GreetingClient greetingClient; @RequestMapping("/get-greeting") public String greeting() { return greetingClient.greeting(); } public static void main(String[] args) { SpringApplication.run(Application.class, args); System.out.println("Hello World!"); } }
package cn.netkiller.spring.cloud.netflix.feign.client; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.RequestMapping; @FeignClient("test-service") public interface GreetingClient { @RequestMapping("/greeting") String greeting(); }
@FeignClient("test-service") 是 Eureka Client application.properties 中的 spring.application.name 配置项
@RequestMapping("/greeting") 是 Eureka Client RestController 中的 @RequestMapping
spring.application.name=spring-cloud-eureka-feign-client server.port=8088 #eureka.client.register-with-eureka=false #eureka.client.fetch-registry=false eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/ feign.compression.response.enabled=true feign.compression.request.enabled=true feign.compression.request.mime-types=text/xml,application/xml,application/json feign.compression.request.min-request-size=2048
@FeignClient(value = "restful-api-service", fallback = UserServiceFeignClientFallback.class) public interface UserServiceFeignClient { @RequestMapping(value = "/api/user/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) User getUser(@PathVariable("id") int id); @RequestMapping(value = "/api/user/search/findByName?name={name}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) User findUserByName(@PathVariable("name") String name); @RequestMapping(value = "/api/user/search/findByAddress?address={address}", method = RequestMethod.GET) String findUserByAddress(@PathVariable("address") String address); }
@Component public class UserServiceFeignClientFallback implements UserServiceFeignClient { @Override public User getUser(int id) { return new User("getUser.Fallback", "feignClient return"); } @Override public User findUserByName(String name) { return new User("findUserByName.Fallback", "feignClient return"); } @Override public String findUserByAddress(String address) { return "fallback"; } }
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
spring.application.name=restful-api-service eureka.client.serviceUrl.defaultZone=http://eureka:s3cr3t@localhost:8761/eureka/
neo@MacBook-Pro-Neo ~ % curl http://localhost:8761/eureka/apps <applications> <versions__delta>1</versions__delta> <apps__hashcode></apps__hashcode> </applications>
Spring Cloud Eureka 配置参数说明
Eureka Client 配置项(eureka.client.*) org.springframework.cloud.netflix.eureka.EurekaClientConfigBean 参数名称 说明 默认值 eureka.client.enabled 用于指示Eureka客户端已启用的标志 true eureka.client.registry-fetch-interval-seconds 指示从eureka服务器获取注册表信息的频率(s) 30 eureka.client.instance-info-replication-interval-seconds 更新实例信息的变化到Eureka服务端的间隔时间,(s) 30 eureka.client.initial-instance-info-replication-interval-seconds 初始化实例信息到Eureka服务端的间隔时间,(s) 40 eureka.client.eureka-service-url-poll-interval-seconds 询问Eureka Server信息变化的时间间隔(s),默认为300秒 300 eureka.client.eureka-server-read-timeout-seconds 读取Eureka Server 超时时间(s),默认8秒 8 eureka.client.eureka-server-connect-timeout-seconds 连接Eureka Server 超时时间(s),默认5秒 5 eureka.client.eureka-server-total-connections 获取从eureka客户端到所有eureka服务器的连接总数,默认200个 200 eureka.client.eureka-server-total-connections-per-host 获取从eureka客户端到eureka服务器主机允许的连接总数,默认50个 50 eureka.client.eureka-connection-idle-timeout-seconds 连接到 Eureka Server 空闲连接的超时时间(s),默认30 30 eureka.client.registry-refresh-single-vip-address 指示客户端是否仅对单个VIP的注册表信息感兴趣,默认为null null eureka.client.heartbeat-executor-thread-pool-size 心跳保持线程池初始化线程数,默认2个 2 eureka.client.heartbeat-executor-exponential-back-off-bound 心跳超时重试延迟时间的最大乘数值,默认10 10 eureka.client.serviceUrl.defaultZone 可用区域映射到与eureka服务器通信的完全限定URL列表。每个值可以是单个URL或逗号分隔的备用位置列表。(http://${eureka.instance.hostname}:${server.port}/eureka/) eureka.client.use-dns-for-fetching-service-urls 指示eureka客户端是否应使用DNS机制来获取要与之通信的eureka服务器列表。当DNS名称更新为具有其他服务器时,eureka客户端轮询eurekaServiceUrlPollIntervalSeconds中指定的信息后立即使用该信息。 false eureka.client.register-with-eureka 指示此实例是否应将其信息注册到eureka服务器以供其他服务发现,默认为false True eureka.client.prefer-same-zone-eureka 实例是否使用同一zone里的eureka服务器,默认为true,理想状态下,eureka客户端与服务端是在同一zone下 true eureka.client.log-delta-diff 是否记录eureka服务器和客户端之间在注册表的信息方面的差异,默认为false false eureka.client.disable-delta 指示eureka客户端是否禁用增量提取 false eureka.client.fetch-remote-regions-registry 逗号分隔的区域列表,提取eureka注册表信息 eureka.client.on-demand-update-status-change 客户端的状态更新到远程服务器上,默认为true true eureka.client.allow-redirects 指示服务器是否可以将客户端请求重定向到备份服务器/集群。如果设置为false,则服务器将直接处理请求。如果设置为true,则可以将HTTP重定向发送到具有新服务器位置的客户端。 false eureka.client.availability-zones.* 获取此实例所在区域的可用区域列表(在AWS数据中心中使用)。更改在运行时在registryFetchIntervalSeconds指定的下一个注册表获取周期生效。 eureka.client.backup-registry-impl 获取实现BackupRegistry的实现的名称,该实现仅在eureka客户端启动时第一次作为后备选项获取注册表信息。 对于需要额外的注册表信息弹性的应用程序,可能需要这样做,否则它将无法运行。 eureka.client.cache-refresh-executor-exponential-back-off-bound 在发生一系列超时的情况下,它是重试延迟的最大乘数值。 10 eureka.client.cache-refresh-executor-thread-pool-size 缓存刷新线程池初始化线程数量 2 eureka.client.client-data-accept 客户端数据接收的名称 full eureka.client.decoder-name 解码器名称 eureka.client.dollar-replacement eureka服务器序列化/反序列化的信息中获取“$”符号的替换字符串。默认为“_-” eureka.client.encoder-name 编码器名称 eureka.client.escape-char-replacement eureka服务器序列化/反序列化的信息中获取“_”符号的的替换字符串。默认为“__“ eureka.client.eureka-server-d-n-s-name 获取要查询的DNS名称来获得eureka服务器,此配置只有在eureka服务器ip地址列表是在DNS中才会用到。默认为null null eureka.client.eureka-server-port 获取eureka服务器的端口,此配置只有在eureka服务器ip地址列表是在DNS中才会用到。默认为null null eureka.client.eureka-server-u-r-l-context 表示eureka注册中心的路径,如果配置为eureka,则为http://ip:port/eureka/, 在eureka的配置文件中加入此配置表示eureka作为客户端向注册中心注册,从而构成eureka集群。此配置只有在eureka服务器ip地址列表是在DNS中才会用到,默认为null null eureka.client.fetch-registry 客户端是否获取eureka服务器注册表上的注册信息,默认为true true eureka.client.filter-only-up-instances 是否过滤掉非up实例,默认为true true eureka.client.g-zip-content 当服务端支持压缩的情况下,是否支持从服务端获取的信息进行压缩。默认为true eureka.client.property-resolver 属性解析器 eureka.client.proxy-host 获取eureka server 的代理主机名 null eureka.client.proxy-password 获取eureka server 的代理主机密码 null eureka.client.proxy-port 获取eureka server 的代理主机端口 null eureka.client.proxy-user-name 获取eureka server 的代理用户名 null eureka.client.region 获取此实例所在的区域(在AWS数据中心中使用)。 us-east-1 eureka.client.should-enforce-registration-at-init client 在初始化阶段是否强行注册到注册中心 false eureka.client.should-unregister-on-shutdown client在shutdown情况下,是否显示从注册中心注销 true 服务实例配置项(eureka.instance.*) org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean 参数名称 说明 默认值 eureka.instance.appname 注册到注册中心的应用名称 unknown eureka.instance.a-s-g-name 注册到注册中心的应用所属分组名称(AWS服务器) null eureka.instance.app-group-name 注册到注册中心的应用所属分组名称 null eureka.instance.data-center-info 指定服务实例所属数据中心 eureka.instance.instance-enabled-onit 指示是否应在eureka注册后立即启用实例以获取流量 false eureka.instance.non-secure-port http通信端口 80 eureka.instance.non-secure-port-enabled 是否启用HTTP通信端口 ture eureka.instance.secure-port HTTPS通信端口 443 eureka.instance.secure-port-enabled 是否启用HTTPS通信端口 false eureka.instance.secure-virtual-host-name 服务实例安全主机名称(HTTPS) unknown eureka.instance.virtual-host-name 该服务实例非安全注解名称(HTTP) unknown eureka.instance.secure-health-check-url 该服务实例安全健康检查地址(URL),绝对地址 eureka.instance.lease-renewal-interval-in-seconds 该服务实例向注册中心发送心跳间隔(s) 30 eureka.instance.lease-expiration-duration-in-seconds 指示eureka服务器在删除此实例之前收到最后一次心跳之后等待的时间(s) 90 eureka.instance.metadata-map.* eureka.instance.ip-address 该服务实例的IP地址 null eureka.instance.prefer-ip-address 是否优先使用服务实例的IP地址,相较于hostname false eureka.instance.status-page-url 该服务实例的状态检查地址(url),绝对地址 null eureka.instance.status-page-url-path 该服务实例的状态检查地址,相对地址 /actuator/info eureka.instance.home-page-url 该服务实例的主页地址(url),绝对地址 eureka.instance.home-page-url-path 该服务实例的主页地址,相对地址 / eureka.instance.health-check-url 该服务实例的健康检查地址(url),绝对地址 null eureka.instance.health-check-url-path 该服务实例的健康检查地址,相对地址 /actuator/health eureka.instance.instance-id 该服务实例在注册中心的唯一实例ID eureka.instance.hostname 该服务实例所在主机名 eureka.instance.namespace 获取用于查找属性的命名空间。 在Spring Cloud中被忽略。 eureka eureka.instance.environment 该服务实例环境配置 eureka.instance.default-address-resolution-order 默认地址解析顺序 eureka.instance.initial-status 该服务实例注册到Eureka Server 的初始状态 up eureka.instance.registry.default-open-for-traffic-count 【Eureka Server 端属性】默认开启通信的数量 1 eureka.instance.registry.expected-number-of-renews-per-min 【Eureka Server 端属性】每分钟续约次数 1 Eureka Server 配置项(eureka.server.*) org.springframework.cloud.netflix.eureka.server.EurekaServerConfigBean 参数名称 说明 默认值 eureka.server.enable-self-preservation 启用自我保护机制,默认为true true eureka.server.eviction-interval-timer-in-ms 清除无效服务实例的时间间隔(ms),默认1分钟 60000 eureka.server.delta-retention-timer-interval-in-ms 清理无效增量信息的时间间隔(ms),默认30秒 30000 eureka.server.disable-delta 禁用增量获取服务实例信息 false eureka.server.log-identity-headers 是否记录登录日志 true eureka.server.rate-limiter-burst-size 限流大小 10 eureka.server.rate-limiter-enabled 是否启用限流 false eureka.server.rate-limiter-full-fetch-average-rate 平均请求速率 100 eureka.server.rate-limiter-throttle-standard-clients 是否对标准客户端进行限流 false eureka.server.rate-limiter-registry-fetch-average-rate 服务注册与拉取的平均速率 500 eureka.server.rate-limiter-privileged-clients 信任的客户端列表 eureka.server.renewal-percent-threshold 15分钟内续约服务的比例小于0.85,则开启自我保护机制,再此期间不会清除已注册的任何服务(即便是无效服务) 0.85 eureka.server.renewal-threshold-update-interval-ms 更新续约阈值的间隔(分钟),默认15分钟 15 eureka.server.response-cache-auto-expiration-in-seconds 注册信息缓存有效时长(s),默认180秒 180 eureka.server.response-cache-update-interval-ms 注册信息缓存更新间隔(s),默认30秒 30 eureka.server.retention-time-in-m-s-in-delta-queue 保留增量信息时长(分钟),默认3分钟 3 eureka.server.sync-when-timestamp-differs 当时间戳不一致时,是否进行同步 true eureka.server.use-read-only-response-cache 是否使用只读缓存策略 true 自定义工具设置 eureka.server.json-codec-name Json编解码器名称 eureka.server.property-resolver 属性解析器名称 eureka.server.xml-codec-name Xml编解码器名称 Eureka Server 集群配置 eureka.server.enable-replicated-request-compression 复制数据请求时,数据是否压缩 false eureka.server.batch-replication 节点之间数据复制是否采用批处理 false eureka.server.max-elements-in-peer-replication-pool 备份池最大备份事件数量,默认1000 1000 eureka.server.max-elements-in-status-replication-pool 状态备份池最大备份事件数量,默认1000 1000 eureka.server.max-idle-thread-age-in-minutes-for-peer-replication 节点之间信息同步线程最大空闲时间(分钟) 15 eureka.server.max-idle-thread-in-minutes-age-for-status-replication 节点之间状态同步线程最大空闲时间(分钟) 10 eureka.server.max-threads-for-peer-replication 节点之间信息同步最大线程数量 20 eureka.server.max-threads-for-status-replication 节点之间状态同步最大线程数量 1 eureka.server.max-time-for-replication 节点之间信息复制最大通信时长(ms) 30000 eureka.server.min-available-instances-for-peer-replication 集群中服务实例最小数量,-1 表示单节点 -1 eureka.server.min-threads-for-peer-replication 节点之间信息复制最小线程数量 5 eureka.server.min-threads-for-status-replication 节点之间信息状态同步最小线程数量 1 eureka.server.number-of-replication-retries 节点之间数据复制时,可重试次数 5 eureka.server.peer-eureka-nodes-update-interval-ms 节点更新数据间隔时长(分钟) 10 eureka.server.peer-eureka-status-refresh-time-interval-ms 节点之间状态刷新间隔时长(ms) 30000 eureka.server.peer-node-connect-timeout-ms 节点之间连接超时时长(ms) 200 eureka.server.peer-node-connection-idle-timeout-seconds 节点之间连接后,空闲时长(s) 30 eureka.server.peer-node-read-timeout-ms 几点之间数据读取超时时间(ms) 200 eureka.server.peer-node-total-connections 集群中节点连接总数 1000 eureka.server.peer-node-total-connections-per-host 节点之间连接,单机最大连接数量 500 eureka.server.registry-sync-retries 节点启动时,尝试获取注册信息的次数 500 eureka.server.registry-sync-retry-wait-ms 节点启动时,尝试获取注册信息的间隔时长(ms) 30000 eureka.server.wait-time-in-ms-when-sync-empty 在Eureka服务器获取不到集群里对等服务器上的实例时,需要等待的时间(分钟) 5
#服务注册中心实例的主机名 eureka.instance.hostname=localhost #注册在Eureka服务中的应用组名 eureka.instance.app-group-name= #注册在的Eureka服务中的应用名称 eureka.instance.appname= #该实例注册到服务中心的唯一ID eureka.instance.instance-id= #该实例的IP地址 eureka.instance.ip-address= #该实例,相较于hostname是否优先使用IP eureka.instance.prefer-ip-address=false #用于AWS平台自动扩展的与此实例关联的组名, eureka.instance.a-s-g-name= #部署此实例的数据中心 eureka.instance.data-center-info= #默认的地址解析顺序 eureka.instance.default-address-resolution-order= #该实例的环境配置 eureka.instance.environment= #初始化该实例,注册到服务中心的初始状态 eureka.instance.initial-status=up #表明是否只要此实例注册到服务中心,立马就进行通信 eureka.instance.instance-enabled-onit=false #该服务实例的命名空间,用于查找属性 eureka.instance.namespace=eureka #该服务实例的子定义元数据,可以被服务中心接受到 eureka.instance.metadata-map.test = test #服务中心删除此服务实例的等待时间(秒为单位),时间间隔为最后一次服务中心接受到的心跳时间 eureka.instance.lease-expiration-duration-in-seconds=90 #该实例给服务中心发送心跳的间隔时间,用于表明该服务实例可用 eureka.instance.lease-renewal-interval-in-seconds=30 #该实例,注册服务中心,默认打开的通信数量 eureka.instance.registry.default-open-for-traffic-count=1 #每分钟续约次数 eureka.instance.registry.expected-number-of-renews-per-min=1 #该实例健康检查url,绝对路径 eureka.instance.health-check-url= #该实例健康检查url,相对路径 eureka.instance.health-check-url-path=/health #该实例的主页url,绝对路径 eureka.instance.home-page-url= #该实例的主页url,相对路径 eureka.instance.home-page-url-path=/ #该实例的安全健康检查url,绝对路径 eureka.instance.secure-health-check-url= #https通信端口 eureka.instance.secure-port=443 #https通信端口是否启用 eureka.instance.secure-port-enabled=false #http通信端口 eureka.instance.non-secure-port=80 #http通信端口是否启用 eureka.instance.non-secure-port-enabled=true #该实例的安全虚拟主机名称(https) eureka.instance.secure-virtual-host-name=unknown #该实例的虚拟主机名称(http) eureka.instance.virtual-host-name=unknown #该实例的状态呈现url,绝对路径 eureka.instance.status-page-url= #该实例的状态呈现url,相对路径 eureka.instance.status-page-url-path=/status
#该客户端是否可用 eureka.client.enabled=true #实例是否在eureka服务器上注册自己的信息以供其他服务发现,默认为true eureka.client.register-with-eureka=false #此客户端是否获取eureka服务器注册表上的注册信息,默认为true eureka.client.fetch-registry=false #是否过滤掉,非UP的实例。默认为true eureka.client.filter-only-up-instances=true #与Eureka注册服务中心的通信zone和url地址 eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/ #client连接Eureka服务端后的空闲等待时间,默认为30 秒 eureka.client.eureka-connection-idle-timeout-seconds=30 #client连接eureka服务端的连接超时时间,默认为5秒 eureka.client.eureka-server-connect-timeout-seconds=5 #client对服务端的读超时时长 eureka.client.eureka-server-read-timeout-seconds=8 #client连接all eureka服务端的总连接数,默认200 eureka.client.eureka-server-total-connections=200 #client连接eureka服务端的单机连接数量,默认50 eureka.client.eureka-server-total-connections-per-host=50 #执行程序指数回退刷新的相关属性,是重试延迟的最大倍数值,默认为10 eureka.client.cache-refresh-executor-exponential-back-off-bound=10 #执行程序缓存刷新线程池的大小,默认为5 eureka.client.cache-refresh-executor-thread-pool-size=2 #心跳执行程序回退相关的属性,是重试延迟的最大倍数值,默认为10 eureka.client.heartbeat-executor-exponential-back-off-bound=10 #心跳执行程序线程池的大小,默认为5 eureka.client.heartbeat-executor-thread-pool-size=5 # 询问Eureka服务url信息变化的频率(s),默认为300秒 eureka.client.eureka-service-url-poll-interval-seconds=300 #最初复制实例信息到eureka服务器所需的时间(s),默认为40秒 eureka.client.initial-instance-info-replication-interval-seconds=40 #间隔多长时间再次复制实例信息到eureka服务器,默认为30秒 eureka.client.instance-info-replication-interval-seconds=30 #从eureka服务器注册表中获取注册信息的时间间隔(s),默认为30秒 eureka.client.registry-fetch-interval-seconds=30 # 获取实例所在的地区。默认为us-east-1 eureka.client.region=us-east-1 #实例是否使用同一zone里的eureka服务器,默认为true,理想状态下,eureka客户端与服务端是在同一zone下 eureka.client.prefer-same-zone-eureka=true # 获取实例所在的地区下可用性的区域列表,用逗号隔开。(AWS) eureka.client.availability-zones.china=defaultZone,defaultZone1,defaultZone2 #eureka服务注册表信息里的以逗号隔开的地区名单,如果不这样返回这些地区名单,则客户端启动将会出错。默认为null eureka.client.fetch-remote-regions-registry= #服务器是否能够重定向客户端请求到备份服务器。 如果设置为false,服务器将直接处理请求,如果设置为true,它可能发送HTTP重定向到客户端。默认为false eureka.client.allow-redirects=false #客户端数据接收 eureka.client.client-data-accept= #增量信息是否可以提供给客户端看,默认为false eureka.client.disable-delta=false #eureka服务器序列化/反序列化的信息中获取“_”符号的的替换字符串。默认为“__“ eureka.client.escape-char-replacement=__ #eureka服务器序列化/反序列化的信息中获取“$”符号的替换字符串。默认为“_-” eureka.client.dollar-replacement="_-" #当服务端支持压缩的情况下,是否支持从服务端获取的信息进行压缩。默认为true eureka.client.g-zip-content=true #是否记录eureka服务器和客户端之间在注册表的信息方面的差异,默认为false eureka.client.log-delta-diff=false # 如果设置为true,客户端的状态更新将会点播更新到远程服务器上,默认为true eureka.client.on-demand-update-status-change=true #此客户端只对一个单一的VIP注册表的信息感兴趣。默认为null eureka.client.registry-refresh-single-vip-address= #client是否在初始化阶段强行注册到服务中心,默认为false eureka.client.should-enforce-registration-at-init=false #client在shutdown的时候是否显示的注销服务从服务中心,默认为true eureka.client.should-unregister-on-shutdown=true # 获取eureka服务的代理主机,默认为null eureka.client.proxy-host= #获取eureka服务的代理密码,默认为null eureka.client.proxy-password= # 获取eureka服务的代理端口, 默认为null eureka.client.proxy-port= # 获取eureka服务的代理用户名,默认为null eureka.client.proxy-user-name= #属性解释器 eureka.client.property-resolver= #获取实现了eureka客户端在第一次启动时读取注册表的信息作为回退选项的实现名称 eureka.client.backup-registry-impl= #这是一个短暂的×××的配置,如果最新的×××是稳定的,则可以去除,默认为null eureka.client.decoder-name= #这是一个短暂的编码器的配置,如果最新的编码器是稳定的,则可以去除,默认为null eureka.client.encoder-name= #是否使用DNS机制去获取服务列表,然后进行通信。默认为false eureka.client.use-dns-for-fetching-service-urls=false #获取要查询的DNS名称来获得eureka服务器,此配置只有在eureka服务器ip地址列表是在DNS中才会用到。默认为null eureka.client.eureka-server-d-n-s-name= #获取eureka服务器的端口,此配置只有在eureka服务器ip地址列表是在DNS中才会用到。默认为null eureka.client.eureka-server-port= #表示eureka注册中心的路径,如果配置为eureka,则为http://x.x.x.x:x/eureka/,在eureka的配置文件中加入此配置表示eureka作为客户端向注册中心注册,从而构成eureka集群。此配置只有在eureka服务器ip地址列表是在DNS中才会用到,默认为null eureka.client.eureka-server-u-r-l-context=
#服务端开启自我保护模式。无论什么情况,服务端都会保持一定数量的服务。避免client与server的网络问题,而出现大量的服务被清除。 eureka.server.enable-self-preservation=true #开启清除无效服务的定时任务,时间间隔。默认1分钟 eureka.server.eviction-interval-timer-in-ms= 60000 #间隔多长时间,清除过期的delta数据 eureka.server.delta-retention-timer-interval-in-ms=0 #过期数据,是否也提供给client eureka.server.disable-delta=false #eureka服务端是否记录client的身份header eureka.server.log-identity-headers=true #请求频率限制器 eureka.server.rate-limiter-burst-size=10 #是否开启请求频率限制器 eureka.server.rate-limiter-enabled=false #请求频率的平均值 eureka.server.rate-limiter-full-fetch-average-rate=100 #是否对标准的client进行频率请求限制。如果是false,则只对非标准client进行限制 eureka.server.rate-limiter-throttle-standard-clients=false #注册服务、拉去服务列表数据的请求频率的平均值 eureka.server.rate-limiter-registry-fetch-average-rate=500 #设置信任的client list eureka.server.rate-limiter-privileged-clients= #在设置的时间范围类,期望与client续约的百分比。 eureka.server.renewal-percent-threshold=0.85 #多长时间更新续约的阈值 eureka.server.renewal-threshold-update-interval-ms=0 #对于缓存的注册数据,多长时间过期 eureka.server.response-cache-auto-expiration-in-seconds=180 #多长时间更新一次缓存中的服务注册数据 eureka.server.response-cache-update-interval-ms=0 #缓存增量数据的时间,以便在检索的时候不丢失信息 eureka.server.retention-time-in-m-s-in-delta-queue=0 #当时间戳不一致的时候,是否进行同步 eureka.server.sync-when-timestamp-differs=true #是否采用只读缓存策略,只读策略对于缓存的数据不会过期。 eureka.server.use-read-only-response-cache=true ################server 自定义实现的配置#####################33 #json的转换的实现类名 eureka.server.json-codec-name= #PropertyResolver eureka.server.property-resolver= #eureka server xml的编解码实现名称 eureka.server.xml-codec-name= ################server node 与 node 之间关联的配置#####################33 #发送复制数据是否在request中,总是压缩 eureka.server.enable-replicated-request-compression=false #指示群集节点之间的复制是否应批处理以提高网络效率。 eureka.server.batch-replication=false #允许备份到备份池的最大复制事件数量。而这个备份池负责除状态更新的其他事件。可以根据内存大小,超时和复制流量,来设置此值得大小 eureka.server.max-elements-in-peer-replication-pool=10000 #允许备份到状态备份池的最大复制事件数量 eureka.server.max-elements-in-status-replication-pool=10000 #多个服务中心相互同步信息线程的最大空闲时间 eureka.server.max-idle-thread-age-in-minutes-for-peer-replication=15 #状态同步线程的最大空闲时间 eureka.server.max-idle-thread-in-minutes-age-for-status-replication=15 #服务注册中心各个instance相互复制数据的最大线程数量 eureka.server.max-threads-for-peer-replication=20 #服务注册中心各个instance相互复制状态数据的最大线程数量 eureka.server.max-threads-for-status-replication=1 #instance之间复制数据的通信时长 eureka.server.max-time-for-replication=30000 #正常的对等服务instance最小数量。-1表示服务中心为单节点。 eureka.server.min-available-instances-for-peer-replication=-1 #instance之间相互复制开启的最小线程数量 eureka.server.min-threads-for-peer-replication=5 #instance之间用于状态复制,开启的最小线程数量 eureka.server.min-threads-for-status-replication=1 #instance之间复制数据时可以重试的次数 eureka.server.number-of-replication-retries=5 #eureka节点间间隔多长时间更新一次数据。默认10分钟。 eureka.server.peer-eureka-nodes-update-interval-ms=600000 #eureka服务状态的相互更新的时间间隔。 eureka.server.peer-eureka-status-refresh-time-interval-ms=0 #eureka对等节点间连接超时时间 eureka.server.peer-node-connect-timeout-ms=200 #eureka对等节点连接后的空闲时间 eureka.server.peer-node-connection-idle-timeout-seconds=30 #节点间的读数据连接超时时间 eureka.server.peer-node-read-timeout-ms=200 #eureka server 节点间连接的总共最大数量 eureka.server.peer-node-total-connections=1000 #eureka server 节点间连接的单机最大数量 eureka.server.peer-node-total-connections-per-host=10 #在服务节点启动时,eureka尝试获取注册信息的次数 eureka.server.registry-sync-retries= #在服务节点启动时,eureka多次尝试获取注册信息的间隔时间 eureka.server.registry-sync-retry-wait-ms= #当eureka server启动的时候,不能从对等节点获取instance注册信息的情况,应等待多长时间。 eureka.server.wait-time-in-ms-when-sync-empty=0 ################server 与 remote 关联的配置#####################33 #过期数据,是否也提供给远程region eureka.server.disable-delta-for-remote-regions=false #回退到远程区域中的应用程序的旧行为 (如果已配置) 如果本地区域中没有该应用程序的实例, 则将被禁用。 eureka.server.disable-transparent-fallback-to-other-region=false #指示在服务器支持的情况下, 是否必须为远程区域压缩从尤里卡服务器获取的内容。 eureka.server.g-zip-content-from-remote-region=true #连接eureka remote note的连接超时时间 eureka.server.remote-region-connect-timeout-ms=1000 #remote region 应用白名单 eureka.server.remote-region-app-whitelist. #连接eureka remote note的连接空闲时间 eureka.server.remote-region-connection-idle-timeout-seconds=30 #执行remote region 获取注册信息的请求线程池大小 eureka.server.remote-region-fetch-thread-pool-size=20 #remote region 从对等eureka加点读取数据的超时时间 eureka.server.remote-region-read-timeout-ms=1000 #从remote region 获取注册信息的时间间隔 eureka.server.remote-region-registry-fetch-interval=30 #remote region 连接eureka节点的总连接数量 eureka.server.remote-region-total-connections=1000 #remote region 连接eureka节点的单机连接数量 eureka.server.remote-region-total-connections-per-host=50 #remote region抓取注册信息的存储文件,而这个可靠的存储文件需要全限定名来指定 eureka.server.remote-region-trust-store= #remote region 储存的文件的密码 eureka.server.remote-region-trust-store-password= #remote region url.多个逗号隔开 eureka.server.remote-region-urls= #remote region url.多个逗号隔开 eureka.server.remote-region-urls-with-name. ################server 与 ASG/AWS/EIP/route52 之间关联的配置#####################33 #缓存ASG信息的过期时间。 eureka.server.a-s-g-cache-expiry-timeout-ms=0 #查询ASG信息的超时时间 eureka.server.a-s-g-query-timeout-ms=300 #服务更新ASG信息的频率 eureka.server.a-s-g-update-interval-ms=0 #AWS访问ID eureka.server.a-w-s-access-id= #AWS安全密钥 eureka.server.a-w-s-secret-key= #AWS绑定策略 eureka.server.binding-strategy=eip #用于从第三方AWS 帐户描述自动扩展分组的角色的名称。 eureka.server.list-auto-scaling-groups-role-name= #是否应该建立连接引导 eureka.server.prime-aws-replica-connections=true #服务端尝试绑定候选EIP的次数 eureka.server.e-i-p-bind-rebind-retries=3 #服务端绑定EIP的时间间隔.如果绑定就检查;如果绑定失效就重新绑定。当且仅当已经绑定的情况 eureka.server.e-i-p-binding-retry-interval-ms=10 #服务端绑定EIP的时间间隔.当且仅当服务为绑定的情况 eureka.server.e-i-p-binding-retry-interval-ms-when-unbound= #服务端尝试绑定route53的次数 eureka.server.route53-bind-rebind-retries=3 #服务端间隔多长时间尝试绑定route53 eureka.server.route53-binding-retry-interval-ms=30 # eureka.server.route53-domain-t-t-l=10
@Configuration public class RibbonConfigure { @LoadBalanced @Bean public RestTemplate restTemplate(){ return new RestTemplate(); } //指定Ribbon使用随机策略 @Bean public IRule loadBalanceRule(){ //return new RandomRule(); List<Integer> ports = new ArrayList<>(); ports.add(8081); return new CustomRule(ports); } }
package cn.netkiller.openfeign.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class TestController { @Autowired private LoadBalancerClient loadBalancerClient; @GetMapping("/lb") public String LoadBalancer() { ServiceInstance serviceInstance = this.loadBalancerClient.choose("web"); System.out.println("Server: " + serviceInstance.getServiceId() + ":" + serviceInstance.getHost() + ":" + serviceInstance.getPort()); return serviceInstance.toString(); } }
spring.cloud.loadbalancer.ribbon.enabled=false
provider.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
RoundRobinRule 轮询策略。Ribbon 默认采用的策略。若经过一轮轮询没有找到可用的 provider,其最多 轮询 10 轮。若最终还没有找到,则返回 null。 RandomRule 随机策略,从所有可用的 provider 中随机选择一个。 RetryRule 重试策略。先按照 RoundRobinRule 策略获取 provider,若获取失败,则在指定的时限内重试。默认的时限为 500 毫秒。 BestAvailableRule 最可用策略。选择并发量最小的 provider,即连接的消费者数量最少的 provider。 AvailabilityFilteringRule 可用过滤算法。该算法规则是:过滤掉处于熔断状态的 provider 与已经超过连接极限的 provider,对剩余 provider 采用轮询策略。 ZoneAvoidanceRule zone 回避策略。根据 provider 所在 zone 及 provider 的可用性,对 provider 进行选择。 WeightedResponseTimeRule “权重响应时间”策略。根据每个 provider 的平均响应时间计算其权重,响应时间越快权重越大,被选中的机率就越高。在刚启动时采用轮询策略。后面就会根据权重进行选择了。
package cn.netkiller.sample; import com.netflix.discovery.EurekaClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import reactor.core.publisher.Mono; @SpringBootApplication @EnableEurekaClient @RestController public class WebFluxApplication { @Autowired @Lazy private EurekaClient eurekaClient; @Value("${spring.application.name}") private String appName; public static void main(String[] args) { SpringApplication.run(WebFluxApplication.class, args); } @GetMapping("/client") public Mono<String> greeting() { String idInEureka = eurekaClient.getApplication(appName).getInstances().get(0).getId(); return Mono.just(String.format("Hello from '%s'!", idInEureka)); } @GetMapping("/client2") public Mono<String> greetingWithParam(@RequestParam(value = "id") Long id) { String idInEureka = eurekaClient.getApplication(appName).getInstances().get(0).getId(); return Mono.just(String.format("Hello with param from '%s'!", idInEureka)); } }
<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"> <modelVersion>4.0.0</modelVersion> <groupId>cn.netkiller</groupId> <artifactId>zuul</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>zuul</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.6.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR2</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> </dependency> </dependencies> </project>
package cn.netkiller.zuul; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; @SpringBootApplication @EnableZuulProxy public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
server: port: 8765 logging: level: ROOT: INFO org.springframework.web: DEBUG zuul: routes: restful: path: /restful/** url: http://api:password@api.netkiller.com:8080/restful