一.服務(wù)的調(diào)用-Ribbon + RestTemplate(獨立的組件)
1.Ribbon
Ribbon是一個客戶端的負載均衡器缩歪,用來進行SpringCloud間的微服務(wù)負載均衡調(diào)用
2.服務(wù)器端的負載均衡與客戶端的負載均衡
如下圖所示:
負載均衡的方式:
(1)客戶端負載均衡
(2)服務(wù)端負載均衡
- 網(wǎng)絡(luò)4層負載
- 網(wǎng)絡(luò)7層負載 - nginx
3.Ribbon+RestTemplate的使用
(1)再創(chuàng)建一個微服務(wù)(班級服務(wù))归薛,用于后續(xù)的服務(wù)間調(diào)用
(2)在主動的調(diào)用方(學(xué)生服務(wù) -> 班級服務(wù),學(xué)生服務(wù)就是主動調(diào)用方)添加ribbon依賴
<!-- 添加ribbon依賴 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
(3)啟動類中聲明RestTemplate組件
@Bean
@LoadBalanced//負載均衡
public RestTemplate getRest(){
return new RestTemplate();
}
(4)編寫服務(wù)調(diào)用代碼
//根據(jù)班級id,調(diào)用班級服務(wù)主籍,查詢班級信息
//關(guān)鍵 調(diào)用地址 MICRO-CLASSES 必須寫一個微服務(wù)的名稱
String classInfo = restTemplate
.getForObject("http://MICRO-CLASSES/cls/queryClsName?cid=1",String.class);
4.Ribbon的負載均衡
若微服務(wù)名稱相同习贫,那么就是集群關(guān)系
spring:
application:
name: micro-classes
(1)Ribbon的負載均衡策略
默認是輪詢,如下是隨機負載均衡規(guī)則
/**
* 切換負載均衡策略
* @return
*/
@Bean
public IRule getRule(){
return new RandomRule();
}
二.服務(wù)的調(diào)用-Feign
1.Feign
Feign底層也調(diào)用了Ribbon,F(xiàn)eign其實本質(zhì)上是Ribbon + Hystrix(豪豬)的集合體千元,因為Ribbon本身的寫法不夠面向?qū)ο笊徊芏郕ava程序員對這種寫法會很不習慣。
2.使用
(1)調(diào)用方添加feign的依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
(2)編寫一個Feign接口(關(guān)鍵)
@FeignClient("MIRCO-TEACHER")
public interface ITeacherFeign {
@RequestMapping("/tea/queryTeaName")
String queryTeaName(@RequestParam("tid") Integer tid);
}
(3)在需要調(diào)用微服務(wù)的地方幸海,注入改接口
@Autowired
private ITeacherFeign teacherFeign;
...
//遠程調(diào)用教師服務(wù)
String s = teacherFeign.queryTeaName(cid);
(4)配置啟動類注解
@SpringBootApplication(scanBasePackages = "com.qf")
@EnableEurekaClient
//表示啟動feign蜡歹,而且這個注解需要找到Feign接口所在的包,默認去啟動類所在包下找
//所有如果Feign接口沒有在啟動類的包下涕烧,就需要手動配置掃描
@EnableFeignClients(basePackages = "com.qf.feign")
public class ClassesApplication {
public static void main(String[] args) {
SpringApplication.run(ClassesApplication.class, args);
}
}
3.Feign的超時與重試
Feign默認超時時間為1S,如果1S內(nèi)汗洒,被調(diào)用方?jīng)]有返回結(jié)果议纯,就默認失敗,然后重試1次溢谤。
有些時候瞻凤,如果不加干預(yù),可能引起請求的重復(fù)發(fā)送世杀,導(dǎo)致出現(xiàn)各種問題
注意:Feign自帶超時和重試的功能阀参,但是默認是關(guān)閉的。所以我們看到的超時和重試的效果瞻坝,是底層Ribbon提供的蛛壳。如果開啟了Feign的超時重試就會覆蓋掉Ribbon的設(shè)置
(1)設(shè)置Feign的超時和重試:
#配置ribbon的超時和重試
ribbon:
#配置的是連接超時
ConnectTimeout: 1000
#配置讀超時
ReadTimeout: 1000
#配置ribbon的重試次數(shù),默認是0
MaxAutoRetries: 0
#配置ribbon的下個服務(wù)的重試次數(shù)所刀,默認是1
MaxAutoRetriesNextServer: 0
#MaxAutoRetriesNextServer為m衙荐, 表示會重試(m + 1)個實例
#MaxAutoRetries為n,表示單實例重試(n + 1)次
#總的執(zhí)行次數(shù) (n + 1) * (m + 1)
#配置Feign的超時浮创,一旦配置了Feign的超時忧吟,ribbon的重試和超時會全部失效
feign:
client:
config:
MIRCO-TEACHER: #可以針對不同的微服務(wù)配置不同的超時時間
connectTimeout: 1000
readTimeout: 6000
MIRCO-STUDENT:
connectTimeout: 1000
readTimeout: 2000
三.Hystrix(斷路器)
1.Hystrix
(1)斷路器 - 就是微服務(wù)架構(gòu)的保險絲.
(2)在微服務(wù)架構(gòu)中,根據(jù)業(yè)務(wù)會拆分成一個一個的微服務(wù)斩披,服務(wù)于服務(wù)之間可以互相調(diào)用溜族。為了保證高可用性,單個服務(wù)通常會集群部署垦沉,但是由于網(wǎng)絡(luò)等原因煌抒,不能保證服務(wù)100%可用。如果單個服務(wù)出現(xiàn)問題乡话,調(diào)用這個服務(wù)的服務(wù)就有可能出現(xiàn)線程阻塞摧玫,剛好這個時候大量的請求在訪問當前服務(wù),就會導(dǎo)致當前服務(wù)的線程資源不足,從而導(dǎo)致服務(wù)癱瘓诬像,形成故障轉(zhuǎn)移屋群,導(dǎo)致"服務(wù)雪崩"
2.Hystrix是如何解決服務(wù)間調(diào)用問題的
(1)資源隔離:雞蛋不要放在一個籃子里(線程池隔離、信號量隔離)
(2)服務(wù)降級:當調(diào)用目標服務(wù)出問題(超時坏挠、報錯....)時芍躏,會自動的調(diào)用一個本地的方法,返回一個默認值
(3)請求熔斷:一旦確定目標服務(wù)出問題(失敗比例)降狠,Hystrix的熔斷器會自動打開对竣,攔截后續(xù)的所有請求,立刻判定失敗榜配,進行服務(wù)降級否纬。過了單位時間之后,熔斷器變成半開狀態(tài)蛋褥,放行一個請求临燃,如果還是失敗,繼續(xù)全開烙心,攔截請求膜廊,否則熔斷器關(guān)閉.