Spring Cloud Netflix架構(gòu)淺析(小結(jié))
最近接觸微服務(wù)這塊的東西,對(duì)這方面有了一些了解,拿出來(lái)和大家分享一下。
1. 微服務(wù)框架Spring Boot+Spring Cloud
Spring Cloud是基于Spring Boot的一整套實(shí)現(xiàn)微服務(wù)的框架,可以說(shuō),Spring Boot作為框架,Spring Cloud作為微服務(wù),一起構(gòu)成了一種不可忽視的、新生的框架體系。它提供了微服務(wù)開發(fā)所需的配置管理、服務(wù)發(fā)現(xiàn)、斷路器、智能路由、微代理、控制總線、全局鎖、決策競(jìng)選、分布式會(huì)話和集群狀態(tài)管理等組件,方便易用。Spring Cloud包含了非常多的子框架,其中,Spring Cloud Netflix是其中一套框架,它主要提供的模塊包括:服務(wù)發(fā)現(xiàn)、斷路器和監(jiān)控、智能路由、客戶端負(fù)載均衡等。
特性
- Eureka實(shí)例可以注冊(cè)和發(fā)現(xiàn)使用spring管理的bean
- 嵌入式Eureka服務(wù)器可以用聲明式的Java配置創(chuàng)建
- Hystrix客戶端可以用簡(jiǎn)單的注解驅(qū)動(dòng)
- Java配置可以啟用嵌入的Hystrix指示面板
- 客戶端負(fù)載均衡
2. Spring Cloud Netflix組件以及部署
(1)Eureka,服務(wù)注冊(cè)和發(fā)現(xiàn),它提供了一個(gè)服務(wù)注冊(cè)中心、服務(wù)發(fā)現(xiàn)的客戶端,還有一個(gè)方便的查看所有注冊(cè)的服務(wù)的界面。 所有的服務(wù)使用Eureka的服務(wù)發(fā)現(xiàn)客戶端來(lái)將自己注冊(cè)到Eureka的服務(wù)器上。
(2)Zuul,網(wǎng)關(guān),所有的客戶端請(qǐng)求通過(guò)這個(gè)網(wǎng)關(guān)訪問(wèn)后臺(tái)的服務(wù)。他可以使用一定的路由配置來(lái)判斷某一個(gè)URL由哪個(gè)服務(wù)來(lái)處理。并從Eureka獲取注冊(cè)的服務(wù)來(lái)轉(zhuǎn)發(fā)請(qǐng)求。
(3)Ribbon,即負(fù)載均衡,Zuul網(wǎng)關(guān)將一個(gè)請(qǐng)求發(fā)送給某一個(gè)服務(wù)的應(yīng)用的時(shí)候,如果一個(gè)服務(wù)啟動(dòng)了多個(gè)實(shí)例,就會(huì)通過(guò)Ribbon來(lái)通過(guò)一定的負(fù)載均衡策略來(lái)發(fā)送給某一個(gè)服務(wù)實(shí)例。
(4)Feign,服務(wù)客戶端,服務(wù)之間如果需要相互訪問(wèn),可以使用RestTemplate,也可以使用Feign客戶端訪問(wèn)。它默認(rèn)會(huì)使用Ribbon來(lái)實(shí)現(xiàn)負(fù)載均衡。
(5)Hystrix,監(jiān)控和斷路器。我們只需要在服務(wù)接口上添加Hystrix標(biāo)簽,就可以實(shí)現(xiàn)對(duì)這個(gè)接口的監(jiān)控和斷路器功能。
(6)Hystrix Dashboard,監(jiān)控面板,他提供了一個(gè)界面,可以監(jiān)控各個(gè)服務(wù)上的服務(wù)調(diào)用所消耗的時(shí)間等。
(7)Turbine,監(jiān)控聚合,使用Hystrix監(jiān)控,我們需要打開每一個(gè)服務(wù)實(shí)例的監(jiān)控信息來(lái)查看。而Turbine可以幫助我們把所有的服務(wù)實(shí)例的監(jiān)控信息聚合到一個(gè)地方統(tǒng)一查看。
3. Spring Cloud Netflix組件開發(fā)
可以參考其中文文檔:https://springcloud.cc/spring-cloud-netflix.html
(1)服務(wù)注冊(cè)與監(jiān)控中心:
@SpringBootApplication
@EnableEurekaServer
@EnableHystrixDashboard
public class ApplicationRegistry {
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).web(true).run(args);
}
}
這里使用spring boot標(biāo)簽的 @SpringBootApplication 說(shuō)明當(dāng)前的應(yīng)用是一個(gè)spring boot應(yīng)用。這樣我就可以直接用main函數(shù)在IDE里面啟動(dòng)這個(gè)應(yīng)用,也可以打包后用命令行啟動(dòng)。當(dāng)然也可以把打包的war包用tomcat之類的服務(wù)器啟動(dòng)。 使用標(biāo)簽 @EnableEurekaServer ,就能在啟動(dòng)過(guò)程中啟動(dòng)Eureka服務(wù)注冊(cè)中心的組件。它會(huì)監(jiān)聽(tīng)一個(gè)端口,默認(rèn)是8761,來(lái)接收服務(wù)注冊(cè)。并提供一個(gè)web頁(yè)面,打開以后,可以看到注冊(cè)的服務(wù)。 添加 @EnableHystrixDashboard 就會(huì)提供一個(gè)監(jiān)控的頁(yè)面,我們可以在上面輸入要監(jiān)控的服務(wù)的地址,就可以查看啟用了Hystrix監(jiān)控的接口的調(diào)用情況。 當(dāng)然,為了使用上面的組件,我們需要在maven的POM文件里添加相應(yīng)的依賴,比如使用 spring-boot-starter-parent ,依賴 spring-cloud-starter-eureka-server 和 spring-cloud-starter-hystrix-dashboard 等。
(2)服務(wù)間調(diào)用:
兩種方式可以進(jìn)行服務(wù)調(diào)用,RestTemplate和FeignClient。不管是什么方式,他都是通過(guò)REST接口調(diào)用服務(wù)的http接口,參數(shù)和結(jié)果默認(rèn)都是通過(guò)jackson序列化和反序列化。因?yàn)镾pring MVC的RestController定義的接口,返回的數(shù)據(jù)都是通過(guò)jackson序列化成json數(shù)據(jù)。
第一種:RestTemplate,只需要定義一個(gè)RestTemplate的Bean,設(shè)置成 LoadBalanced 即可:
@Configuration
public class SomeCloudConfiguration {
@LoadBalanced
@Bean
RestTemplate restTemplate() {
return new RestTemplate();
}
}
這樣我們就可以在需要用的地方注入這個(gè)bean使用:
public class SomeServiceClass {
@Autowired
private RestTemplate restTemplate;
public String getUserById(Long userId) {
UserDTO results = restTemplate.getForObject("http://users/getUserDetail/" + userId, UserDTO.class);
return results;
}
}
其中, users 是服務(wù)ID,Ribbon會(huì)從服務(wù)實(shí)例列表獲得這個(gè)服務(wù)的一個(gè)實(shí)例,發(fā)送請(qǐng)求,并獲得結(jié)果。對(duì)象 UserDTO 需要序列號(hào),它的反序列號(hào)會(huì)自動(dòng)完成。
第二種:FeignClient
@FeignClient(value = "users", path = "/users")
public interface UserCompositeService {
@RequestMapping(value = "/getUserDetail/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
UserDTO getUserById(@PathVariable Long id);
}
我們只需要使用 @FeignClient 定義一個(gè)借口,Spring Cloud Feign會(huì)幫我們生成一個(gè)它的實(shí)現(xiàn),從相應(yīng)的users服務(wù)獲取數(shù)據(jù)。 其中, @FeignClient(value = "users", path = "/users/getUserDetail") 里面的value是服務(wù)ID,path是這一組接口的path前綴。 在下面的方法定義里,就好像設(shè)置Spring MVC的接口一樣,對(duì)于這個(gè)方法,它對(duì)應(yīng)的URL是 /users/getUserDetail/{id} 。 然后,在使用它的時(shí)候,就像注入一個(gè)一般的服務(wù)一樣注入后使用即可:
public class SomeOtherServiceClass {
@Autowired
private UserCompositeService userService;
public void doSomething() {
// .....
UserDTO results = userService.getUserById(userId);
// other operation...
}
}
(3)斷路器:
//斷路器:為了解決當(dāng)某個(gè)方法調(diào)用失敗的時(shí)候,調(diào)用后備方法來(lái)替代失敗的方法,已達(dá)到容錯(cuò)/阻止級(jí)聯(lián)錯(cuò)誤的功能
//fallbackMethod指定后備方法
@HystrixCommand(fallbackMethod = "doStudentFallback")
@RequestMapping(value = "dostudent",method = RequestMethod.GET)
public String doStudent(){
return "your name:secret,your age:secret!";
}
public String doStudentFallback(){
return "your name:FEIFEI,your age:26!";
}
其中,使用@EnableCircuitBreaker來(lái)啟用斷路器支持,Spring Cloud提供了一個(gè)控制臺(tái)來(lái)監(jiān)控?cái)嗦菲鞯倪\(yùn)行情況,通過(guò)@EnableHystrixDashboard注解開啟。
以上是簡(jiǎn)單的一些對(duì)Spring Cloud Netflix組件的介紹。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java?Bluetooth?藍(lán)牙通訊?BlueCove?掃描附近的藍(lán)牙設(shè)備(測(cè)試代碼)
BlueCove是一個(gè)開源的藍(lán)牙協(xié)議棧實(shí)現(xiàn),旨在為Java開發(fā)者提供一個(gè)全面的、易于使用的API,從而在應(yīng)用程序中實(shí)現(xiàn)藍(lán)牙功能,該項(xiàng)目支持多種操作系統(tǒng),這篇文章主要介紹了Java?Bluetooth?藍(lán)牙通訊?BlueCove?掃描附近的藍(lán)牙設(shè)備,需要的朋友可以參考下2025-01-01
mybaits-plus?lambdaQuery()?和?lambdaUpdate()?常見(jiàn)的使用方法
MyBatis-Plus是一個(gè)?MyBatis?(opens?new?window)的增強(qiáng)工具,在?MyBatis?的基礎(chǔ)上只做增強(qiáng)不做改變,為簡(jiǎn)化開發(fā)、提高效率而生,這篇文章主要介紹了mybaits-plus?lambdaQuery()?和?lambdaUpdate()?比較常見(jiàn)的使用方法,需要的朋友可以參考下2023-01-01
Centos下SpringBoot項(xiàng)目啟動(dòng)與停止腳本的方法
這篇文章主要介紹了Centos下SpringBoot項(xiàng)目啟動(dòng)與停止腳本的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11
手把手教你SpringBoot過(guò)濾器N種注冊(cè)方式
這篇文章主要介紹了手把手教你SpringBoot過(guò)濾器N種注冊(cè)方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
mybatis和mybatis-plus同時(shí)使用的坑
本文主要介紹了mybatis和mybatis-plus同時(shí)使用的坑,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
java UDP實(shí)現(xiàn)一個(gè)聊天工具的示例代碼
這篇文章主要介紹了java UDP實(shí)現(xiàn)一個(gè)聊天工具的示例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
Java實(shí)現(xiàn)枚舉狀態(tài)轉(zhuǎn)換的方法詳解
在軟件開發(fā)中,我們經(jīng)常需要處理不同系統(tǒng)或模塊間的狀態(tài)轉(zhuǎn)換,今天,我將通過(guò)一個(gè)電商訂單與物流狀態(tài)的轉(zhuǎn)換案例,展示如何優(yōu)雅地實(shí)現(xiàn)枚舉間的互相轉(zhuǎn)換,需要的朋友可以參考下2025-04-04
獲取Spring的上下文環(huán)境ApplicationContext的最簡(jiǎn)單方式
這篇文章主要介紹了獲取Spring的上下文環(huán)境ApplicationContext的最簡(jiǎn)單方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08

