【系統架構理論】一篇文章精通:Spring Cloud Netflix Eureka

是官方文檔的總結

http://spring.io/projects/spring-cloud-netflix#overview

講解基于2.0.2版本官方文檔

https://cloud.spring.io/spring-cloud-static/spring-cloud-netflix/2.0.2.RELEASE/single/spring-cloud-netflix.html

Netflix提供了以下功能:

  • 服務發現:可以注冊Eureka實例,客戶端可以使用Spring的beans來發現這些實例
  • 服務發現:可以通過聲明式Java配置來創建一個嵌入式Eureka服務器
  • 斷路器:可以通過簡單的注解修飾方法來創建一個斷路器客戶端
  • 斷路器:使用聲明式Java配置可以嵌入一個Hystrix儀表盤
  • 客戶端負載均衡器:Ribbon
  • 外部配置:從Spring環境到Archaius的橋梁(允許使用SpringBoot約定對Netflix組件進行本地配置)
  • 路由器和過濾器:Zuul過濾器的自動重新配置,和用于反向創建代理的配置方法的簡單約定。

?

一、服務發現:Eureka客戶端

服務發現是基于微服務的體系結構的核心原則之一。嘗試手工配置每個客戶端或某種形式的約定可能很困難,而且很脆弱。Eureka是Netflix服務發現服務器和客戶端。可以將服務器配置和部署為高度可用,每個服務器都將注冊服務的狀態復制給其他服務器。

1.1、包含依賴

group ID:org.springframework.cloud

artifact ID:spring-cloud-starter-netflix-eureka-client

具體版本可以查看http://spring.io/projects/spring-cloud,查看對應Spring?Cloud版本匹配的Eureka客戶端版本

1.2、注冊到Eureka中

當客戶端向Eureka注冊時,它會提供關于自己的元數據,例如主機、端口、健康指示符URL、主頁和其他詳細信息。Eureka從屬于服務的每個實例接收心跳消息。如果心跳在可配置的時間表上失敗,則通常從注冊表中刪除該實例。

@SpringBootApplication
@RestController
public class Application {@RequestMapping("/")public String home() {return "Hello world";}public static void main(String[] args) {new SpringApplicationBuilder(Application.class).web(true).run(args);}
}

?

使用Spring?Boot應用,只要classpath中包含了spring-cloud-starter-netflix-eureka-client,應用就會自動注冊到Eureka服務器

要求通過配置來指向Eureka服務器

eureka:client:serviceUrl:defaultZone: http://localhost:8761/eureka/

?

defaultZone:當客戶端沒有明確指向一個Eureka服務器時,會采用這個默認URL。

默認應用程序名稱(即服務ID)、虛擬主機和非安全端口(從環境獲取)分別為${Spring.application.name}、${Spring.application.name}和${server.port}。

當classpath中包含了spring-cloud-starter-netflix-eureka-client時,使這個應用既是一個Eureka實例(把自己注冊到Eureka服務器中),也是一個Eureka客戶端(他可以查詢Eureka服務器定位其它服務)。

實例行為可以通過eureka.instance.*的屬性來配置,也可以通過設置spring.application.name(作為Eureka服務的ID或VIP)并作為實例行為的默認值。

更多配置屬性的信息,查看這2個Bean:EurekaInstanceConfigBean、EurekaClientConfigBean

https://github.com/spring-cloud/spring-cloud-netflix/tree/master/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaInstanceConfigBean.java

https://github.com/spring-cloud/spring-cloud-netflix/blob/master/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientConfigBean.java

禁止使用Eureka客戶端,可以設置eureka.client.enabled為false

1.3、通過Eureka服務器的驗證

