知乎專欄 | 多維度架構 | | | 微信號 netkiller-ebook | | | QQ群:128659835 請註明“讀者” |
<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); } }
web.ribbon.listOfServers=localhost:7900,localhost:7901,localhost:7902
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