摘要:服務提供者的運行機制用了雙層結構來維護注冊的服務信息,第一層為服務的名稱,第二層為服務的實例名稱。服務注冊中心的運行機制為了防止服務的異常下線,會周期性的清理列表中未續(xù)約的服務。負載均衡器的基本功能維護該服務下的所有節(jié)點列表。
Spring Boot Spring Boot有什么作用
Spring Boot通過自動化的配置簡化Spring原有的樣板化的配置。
Spring Boot提供了很多現(xiàn)成的starter,可以快速的實現(xiàn)各種服務。
actuatoractuator用于監(jiān)控和管理服務信息。
服務治理:Eureka有了,找到了!
Eureka的功能Eureka的功能是提供服務的注冊和服務的發(fā)現(xiàn)。
實現(xiàn)一個Eureka服務非常簡單:
@EnableEurekaServer @SpringBootApplication public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
配置文件:
server.port=1111 eureka.instance.hostname=localhost eureka.client.register-with-eureka=false eureka.client.fetch-registry=false eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
服務提供者同樣簡潔,只需要EnableDiscoveryClient:
@EnableDiscoveryClient @SpringBootApplication public class HelloApplication { public static void main(String[] args) { SpringApplication.run(HelloApplication.class, args); } }
提供controller:
@RestController public class HelloController { @RequestMapping("/hello") public String index() { return "Hello Spring Boot"; } }
配置文件application.properties:
server.port=8888 spring.application.name=hello-service eureka.client.serviceUrl.defaultZone=http://111.222.83.251:1111/eureka/
服務消費者如下,通過url指明服務名稱和接口,使用RestTemplate進行http請求。
@Service public class HelloService { @Autowired RestTemplate restTemplate; public String helloService() { return restTemplate.getForEntity("http://HELLO-SERVICE/hello", String.class).getBody(); } }
配置文件:
eureka.client.serviceUrl.defaultZone=http://111.222.83.251:1111/eureka/Eureka的運行
有三種方法可以運行:
可以通過maven的編譯、打包,最后java -jar運行。
用spring-boot-maven-plugin的mvn spring-boot:run運行。
在Idea中直接啟動main方法。
我本機java環(huán)境為9,在項目中設置的java為1.8,導致只有第3種方法有效,因為其它兩種依賴于本機安裝的java運行環(huán)境,盡量保持編譯環(huán)境和運行環(huán)境一致。
服務提供者的運行機制Eureka用了雙層map結構來維護注冊的服務信息,第一層Key為服務的名稱,第二層key為服務的實例名稱。
當某一個服務向一個Eureka節(jié)點注冊服務時,Eureka會將該請求轉發(fā)給其它的Eureka節(jié)點,從而可以同步服務注冊信息。
服務通過周期性的心跳來通知Eureka自己的情況,又稱為服務續(xù)約(renew)。
服務消費者的運行機制通過REST請求想Eureka獲取服務列表,周期性的更新服務列表緩存。
服務下線后,Eureka會通知給服務消費者。
服務注冊中心的運行機制為了防止服務的異常下線,會周期性的清理列表中未續(xù)約的服務。
Region和Zone一個服務可以屬于一個Region和多個Zone。
服務用Region和Zone來刻畫自己所處的物理位置,方便負載均衡器就近的選擇同一個Zone服務。同時,服務也可以根據(jù)Region和Zone來選擇應該向哪個Eureka注冊。
客戶端負載均衡:Ribbon 用RestTemplate發(fā)送rest請求Spring提供了方便的RestTemplate像目標服務發(fā)送請求,有GET、POST、PUT和DELETE等基本操作。
如何讓客戶端具有負載均衡能力LoadBalanced注解通過向RestTemplate添加攔截器,使其具備負載均衡的能力。
在服務消費者中實現(xiàn)如下,在RestTemplate上加入LoadBalanced注解。
@SpringCloudApplication public class RibbonConsumerApplication { @Bean @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(RibbonConsumerApplication.class, args); } }負載均衡器的基本功能
BaseLoaderBalancer
維護該服務下的所有節(jié)點列表。
定義IPing對象,會定時輪詢列表中的服務,檢查服務是否存活。
定義負載均衡的規(guī)則IRule,這里是線性輪詢的策略。
定義添加、獲取服務的方法。
DynamicServerListLoadBalancer
在BaseLoaderBalancer基礎上實現(xiàn)了動態(tài)獲取服務的能力,實現(xiàn)了從Eureka查詢服務的方法。
動態(tài)的更新服務列表。策略有定時更新和Eureka提示更新兩種。
定義Filter過濾出需要的服務節(jié)點,比如區(qū)域感知需求的服務會選擇同一個區(qū)域的其它服務,比如根據(jù)服務的質量評估節(jié)點健康狀況,選擇更健康的服務節(jié)點進入列表。
ZoneAwareLoadBalancer
對DynamicServerListLoadBalancer進一步擴展,根據(jù)zone對服務實例劃分,然后采用策略先篩選zone,最后再選一個服務實例。
負載均衡的策略
RandomRule
隨機從列表中選擇一個
RoundRobbinRule
線性輪詢服務
RetryRule
在RoundRobbinRule基礎上進行一定的重試
WeightedResponseTimeRule
根據(jù)服務節(jié)點的響應時間,計算節(jié)點的權重,響應時間短的更容易被選中。
其它。
采用自定義的過濾規(guī)則,先過濾出符合條件的節(jié)點結合,然后采用輪詢的方式依次使用。
服務容錯保護:Hystrix Hystrix的功能服務降級、服務熔斷、線程和信號隔離、請求緩存、請求合并以及服務監(jiān)控等。
為依賴的服務提供艙壁對于每一個依賴的服務,Hystrix提供了專用的線程池,防止某個依賴服務影響其它的依賴服務,這種模式叫做“艙壁模式”(Bulkhead Pattern)。
斷路器實現(xiàn)邏輯Hystrix通過注解EnableCircuitBreaker和hystrixCommand提供了斷路保護功能,在下游服務調用產生異常時進行功能降級。
在如下條件下打開斷路器:
在每秒請求數(shù)量QPS大于閾值時。
在錯誤百分比大于閾值時。
當斷路器打開時,如果打開時間已經到達設定睡眠時間,則去嘗試發(fā)送請求,測試下游服務是否已經恢復正常,如果請求成功,則關閉斷路器,恢復正常。
保留10秒的bucket歷史數(shù)據(jù),記錄請求成功、失敗、延遲和拒絕次數(shù)作為開閉斷路器的依據(jù)。
消費者端實現(xiàn)如下:
@Service public class HelloService { @Autowired RestTemplate restTemplate; @HystrixCommand(fallbackMethod = "helloFallback") public String helloService() { return restTemplate.getForEntity("http://HELLO-SERVICE/hello", String.class).getBody(); } public String helloFallback() { return "error"; } }怎么減少網(wǎng)絡請求?Hystrix提供了緩存功能
根據(jù)請求參數(shù),想結果緩存入線程安全的map結構。
Hystrix提供了CacheResult來實現(xiàn)緩存。
還能怎么減少網(wǎng)絡請求?Hystrix提供了合并請求的功能Hystrix提供了HystrixCollapser進行請求的合并,將一小段時間內的請求合并為一個,不僅減少了網(wǎng)絡請求的次數(shù),同時減少了線程池資源的占用。
聲明式服務調用:FeignFeign整合了Ribbon和Hystrix,除了這兩者的功能,還提供了聲明式的Web服務客戶端的定義方式。
在調用其它服務時,可以通過如下簡單封裝實現(xiàn)。FeignClient指明了服務的名稱,RequestMapping指明了服務的具體接口。和傳統(tǒng)的方式相比,更為簡潔方便。
@FeignClient("hello-service") public interface HelloService { @RequestMapping("/hello") String hello(); }客戶端和服務端共享接口定義
Feign在客戶端聲明的服務接口和服務端定義的接口是對應的,可以說形式完全相同。所以,可以將這些接口發(fā)布出來,供客戶端和服務端共同使用,從而減少客戶端綁定配置。
API網(wǎng)關服務:ZuulZuul針對外部客戶端的訪問,提供了請求路由、負載均衡和校驗過濾等基本功能,還有與服務治理結合、請求轉發(fā)的熔斷機制、服務的聚合等。
創(chuàng)建一個簡單的zuul,首先開啟zuul:
@EnableZuulProxy @SpringBootApplication public class ApiGatewayApplication { public static void main(String[] args) { SpringApplication.run(ApiGatewayApplication.class, args); } }
配置路由規(guī)則:
spring.application.name=api-gateway server.port=5555 zuul.routes.api-a.path=/api-a/** zuul.routes.api-a.serviceId=hello-service zuul.routes.api-b.path=/api-b/** zuul.routes.api-b.serviceId=feign-consumer eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
每一個路由規(guī)則包含兩個部分,path指明了外部訪問的url,對應的serviceId指明了所要映射到的服務。
Zuul的過濾器Zuul不僅做路由轉發(fā),還會對請求進行過濾。過濾會在請求的各個階段執(zhí)行:
pre:在請求到達網(wǎng)關API時的階段,先做一些前置加工。
routing:在請求已經開始路由到目標服務器時,進行處理。
error:該過濾器在上述兩階段拋出異常時,會進入該階段進行處理,該階段一般會在上下文中設置error標志,告訴port階段返回適當?shù)膃rror信息。當然該階段有時候會在post階段之后出現(xiàn),因為post階段也可能拋出異常,這就導致客戶端可能無法收到返回的信息,當然,有多種解決該問題的方法,不再贅述。
post:在目標服務將結果返回后,可以對返回值進行處理,然后將正確的返回值或者error信息返回給客戶端。
其實Zuul的過濾器更像是設計模式中的責任鏈或者handler,一個請求在收到、轉發(fā)、返回的各個階段里,由多個過濾器依次處理。
Zuul動態(tài)加載路由配置和過濾器Zuul結合Spring Cloud Config,可以動態(tài)的獲取配置信息,從而可以實現(xiàn)動態(tài)的更新路由。
Zuul結合Groovy等動態(tài)語言,可以在運行時動態(tài)的加載自定義的過濾器。
分布式配置中心:Config創(chuàng)建一個Config server十分容易,首先創(chuàng)建一個遠程git倉庫,我在碼云中創(chuàng)建了https://gitee.com/tiantianchi...。
創(chuàng)建spring boot項目,加入如下配置:
@EnableConfigServer @SpringBootApplication public class ConfigServerApplication { public static void main(String[] args) { SpringApplication.run(ConfigServerApplication.class, args); } }
在application.properties中加入:
spring.application.name=config-server server.port=7001 spring.cloud.config.server.git.uri=https://gitee.com/tiantianchi/spring-config spring.cloud.config.server.git.searchPaths=config-repo spring.cloud.config.server.git.username=username spring.cloud.config.server.git.password=password
在倉庫中創(chuàng)建配置文件tc-dev.properties,然后通過http://localhost:7001/tc/dev可以訪問其中的配置內容。
Config客戶端的實現(xiàn)如下,首先創(chuàng)建配置文件boostrap.properties文件,填入如下配置:
spring.application.name=tc spring.cloud.config.profile=dev spring.cloud.config.label=master spring.cloud.config.uri=http://localhost:7001/ server.port=7002
客戶端就可以從Config server中獲取tc-dev.properties配置文件。
消息總線:BusSpring Cloud Bus依賴于現(xiàn)有的消息隊列框架,如RabbitMQ和Kafka,實現(xiàn)微服務之間異步消息的發(fā)布和訂閱。
可以利用Bus實現(xiàn)配置的自動更新。在git倉庫中的配置發(fā)生變化時,通過hook將更新請求發(fā)送到Config服務,Config通過Bus發(fā)送給相關服務,告知其進行配置的更新。
在Bus中,將RabbitMQ等工具作為消息發(fā)布和獲取的代理。每個服務中,由Listener負責監(jiān)聽和處理事件,EventPublisher負責與消息代理進行通信,它會收到本地發(fā)送的事件,并且發(fā)送到代理中,同時從代理中獲取事件,發(fā)回給本地注冊的Listener。Endpoint則負責暴露API,用戶可以通過Endpoint提供的接口發(fā)起事件,Endpoint會利用EventPublisher將事件發(fā)到消息代理中。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://www.ezyhdfw.cn/yun/70718.html
摘要:序主要有做服務發(fā)現(xiàn)做分布式配置做做客戶端負載均衡做斷路器做聚合的做指標監(jiān)控。配置訪問配置訪問實例調用其他微服務使用使用訪問轉向使用訪問配置的目前看來每秒發(fā)送一次貌似太頻繁可以另起一個進行訪問參考 序 主要有eureka做服務發(fā)現(xiàn)、config做分布式配置、zuul做api-gateway、feign做客戶端負載均衡、hystrix做斷路器、turbine做聚合的monitor、grap...
摘要:序主要有做服務發(fā)現(xiàn)做分布式配置做做客戶端負載均衡做斷路器做聚合的做指標監(jiān)控。配置訪問配置訪問實例調用其他微服務使用使用訪問轉向使用訪問配置的目前看來每秒發(fā)送一次貌似太頻繁可以另起一個進行訪問參考 序 主要有eureka做服務發(fā)現(xiàn)、config做分布式配置、zuul做api-gateway、feign做客戶端負載均衡、hystrix做斷路器、turbine做聚合的monitor、grap...
摘要:劉超,網(wǎng)易云計算首席架構師,有多年的云計算架構與開發(fā)經歷,積累了豐富的企業(yè)級應用的微服務化,容器化實戰(zhàn)經驗。近日,記者對劉超進行了采訪,跟大家分享了微服務實戰(zhàn)的挑戰(zhàn)和一些常見的微服務誤解,以及他對微服務發(fā)展趨勢的判斷。 劉超,網(wǎng)易云計算首席架構師,有10多年的云計算架構與開發(fā)經歷,積累了豐富的企業(yè)級應用的微服務化,容器化實戰(zhàn)經驗。劉超將擔任今年 5 月份 QCon 全球軟件開發(fā)大會廣州...
摘要:大家好,我是冰河有句話叫做投資啥都不如投資自己的回報率高。馬上就十一國慶假期了,給小伙伴們分享下,從小白程序員到大廠高級技術專家我看過哪些技術類書籍。 大家好,我是...
閱讀 2412·2023-04-26 02:14
閱讀 2988·2021-09-30 09:46
閱讀 2196·2021-09-24 09:48
閱讀 1093·2021-09-24 09:47
閱讀 3315·2019-08-30 15:44
閱讀 1938·2019-08-30 15:44
閱讀 3347·2019-08-30 14:18
閱讀 2029·2019-08-30 12:58