在eureka.client.serviceUrl.defaultZone的路徑中嵌入一個憑證(http://user:password@localhost:8761/eureka),會自動為你提供一個HTTP?basic認證。

如果需要更加復雜的需求,可以創建一個DiscoveryClientOptionalArgs的Bean,并為他注入一個ClientFilter實例,用于客戶端請求服務器時使用。

由于Eureka中的限制,不可能支持每個服務器的basic認證憑據,因此只使用了找到的第一組。

1.4、狀態頁面和健康指標

默認路徑是Spring?Boot中Actuator下的/info和/health地址,

如果你使用非默認上下文路徑或非默認servlet路徑,則需要修改他們。

eureka:instance:statusPageUrlPath: ${server.servletPath}/infohealthCheckUrlPath: ${server.servletPath}/health

?

在Dalston版本中,還要求在更改管理上下文路徑時設置狀態和健康檢查URL。從Edgware開始,這一要求就被刪除了。

1.5、注冊一個安全的應用

如果應用需要通過HTTPS傳輸,可以設置2個屬性

eureka.instance.[nonSecurePortEnabled]=[false]

eureka.instance.[securePortEnabled]=[true]

設置了之后,Eureka客戶端會返回https的地址。Eureka的實例信息也會有一個安全的健康檢查URL

由于Eureka的設計,status頁、home頁并不會因為這個設置變成安全鏈接,需要手動更改。

eureka:instance:statusPageUrl: https://${eureka.hostname}/infohealthCheckUrl: https://${eureka.hostname}/healthhomePageUrl: https://${eureka.hostname}/

?${eureka.hostname}是一個本地占位符,最新版本的Eureka才支持;也可以使用Spring占位符${eureka.instance.hostName}

If your application runs behind a proxy, and the SSL termination is in the proxy (for example, if you run in Cloud Foundry or other platforms as a service), then you need to ensure that the proxy “forwarded” headers are intercepted and handled by the application. If the Tomcat container embedded in a Spring Boot application has explicit configuration for the 'X-Forwarded-\*` headers, this happens automatically. The links rendered by your app to itself being wrong (the wrong host, port, or protocol) is a sign that you got this configuration wrong.

?

1.6、Eureka健康檢查

默認情況下,Eureka使用心跳機制決定一個客戶端是否在線。

除非特殊設置,Eureka客戶端不會通過Actuator來傳遞應用的健康信息。

可以開啟Eureka健康檢查,

。。待補充

?

1.7、Eureka實例和客戶端的元數據

使用eureka.instance.metadataMap可以添加元數據,這些元數據可以在遠程客戶端中獲取。

一般元數據不會改變客戶端的行為,除了那些客戶端能識別到這些元數據的含義,有些元數據Spring?Cloud已經在使用。

這個是用于部署在云平臺,然后可以獲取平臺的一些數據?

?

1.8、使用Eureka客戶端

Eureka客戶端,可以通過Eureka服務器來發現其他服務的實例。

可以使用com.netflix.discovery.EurekaClient

@Autowired
private EurekaClient discoveryClient;public String serviceUrl() {InstanceInfo instance = discoveryClient.getNextServerFromEureka("STORES", false);return instance.getHomePageUrl();
}

?

Do not use the?EurekaClient?in a?@PostConstruct?method or in a?@Scheduledmethod (or anywhere where the?ApplicationContext?might not be started yet). It is initialized in a?SmartLifecycle?(with?phase=0), so the earliest you can rely on it being available is in another?SmartLifecycle?with a higher phase.

1.8.1、禁用Jersey

默認情況下Eureka客戶端使用Jersey進行HTTP通信。

可以通過排除依賴禁用他,然后Spring?Cloud會通過Spring?RestTemplate來進行HTTP通信。

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId><exclusions><exclusion><groupId>com.sun.jersey</groupId><artifactId>jersey-client</artifactId></exclusion><exclusion><groupId>com.sun.jersey</groupId><artifactId>jersey-core</artifactId></exclusion><exclusion><groupId>com.sun.jersey.contribs</groupId><artifactId>jersey-apache-client4</artifactId></exclusion></exclusions>
</dependency>

?

1.9、本地Netflix Eureka客戶端的替代方案

一般不會使用上面的EurekaClient來獲取真正的物理地址。

Spring?Cloud提供了一個Feign和Spring?RestTemplate,可以通過Eureka服務的識別碼(如服務ID或VIP)來訪問服務,而不是通過物理地址。

如果要用一個固定服務器物理地址列表來配置Ribbon,可以通過設置<client>.ribbon.listOfServers,使用一個逗號分隔的物理地址(或hostnames),<client>是客戶端的ID

也可以使用org.springframework.cloud.client.discovery.DiscoveryClient,包含針對服務發現客戶端(不僅是Netflix)的一些API

@Autowired
private DiscoveryClient discoveryClient;public String serviceUrl() {List<ServiceInstance> list = discoveryClient.getInstances("STORES");if (list != null && list.size() > 0 ) {return list.get(0).getUri();}return null;
}

?

1.10、為什么注冊一個服務這么慢?

Being an instance also involves a periodic heartbeat to the registry (through the client’s?serviceUrl) with a default duration of 30 seconds. A service is not available for discovery by clients until the instance, the server, and the client all have the same metadata in their local cache (so it could take 3 heartbeats). You can change the period by setting?eureka.instance.leaseRenewalIntervalInSeconds. Setting it to a value of less than 30 speeds up the process of getting clients connected to other services. In production, it is probably better to stick with the default, because of internal computations in the server that make assumptions about the lease renewal period.

作為一個實例,還涉及到注冊表的周期性心跳(通過客戶端的serviceUrl),默認持續時間為30秒。直到實例、服務器和客戶端在其本地緩存中都有相同的元數據(因此可能需要3次心跳),客戶端才能發現服務。可以通過設置eureka.instance.leaseRenewalIntervalInSeconds.更改期間將其設置為小于30的值可以加快將客戶端連接到其他服務的過程。在生產中,可能最好還是堅持默認的做法,因為服務器中的內部計算會對租約續訂期做出假設。

?

1.11、分區

如果你的Eureka客戶端分開了幾個區域,并且希望調用服務時,先在相同區域調用服務,然后才調用其它區域的服務。

這就需要進行正確的配置。

首先,要吧Eureka服務器部署到每一個區域,并且他們之間是對等服務器

然后,你需要告訴Eureka服務器,你的服務是在哪一個區域,可以通過修改metadataMap屬性來實現

//Service 1 in Zone 1
eureka.instance.metadataMap.zone = zone1
eureka.client.preferSameZoneEureka = true
//Service 1 in Zone 2
eureka.instance.metadataMap.zone = zone2
eureka.client.preferSameZoneEureka = true

?

二、Eureka服務器

2.1、如何包含Eureka服務器

group ID:org.springframework.cloud

artifact ID:spring-cloud-starter-netflix-eureka-server

具體版本可以查看http://spring.io/projects/spring-cloud,查看對應Spring?Cloud版本匹配的Eureka客戶端版本

2.2、運行一個Eureka服務器

@SpringBootApplication
@EnableEurekaServer
public class Application {public static void main(String[] args) {new SpringApplicationBuilder(Application.class).web(true).run(args);}}

?

服務器有一個首頁和一些HTTP API端點在/eureka/*下

有幾個Eureka的討論網站?

https://github.com/cfregly/fluxcapacitor/wiki/NetflixOSS-FAQ#eureka-service-discovery-load-balancer

https://groups.google.com/forum/?fromgroups#!topic/eureka_netflix/g3p2r7gHnN0

Due to Gradle’s dependency resolution rules and the lack of a parent bom feature, depending on?spring-cloud-starter-netflix-eureka-server?can cause failures on application startup. To remedy this issue, add the Spring Boot Gradle plugin and import the Spring cloud starter parent bom as follows:

build.gradle.?

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、高可用,分區與區域(High Availability, Zones and Regions)

Eureka沒有后端存儲,但是服務實例必須保持發送心跳消息來保持他們的注冊是最新的(在內存中實現)。

客戶端也有一個對Eureka注冊服務的內存緩存,這使得不用每一次調用服務,都去查找一次注冊的服務。

默認情況下,每個Eureka服務器也是Eureka客戶端,需要(至少一個)服務URL來定位對等服務器。如果你不提供,服務也能運行,只是在日志中會增加大量無法向服務器注冊的信息。

?

2.4、單例模式

通過2個緩存(服務器、客戶端)以及心跳機制,使得只要提供一些監控或者運行時彈性(如Cloud?Foundry)保持一個Eureka服務器持續運行,他就有很強的抗錯誤彈性。

在單例模式下,你可以考慮關閉掉客戶端行為,就不會一直嘗試注冊到不存在的服務器路徑失敗

關閉掉客戶端

server:port: 8761eureka:instance:hostname: localhostclient:registerWithEureka: falsefetchRegistry: falseserviceUrl:defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

?

注意defaultZone指向本地Eureka實例

?

2.5、同伴意識

Eureka可以通過運行多個實例,并互相注冊,來實現更高可用高彈性。

實際上,這是一個默認行為,只需要指定一個可用的serviceUrl給同伴即可。

---
spring:profiles: peer1
eureka:instance:hostname: peer1client:serviceUrl:defaultZone: http://peer2/eureka/---
spring:profiles: peer2
eureka:instance:hostname: peer2client:serviceUrl:defaultZone: http://peer1/eureka/

在前面的示例中,我們有一個YAML文件,通過在不同的Spring profiles中運行該文件,可以在兩個主機(peer 1和peer 2)上運行相同的服務器。您可以使用此配置來通過操作/etc/host來解析主機名來測試單個主機上的對等感知(在生產中這樣做沒有多大價值)。實際上,如果在知道自己主機名的機器上運行(默認情況下,使用java.net.InetAddress查找),則不需要eureka.instance.hostname。

你可以添加多個同伴到一個系統中,只要他們互相通過至少一個連接而相連,他們之間的注冊實例就會互相同步。如果這些同伴是物理隔離的,那么這個系統就有能力抵抗腦裂(split-brain)失敗。

eureka:client:serviceUrl:defaultZone: http://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地址二不是hostname

如果主機名不能由Java確定,則將IP地址發送給Eureka。惟一明確設置主機名的方法是設置eureka.instance.hostname屬性。可以通過使用環境變量(例如eureka.instance.hostname=${host_name})在運行時設置主機名。

2.7、保護Eureka服務器

您只需通過spring-boot-starter-security將Spring Security添加到服務器的類路徑中,就可以保護您的Eureka服務器。默認情況下,當Spring Security在類路徑上時,它將要求在向應用程序的每個請求中發送一個有效的CSRF令牌。Eureka客戶端通常不會擁有有效的跨站點請求偽造(CSRF)令牌,您需要對/eureka/*端點禁用此要求。例如:

@EnableWebSecurity
class WebSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.csrf().ignoringAntMatchers("/eureka/**");
        super.configure(http);
    }
}

?

轉載于:https://www.cnblogs.com/LiveYourLife/p/10312674.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387545.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387545.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387545.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Flink DataStream 編程入門

流處理是 Flink 的核心&#xff0c;流處理的數據集用 DataStream 表示。數據流從可以從各種各樣的數據源中創建&#xff08;消息隊列、Socket 和 文件等&#xff09;&#xff0c;經過 DataStream 的各種 transform 操作&#xff0c;最終輸出文件或者標準輸出。這個過程跟之前文…

騰訊手游如何提早揭露游戲外掛風險?

目前騰訊SR手游安全測試限期開放免費專家預約&#xff01;點擊鏈接&#xff1a;手游安全測試立即預約&#xff01; 作者&#xff1a;sheldon&#xff0c;騰訊高級安全工程師 商業轉載請聯系騰訊WeTest獲得授權&#xff0c;非商業轉載請注明出處。 文中動圖無法顯示&#xff0c…

基于ARM Cortex-M0+ 的Bootloader 參考

源&#xff1a; 基于ARM Cortex-M0內核的bootloader程序升級原理及代碼解析轉載于:https://www.cnblogs.com/LittleTiger/p/10312784.html

小猿圈web前端之網站性能優化方案

現在前端不僅要能做出一個網站頁面&#xff0c;還要把這個頁面做的炫酷&#xff0c;那需要很大程度的優化&#xff0c;那么怎么優化才更好呢&#xff1f;小猿圈總結了一下自己優化的方案&#xff0c;感興趣的朋友可以看一下。一般網站優化都是優化后臺&#xff0c;如接口的響應…

下面介紹一個開源的OCR引擎Tesseract2。值得慶幸的是雖然是開源的但是它的識別率較高,并不比其他引擎差勁。網上介紹Tessnet2也是當時時間排名第三的識別引擎,只是后來慢慢不維護了,目前是G

下面介紹一個開源的OCR引擎Tesseract2。值得慶幸的是雖然是開源的但是它的識別率較高&#xff0c;并不比其他引擎差勁。網上介紹Tessnet2也是當時時間排名第三的識別引擎&#xff0c;只是后來慢慢不維護了&#xff0c;目前是Google在維護&#xff0c;大家都知道Google 在搞電子…

js 更改json的 key

let t data.map(item > {return{fee: item[費用],companyName1: item.companyName,remark1: item.remark,beginTime1: item.beginTime,endTime1: item.endTime}})console.log(t) 源地址&#xff1a;https://www.cnblogs.com/Marydon20170307/p/8676611.html轉載于:https:/…

1.4版本上線(第八次會議)

在小組成員連夜趕工的奮斗下&#xff0c;終于在昨天深夜成功實現了UI界面功能 至此&#xff0c;我們的系統終于真正可實用而不是局限在命令行進行互動了 由于python嵌入數據庫功能實現難度較大&#xff0c;迫于時間的局限性&#xff0c;我們選擇了用json文件與txt文件進行替代&…

分UV教程

第一步 首先&#xff0c;打開一個練習場景“空中預警機1.max”&#xff08;這事小弟平時的練習做的不好獻丑了&#xff09;。&#xff08;圖01&#xff09; 圖01 第二步 這里我們拿機翼來舉例子&#xff0c;隱藏除機翼意外的其他模型。&#xff08;圖02&#xff09; 圖02 第三步…

k8s系列--- dashboard認證及分級授權

http://blog.itpub.net/28916011/viewspace-2215214/ 因版本不一樣&#xff0c;略有改動 Dashboard官方地址&#xff1a; https://github.com/kubernetes/dashboard dashbord是作為一個pod來運行&#xff0c;需要serviceaccount賬號來登錄。 先給dashboad創建一個專用的認證信息…

JAVA項目開發

16年java軟件開發經驗&#xff0c;全職項目開發&#xff0c;項目可簽合同、開普票和專票。 主要承接項目&#xff1a; 1、網站開發項目 自主開發千帆CMS動態發布系統&#xff0c;基于java/springboot2/jpa/easyui開發&#xff0c;簡單易用&#xff0c;后臺與前端分離&#xff0…

3dmax基本操作

1、基本操作平移視圖&#xff08;你所說的移動&#xff09;&#xff1a;CTRLP&#xff0c;或者用&#xff0c;滾輪。按住鼠標滾輪不放拖動&#xff0c;就行了。旋轉&#xff1a; ALT滾輪。按住ALT鍵不放&#xff0c;利用滾輪的移動&#xff08;滾輪也要按著不放&#xff09…

padding影響整個div的實際寬度

padding影響整個div的實際寬度 1.不讓padding影響整個div的實際寬度 所以要設置css屬性&#xff1a; box-sizing:box-sizingposted on 2019-01-25 16:58 玉貔貅 閱讀(...) 評論(...) 編輯 收藏 轉載于:https://www.cnblogs.com/yupixiu/p/10320564.html

unity3d 任務頭上的血條

人物的名稱與血條的繪制方法很簡單&#xff0c;但是我們需要解決的問題是如何在3D世界中尋找合適的坐標。因為3D世界中的人物是會移動的&#xff0c;它是在3D世界中移動&#xff0c;并不是在2D平面中移動&#xff0c;但是我們需要將3D的人物坐標換算成2D平面中的坐標&#xff0…

如何在C#中使用Win32和其他庫之三

具有內嵌字符數組的結構 某些函數接受具有內嵌字符數組的結構。例如&#xff0c;GetTimeZoneInformation() 函數接受指向以下結構的指針&#xff1a; typedef struct _TIME_ZONE_INFORMATION { LONG Bias; WCHAR StandardName[ 32 ]; SYSTEMTIME Standa…

unity3d 預制體

首先要說明一下什么是預制體&#xff1f; 在Unity3D里面我們叫它Prefab&#xff1b;我們也可以這樣理解&#xff1a;當制作好了游戲組件&#xff08;場景中的任意一個gameobject &#xff09;,我們希望將它制作成一個組件模版&#xff0c;用于批量的套用工作&#xff0c;例如說…

Python小數據池,代碼塊

今日內容一些小的干貨 一. id is 二. 代碼塊三. 小數據池四. 總結python小數據池&#xff0c;代碼塊的最詳細、深入剖析 一. id is 二. 代碼塊三. 小數據池四. 總結一&#xff0c;id&#xff0c;is&#xff0c; 在Python中&#xff0c;id是什么&#xff1f;id是內存地址…

【Wax】使用Wax (framework方式,XCode 4.6)

前情提示&#xff1a;【Wax】使用Wax &#xff08;非framework方式&#xff0c;XCode 4.6&#xff09; 這次&#xff0c;將以framework的方式來使用Wax 那么&#xff0c;讓我們開始吧&#xff01;&#xff01;&#xff01; 準備工作&#xff1a; 下載wax.framework&#xff1a;…

unity3d 簡單動畫

1&#xff0c;動畫系統配置 創建游戲對象并添加Animation組件&#xff0c;然后將動畫文件拖入組件。 進入動畫文件的Debug屬性面板 選中Legacy屬性 選中游戲對象&#xff0c;打開Animation編輯窗口 添加動畫變化屬性 需改關鍵幀的屬性值 配置完成后運行即可得到動畫效果 2&…

人月神話閱讀筆記(二)

今天對人月神話的正文部分進行了閱讀&#xff0c;從人月神話這一部分中了解到缺乏合理的時間進度控制是造成滯后的主要原因&#xff0c;比其他任何事情影響的和還大&#xff0c;書中也對造成這種這種普遍災難的原因進行了并進行了詳細列舉。 首先&#xff0c;我們對估算技術缺乏…

3dmax導出到unity3d下分割動畫

1、在3dmax 導出時候&#xff0c;要導出FBX文件&#xff0c;同時包含動畫&#xff0c;骨骼&#xff0c;皮膚等內容 2、把FBX文件導入到Unity3d后會默認有一個超長的大動畫&#xff0c;就是一個整體的動畫&#xff0c;如圖Take001&#xff0c;這個時候要分割哪部分是跑&#xf…