新聞中心
小編給大家分享一下eureka的作用是什么,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
成都創(chuàng)新互聯(lián)長期為上千多家客戶提供的網(wǎng)站建設(shè)服務,團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為尼金平企業(yè)提供專業(yè)的網(wǎng)站建設(shè)、做網(wǎng)站,尼金平網(wǎng)站改版等技術(shù)服務。擁有十余年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。微服務的其中一個特點就是有許許多的粒度?。üδ軉我?,比如用戶管理,短信發(fā)送管理,郵件發(fā)送管理,文件管理等)、能獨立部署、擴展、運行的小應用,可以稱為api,也就是服務提供者。api之間可以相互調(diào)用,但更多的是供app調(diào)用,比如學生管理系統(tǒng),它是面向用戶的,是許許多多功能的集合體,它需要調(diào)用許多api完成業(yè)務功能,所以這學生管理系統(tǒng)可以稱為app。
eureka的作用
傳統(tǒng)的單體應用開發(fā),就是將api和app的代碼全部集成在一起,在同一個進程中運行,對應java web通俗的說就是全部打包在一個war中部署在一個tomcat中運行。而微服務的每個api,app都擁有自己的進程,也就是都有自己的tomcat,某個api掛了,不影響其他api和app運行。
api是采取restfull風格暴漏出去的,所以app(api)調(diào)用api時,采取http://ip:端口這形式進行通訊。那么問題來了,如果有很多app都調(diào)用了某個api,如果api的ip或端口發(fā)生了更改,如果app中對api的ip和端口等信息是寫在配置文件的,難道要通知每個app,說這個api的地址和端口變了,app要進行修改重新編譯部署(這是舉例子而已,實際情況有些企業(yè)對常量的配置可能寫配置文件,也可能寫數(shù)據(jù)庫)。這太麻煩了,如果api的地址和端口有發(fā)生變化,app能及時獲知自行變更,那就好了。還有個弊端,就是api是否掛了,也沒法直觀觀察到。
所以,如果在app和api之間增加個服務管理中心,api像服務管理中心注冊信息,app從服務管理中心獲取api的信息,api有個唯一標識,api有變更的時候通知服務管理中心,服務管理中心通知相關(guān)的app或者app定時從服務管理中心獲取最新的api信息,同時服務管理中心具有很高的穩(wěn)定性、可靠性。
eureka就是為了這樣的一個服務管理中心,下面是我根據(jù)自己的理解畫的一張圖。
下面這張是官方的架構(gòu)圖
1.Application Service 相當于服務提供者/api
2.Application Client 相當于服務消費者/app
3.Make Remote Call,其實就是實現(xiàn)服務的使用/比如httpClient,restTemplate
4.us-east-1 Eureka 集群服務
5.us-east-1c、us-east-1d、us-east-1e 就是具體的某個eureka
Eureka:
是純正的 servlet 應用,需構(gòu)建成war包部署
使用了 Jersey 框架實現(xiàn)自身的 RESTful HTTP接口
peer之間的同步與服務的注冊全部通過 HTTP 協(xié)議實現(xiàn)
定時任務(發(fā)送心跳、定時清理過期服務、節(jié)點同步等)通過 JDK 自帶的 Timer 實現(xiàn)
內(nèi)存緩存使用Google的guava包實現(xiàn)
eureka集群搭建
和eureka類似功能的有zookeeper,etcd等。spring boot已經(jīng)集成了eureka,所以我們可以像spring boot那樣搭建環(huán)境,部署運行。
我是在window10下使用eclipse學習的。
準備工作。
在修改hosts文件,在最后面加上(位置:C:WindowsSystem32driversetc)
127.0.0.1 01.eureka.server 127.0.0.1 02.eureka.server 127.0.0.1 03.eureka.server
eclipse下創(chuàng)建個普通的maven項目eureka-server。
pom.xml
4.0.0 com.fei.springcloud springcloud-eureka-server 0.0.1-SNAPSHOT eureka服務端 alimaven http://maven.aliyun.com/nexus/content/repositories/central/ true true alimaven http://maven.aliyun.com/nexus/content/repositories/central/ true true UTF-8 UTF-8 UTF-8 1.8 1.8 1.8 org.springframework.boot spring-boot-starter-parent 1.5.2.RELEASE org.springframework.cloud spring-cloud-starter-eureka-server org.springframework.cloud spring-cloud-dependencies Dalston.RELEASE pom import org.springframework.boot spring-boot-maven-plugin
啟動類Application.java
package com.fei.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @EnableEurekaServer @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
注意注解:@EnableEurekaServer,表明這是server服務
配置文件application.properties
logging.config=classpath:logback.xml logging.path=d:/logs ##tomcat set### # eureka的默認端口是8761 server.port=8081 server.session-timeout=60 ########### spring.application.name=eureka-server-01 ####下面2個一定要false,因為這程序是要作為服務端 但是jar中存在eureka-client.jar,所以要false,否則啟動會報錯的 #是否注冊到eureka eureka.client.register-with-eureka=false #是否獲取注冊信息 eureka.client.fetch-registry=false #為了便于測試,取消eureka的保護模式,如果啟動的話, 比如api提供者關(guān)閉了,但是eureka仍然保留信息 eureka.server.enable-self-preservation=false #服務名稱 eureka.instance.hostname=01.server.eureka #eureka的服務地址,/eureka是固定的 eureka.client.serviceUrl.defaultZone=http://02. server.eureka:8082/eureka/,http://03.server.eureka:8083/eureka/
注意:eureka.client.serviceUrl.defaultZone的配置,如果是01,則填寫02、03的地址和端口;如果是02,則填寫01、03的地址和端口,也就是說讓01,02,03這3個eureka服務能相互間同步數(shù)據(jù),如果是01->02->03->01,則api提供者注冊信息到01時,01會同步數(shù)據(jù)到02,但02不會同步到03,01也不會同步到03,也就是說03缺數(shù)據(jù)了??丛创a,服務的注冊信息不會被二次傳播,看PeerAwareInstanceRegistryImpl.java
啟動01 eureka,然后修改application.properties,變?yōu)?2 eureka的配置
logging.config=classpath:logback.xml logging.path=d:/logs ##tomcat set### # eureka的默認端口是8761 server.port=8082 server.session-timeout=60 ########### spring.application.name=eureka-server-02 ####下面2個一定要false,因為這程序是要作為服務端, 但是jar中存在eureka-client.jar,所以要false,否則啟動會報錯的 #是否注冊到eureka eureka.client.register-with-eureka=false #是否獲取注冊信息 eureka.client.fetch-registry=false #為了便于測試,取消eureka的保護模式,如果啟動的話, 比如api提供者關(guān)閉了,但是eureka仍然保留信息 eureka.server.enable-self-preservation=false #服務名稱 eureka.instance.hostname=02.server.eureka #eureka的服務地址,/eureka是固定的 eureka.client.serviceUrl.defaultZone=http://01.server. eureka:8081/eureka/,http://03.server.eureka:8083/eureka/
然后執(zhí)行啟動類,03也是一樣的操作。
瀏覽器訪問http://01.server.eureka:8081/(或者http://02.server.eureka:8082/,或者http://03.server.eureka:8083/)看到
api提供者
創(chuàng)建個普通的maven項目eureka-api,該api是個用戶服務提供者。采取spring boot開發(fā)模式
pom.xml
4.0.0 com.fei.springcloud springcloud-eureka-server 0.0.1-SNAPSHOT eureka服務端 alimaven http://maven.aliyun.com/nexus/content/repositories/central/ true true alimaven http://maven.aliyun.com/nexus/content/repositories/central/ true true UTF-8 UTF-8 UTF-8 1.8 1.8 1.8 org.springframework.boot spring-boot-starter-parent 1.5.2.RELEASE org.springframework.cloud spring-cloud-starter-eureka org.springframework.cloud spring-cloud-dependencies Dalston.RELEASE pom import org.springframework.boot spring-boot-maven-plugin
它和eureka 服務端,有個依賴是不一樣的。
application.properties
logging.config=classpath:logback.xml logging.path=d:/logs ##tomcat set### # eureka的默認端口是8761 server.port=9081 server.session-timeout=60 ########### spring.application.name=api-user-server #像eureka服務注冊信息時,使用ip地址,默認使用hostname eureka.instance.preferIpAddress=true #服務的instance-id默認默認值是${spring.cloud.client.hostname :${spring.aplication.name} :${spring.application.instance_id:${server.port}} , #也就是機器主機名:應用名稱:應用端口 eureka.instance.instance-id=${spring.cloud.client.ipAddress}:${server.port} #eureka的服務地址 eureka.client.serviceUrl.defaultZone=http://01.server.eureka:8081/eureka/
Application.java
package com.fei.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @EnableEurekaClient @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
@EnableEurekaClient,不管是消費者還是提供者,對應eureka server來說都是客戶端client
寫個普通的controller,UserProvider.java.提供個根據(jù)id獲取用戶信息的接口
package com.fei.springcloud.provider; import javax.servlet.http.HttpServletRequest; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/user") public class UserProvider { @GetMapping(value="/find/{id}") public String find(@PathVariable("id") String id,HttpServletRequest request){ //實際項目中,這里可以使用JSONObject,返回json字符串 //為了便于測試消費者app的負載均衡,返回服務端端口 String s = "張三"+" 服務端端口:"+request.getLocalPort(); return s; } }
執(zhí)行Application.java,將application.properties的端口修改為9082,再次執(zhí)行
瀏覽器訪問http://01.server.eureka:8081/
Application就是文件中定義的spring.application.name=api-user-server,它會自動轉(zhuǎn)為大寫
如果想免費學習Java工程化、高性能及分布式、深入淺出。微服務、Spring,MyBatis,Netty源碼分析的朋友可以加我的Java進階群:478030634,群里有阿里大牛直播講解技術(shù),以及Java大型互聯(lián)網(wǎng)技術(shù)的視頻免費分享給大家。
app消費者
在Spring Cloud Netflix中,使用Ribbon實現(xiàn)客戶端負載均衡,使用Feign實現(xiàn)聲明式HTTP客戶端調(diào)用——即寫得像本地函數(shù)調(diào)用一樣.
ribbo負載均衡的app消費者
創(chuàng)建個普通的maven項目eureka-app-ribbo.
pom.xml
4.0.0 com.fei.springcloud springcloud-eureka-app-ribbo 0.0.1-SNAPSHOT eureka消費者ribbo alimaven http://maven.aliyun.com/nexus/content/repositories/central/ true true alimaven http://maven.aliyun.com/nexus/content/repositories/central/ true true UTF-8 UTF-8 UTF-8 1.8 1.8 1.8 org.springframework.boot spring-boot-starter-parent 1.5.2.RELEASE org.springframework.cloud spring-cloud-starter-ribbon org.springframework.cloud spring-cloud-starter-eureka org.springframework.boot spring-boot-starter-web org.springframework.cloud spring-cloud-dependencies Dalston.RELEASE pom import org.springframework.boot spring-boot-maven-plugin
application.properties
logging.config=classpath:logback.xml logging.path=d:/logs ##tomcat set### # eureka的默認端口是8761 server.port=7081 server.session-timeout=60 ########### spring.application.name=app-user #像eureka服務注冊信息時,使用ip地址,默認使用hostname eureka.instance.preferIpAddress=true #服務的instance-id默認默認值是${spring.cloud.client.hostname}${spring.application.name} :${spring.application.instance_id:${server.port}} , #也就是機器主機名:應用名稱:應用端口 eureka.instance.instance-id=${spring.cloud.client.ipAddress}:${server.port} #eureka的服務地址 eureka.client.serviceUrl.defaultZone=http://01.server.eureka: 8081/eureka/,http://02.server.eureka:8082/eureka/, http://03.server.eureka:8083/eureka/
UserController.java
logging.config=classpath:logback.xml logging.path=d:/logs ##tomcat set### # eureka的默認端口是8761 server.port=7081 server.session-timeout=60 ########### spring.application.name=app-user #像eureka服務注冊信息時,使用ip地址,默認使用hostname eureka.instance.preferIpAddress=true #服務的instance-id默認默認值是${spring.cloud.client.hostname} :${spring.application.name}:${spring.application.instance_id:${server.port}} , #也就是機器主機名:應用名稱:應用端口 eureka.instance.instance-id=${spring.cloud.client.ipAddress}:${server.port} #eureka的服務地址 eureka.client.serviceUrl.defaultZone=http://01.server.eureka:8081/eureka/ ,http://02.server.eureka:8082/eureka/,http://03.server.eureka:8083/eureka/
使用restTemplate需要自己拼接url
啟動類Application.java
package com.fei.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; @EnableEurekaClient @SpringBootApplication public class Application { @Bean //定義REST客戶端,RestTemplate實例 @LoadBalanced //開啟負債均衡的能力 RestTemplate restTemplate() { return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
eureka服務
瀏覽器訪問http://127.0.0.1:7081/user/find
看到信息“張三 服務端端口:9081”,刷新瀏覽器看到“張三 服務端端口:9082”,說明的確是有負載均衡。
但是訪問外網(wǎng)的時候,http://127.0.0.1:7081/user/test,也就是域名不在eureka注冊過的,就不行了。
以后再研究下如何解決。
feign的app消費者
feign可以寫個接口,加上相關(guān)的注解,調(diào)用的時候,會自動拼接url,調(diào)用者就像調(diào)用本地接口一樣的操作。
Feign也用到ribbon,當你使用@ FeignClient,ribbon自動被應用。
像ribbo創(chuàng)建個項目,或者直接在ribbo項目修改都OK。
pom.xml 把ribbo的依賴修改為feign
4.0.0 com.fei.springcloud springcloud-eureka-app-feign 0.0.1-SNAPSHOT eureka消費者feign alimaven http://maven.aliyun.com/nexus/content /repositories/central/ true true alimaven http://maven.aliyun.com/nexus/content/repositories/central/ true true UTF-8 UTF-8 UTF-8 1.8 1.8 1.8 org.springframework.boot spring-boot-starter-parent 1.5.2.RELEASE org.springframework.cloud spring-cloud-starter-feign org.springframework.cloud spring-cloud-starter-eureka org.springframework.boot spring-boot-starter-web org.springframework.cloud spring-cloud-dependencies Dalston.RELEASE pom import org.springframework.boot spring-boot-maven-plugin
application.properties和上面一樣
logging.config=classpath:logback.xml logging.path=d:/logs ##tomcat set### # eureka的默認端口是8761 server.port=7081 server.session-timeout=60 ########### spring.application.name=app-user #像eureka服務注冊信息時,使用ip地址,默認使用hostname eureka.instance.preferIpAddress=true #服務的instance-id默認默認值是${spring.cloud.client.hostname} :${spring.application.name}:${spring.application.instance_id:${server.port}} , #也就是機器主機名:應用名稱:應用端口 eureka.instance.instance-id=${spring.cloud.client.ipAddress}:${server.port} #eureka的服務地址 eureka.client.serviceUrl.defaultZone=http://01.server.eureka 8081/eureka/,http://02.server.eureka:8082/eureka/, http://03.server.eureka:8083/eureka/
增加個UserService.java接口類
package com.fei.springcloud.service; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @FeignClient("API-USER-SERVER") public interface UserService { @GetMapping(value="/user/find/{id}") String find(@PathVariable("id") String id); } UserController.java package com.fei.springcloud.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.fei.springcloud.service.UserService; @Controller @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @GetMapping(value = "/find") @ResponseBody public String find() { //url中對應api提供者的名稱,全大寫 String s = userService.find("123"); return s; } }
瀏覽器訪問http://127.0.0.1:7081/user/find,得到信息“張三 服務端端口:9081”,刷新,得到“張三 服務端端口:9082”,F(xiàn)eign也用到ribbon,當你使用@ FeignClient,ribbon自動被應用。所以也會負載均衡
ribbo負載均衡策略選擇
AvailabilityFilteringRule:過濾掉那些因為一直連接失敗的被標記為circuit tripped的后端server,并過濾掉那些高并發(fā)的的后端server(active connections 超過配置的閾值) | 使用一個AvailabilityPredicate來包含過濾server的邏輯,其實就就是檢查status里記錄的各個server的運行狀態(tài)
RandomRule:隨機選擇一個server
BestAvailabl:選擇一個最小的并發(fā)請求的server,逐個考察Server,如果Server被tripped了,則忽略
RoundRobinRule:roundRobin方式輪詢選擇, 輪詢index,選擇index對應位置的server
WeightedResponseTimeRule:根據(jù)響應時間分配一個weight(權(quán)重),響應時間越長,weight越小,被選中的可能性越低
RetryRule:對選定的負載均衡策略機上重試機制,在一個配置時間段內(nèi)當選擇server不成功,則一直嘗試使用subRule的方式選擇一個可用的server
ZoneAvoidanceRule:復合判斷server所在區(qū)域的性能和server的可用性選擇server
ResponseTimeWeightedRule:作用同WeightedResponseTimeRule,二者作用是一樣的,ResponseTimeWeightedRule后來改名為WeightedResponseTimeRule
在app消費者的application.properties配置文件中加入
#ribbo負載均衡策略配置,默認是依次輪詢 API-USER-SERVER.ribbon.NFLoadBalancerRuleClassName=com. netflix.loadbalancer.RandomRule
其中API-USER-SERVER是api服務提供者的服務名稱,也就是說,可以給每個不同的api服務提供者配置不同的復制均衡策略,驗證就不貼圖了
負載均衡策略在消費端配置的缺點
在上面的例子中,ribbon的負載均衡是在消費端完成的。流程是這樣的:提供者服務A集群,啟動2個進程A1,A2,都注冊到eureka,app消費端根據(jù)api服務者名稱獲取到A1,A2的具體連接地址,ribbon就對A1,A2進行負載均衡。
缺點:
1) 如果所有的app消費端的配置策略不好,導致絕大部分的請求都到A1,那A1的壓力就大了。也就是說負載策略不是有api提供者所控制的了(這里就不說A1,A2所在的服務器哪個性能更好了,因為如果app/api都是在Docker中運行,k8s負責資源調(diào)配的話,可以認為每個服務的進程所在的docker配置是一樣的,比如A服務對應的A1,A2系統(tǒng)環(huán)境是一致的,B服務對應的B1,B2,B3系統(tǒng)環(huán)境是一致的,只是所對應的宿主機服務器估計不一樣而已)。
2)如果api提供者需要開放給第三方公司的時候,總不能把A1,A2告訴第三方吧,說我們這A服務集群了,有A1,A2,你隨意吧。
我們實際項目中的做法,都是每個提供者服務都有自己的nginx管理自己的集群,然后把nginx的域名提供給app消費者即可。之所以每個服務提供者都有自己的nginx,是因為docker被k8s管控的時候,ip都是變化的,需要更新到nginx中。如果A,B都共用一個nginx,那A重構(gòu)建部署的時候,A1,A2的ip變化了,需要更新到nginx中去,那如果導致nginx出現(xiàn)問題了,豈不是影響到B的使用了,所以A,B都有自己的nginx。那spring cloud沒有解決方案了嗎?有。spring cloud集成了zuul,zuul服務網(wǎng)關(guān),不但提供了和nginx一樣的反向代理功能,還提供了負載均衡、監(jiān)控、過濾等功能。
看完了這篇文章,相信你對eureka的作用是什么有了一定的了解,想了解更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計公司行業(yè)資訊頻道,感謝各位的閱讀!
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
網(wǎng)站欄目:eureka的作用是什么-創(chuàng)新互聯(lián)
文章來源:http://fisionsoft.com.cn/article/ceoeos.html