javascript
浅谈SpringCloud (二) Eureka服务发现组件
上面學習到了如何由一個程序訪問另一個程序,那么如果使用SpringCloud來進行訪問,該如何訪問吶?
可以借助Eureka服務發(fā)現(xiàn)組件進行訪問。
可以借助官方文檔:https://spring.io/projects/spring-cloud?。? 中文文檔:https://springcloud.cc/
Eureka
Spring Cloud 封裝了 Netflix 公司開發(fā)的 Eureka 模塊來實現(xiàn)服務注冊和發(fā)現(xiàn)。Eureka 采用了 C-S 的設計架構(gòu)。Eureka Server 作為服務注冊功能的服務器,它是服務注冊中心。而系統(tǒng)中的其他微服務,使用 Eureka 的客戶端連接到 Eureka Server,并維持心跳連接。這樣系統(tǒng)的維護人員就可以通過 Eureka Server 來監(jiān)控系統(tǒng)中各個微服務是否正常運行。Spring Cloud 的一些其他模塊(比如Zuul)就可以通過 Eureka Server 來發(fā)現(xiàn)系統(tǒng)中的其他微服務,并執(zhí)行相關的邏輯。
Eureka由兩個組件組成:Eureka服務器和Eureka客戶端。Eureka服務器用作服務注冊服務器。Eureka客戶端是一個java客戶端,用來簡化與服務器的交互、作為輪詢負載均衡器,并提供服務的故障切換支持。Netflix在其生產(chǎn)環(huán)境中使用的是另外的客戶端,它提供基于流量、資源利用率以及出錯狀態(tài)的加權(quán)負載均衡。
?
上圖是github了Eureka的基本架構(gòu):Eureka Server提供服務注冊和發(fā)現(xiàn)。其他的應用客戶端。
SpringCloud的Eureka服務
1.將項目變成 SpringCloud項目,父容器添加依賴。
<dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Brixton.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.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency> </dependencies>?
2.新建一個eureke的maven工程eureka-server項目。
<?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>springclouddemo</artifactId><groupId>com.aomeibox</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>eureka</artifactId><name>eureka</name><!-- FIXME change it to the project's website --><url>http://www.example.com</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.7</maven.compiler.source><maven.compiler.target>1.7</maven.compiler.target></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><!-- eureka-server 依賴 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId><version>1.4.4.RELEASE</version></dependency><!-- 安全依賴 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency></dependencies></project>配置主函數(shù),設置成Eureka Server,并啟動項目并運行。
@SpringBootApplication @EnableEurekaServer public class EurekaApp {public static void main( String[] args ){SpringApplication.run(EurekaApp.class);} }?
訪問eureka的時候需要輸入用戶名和密碼,默認用戶名是user,密碼則需要從控制臺查找,SpringCloud生成了一個隨機默認的。
如果需要修改用戶名和密碼,則需要重新配置application.yml文件中的信息。
server:port: 10000#以為當前的eureka是單機的,所以需要設置一些配置 eureka:client:register-with-eureka: falsefetch-registry: falseservice-url:defaultZone: http://root:123@localhost:10000/eureka # defaultZone: http://192.168.1.125:10000/eureka/security:basic:enabled: true #開啟安全配置,也就是需要安全密碼,如果不需要,設置為false即可,注意,這個參數(shù)必須放在application.yml中,不允許放在bootstrap.yml中user:name: rootpassword: 123 #在配置了用戶的用戶名和密碼后,可以修改訪問地址為curl風格?消費者和服務提供者注冊到Eureka中
1.修改provider項目的pom.xml文件。
<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId><version>1.4.0.RELEASE</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency></dependencies>2.修改主函數(shù)。
@SpringBootApplication @EnableEurekaClient //啟用 eureka 客戶端 public class ProviderUser {public static void main( String[] args ) {SpringApplication.run(ProviderUser.class);} }?3.啟動eureka服務和provider,可以看到已經(jīng)注冊到Eureka中了。
4.編寫conroller類,進行測試
@RestController public class UserController {@Autowiredprivate EurekaClient eurekaClient;@GetMapping("/user/{id}")public User getUser(@PathVariable Integer id){return new User(id);}@GetMapping("/eurekaInfo")public String info(){InstanceInfo eureka = eurekaClient.getNextServerFromEureka("provider-user", false);return eureka.getHomePageUrl();}}5.customr如上修改。就會有兩個項目注冊到Eureka中了。
?6.修改customer中的controller代碼。再次訪問,還是能拿到provider項目提供的數(shù)據(jù)的。
@RestController public class OrderController {@Autowiredprivate RestTemplate template;//spring提供的一個用于訪問rest接口的模板對象private String url = "http://192.168.1.125:7900/user/";@Autowiredprivate EurekaClient eurekaClient;@GetMapping("/order/{id}")public User getUser(@PathVariable Integer id){InstanceInfo eureka = eurekaClient.getNextServerFromEureka("PROVIDER-USER", false);//訪問提供者獲取數(shù)據(jù)User user = template.getForObject(eureka.getHomePageUrl()+"/user/"+ id, User.class);//通過訪問rest 獲取到json數(shù)據(jù),然后轉(zhuǎn)換成User對象return user;} }?Eureka細節(jié)修改
1.修改主機服務名稱。
server:port: 7900 #程序啟動后的端口spring:application:name: provider-user #應用名稱eureka:client:serviceUrl:defaultZone: http://root:123@localhost:10000/eurekainstance:instance-id: provider-user7900 # 修改服務名稱?
注意:修改后,會自動啟動Eureka 的自我保護機制。
2.訪問信息有IP信息提示。
server:port: 7900 #程序啟動后的端口spring:application:name: provider-user #應用名稱eureka:client:serviceUrl:defaultZone: http://root:123@localhost:10000/eurekainstance:instance-id: provider-user7900 # 修改服務名稱prefer-ip-address: true #訪問路徑可以顯示IP地址3.微服務info信息修改。
info:app.name: providercompany.name: aomeiboxbuild.artifactId: ${project.artifactId}build.version: ${project.version}?
?
Eureka自我保護機制
某時刻某一個服務不可用了,Eureka并不會立刻清理,依舊會對該微服務的信息進行保存。
默認情況下,如果EurekeServer在一定時間內(nèi)沒有接收到某個微服務實例的心跳,EurekaServer將會注銷該服務(默認90秒)。但是當網(wǎng)絡分區(qū)發(fā)生故障時,微服務與Eureka無法正常進行通信,以上行為就會變得非常危險--因為微服務本身是健康的,此時不應該注銷這個微服務。Eureka通過”自我保護模式“來解決這個問題 --- 當EurekaServer節(jié)點在短時間內(nèi)丟失過多客戶端時(可能發(fā)生了網(wǎng)絡分區(qū)故障),那么這個節(jié)點就會進入自我保護模式。一旦進入該模式,EurekaServer就會保護服務注冊表中的信息,不再刪除服務注冊表中的數(shù)據(jù)。當網(wǎng)絡回復后,EurekaServer節(jié)點會自動退出自我保護模式。
在自我保護的模式中,EurekaServer會保護服務注冊表中的信息,不再注銷任何服務實例。當它接收的心跳次數(shù)重新恢復到閾值以上時,該EurekaServer節(jié)點會自動退出自我保護模式。
在SpringCloud中,可以使用 eureka.server.enable-self-preservation = false 來關閉自我保護機制。
服務發(fā)現(xiàn)
服務中心
服務中心又稱注冊中心,管理各種服務功能包括服務的注冊、發(fā)現(xiàn)、熔斷、負載、降級等,比如dubbo admin后臺的各種功能。
就第一個例子來說,項目A調(diào)用項目B
正常調(diào)用:
有了服務中心之后,任何一個服務都不能直接去掉用,都需要通過服務中心來調(diào)用:
Eureka的集群搭建
注冊中心這么關鍵的服務,如果是單點話,遇到故障就是毀滅性的。在一個分布式系統(tǒng)中,服務注冊中心是最重要的基礎部分,理應隨時處于可以提供服務的狀態(tài)。為了維持其可用性,使用集群是很好的解決方案。Eureka通過互相注冊的方式來實現(xiàn)高可用的部署,所以我們只需要將Eureke Server配置其他可用的serviceUrl就能實現(xiàn)高可用部署。
多節(jié)點注冊中心
1、host轉(zhuǎn)換,在hosts文件中加入如下配置
127.0.0.1 eureka1 127.0.0.1 eureka2 127.0.0.1 eureka3?2、創(chuàng)建application-1.yml,作為eureka1服務中心的配置,并將serviceUrl指向eureka2,eureka3.
?3、創(chuàng)建application-2.yml,創(chuàng)建application-3.yml,分別指向另外兩個。
--- spring:application:name: spring-cloud-eurekaprofiles: eureka1 server:port: 8001 eureka:instance:hostname: eureka1client:serviceUrl:defaultZone: http://eureka2:8002/eureka/,http://eureka3:8003/eureka/ --- spring:application:name: spring-cloud-eurekaprofiles: eureka2 server:port: 8001 eureka:instance:hostname: eureka2client:serviceUrl:defaultZone: http://eureka1:8001/eureka/,http://eureka3:8003/eureka/ --- spring:application:name: spring-cloud-eurekaprofiles: eureka3 server:port: 8002 eureka:instance:hostname: eureka3client:serviceUrl:defaultZone: http://eureka1:8001/eureka/,http://eureka2:8002/eureka/?
?4、打包啟動。依次啟動完成后,瀏覽器輸入:http://eureka1:8000/?,http://eureka2:8000/?,http://eureka3:8000/?即可查看結(jié)果。
轉(zhuǎn)載于:https://www.cnblogs.com/JiangLai/p/10172786.html
總結(jié)
以上是生活随笔為你收集整理的浅谈SpringCloud (二) Eureka服务发现组件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (1)opencv的安装和遇到的问题
- 下一篇: javascript常用验证大全