springcloud選型推薦:https://start.spring.io/actuator/info
springcloud技術(shù)選型

注冊(cè)中心
一、Eureka
1)eureka自我保護(hù)機(jī)制
如果EurekaServer端在一定時(shí)間內(nèi)(默認(rèn)90s)沒有收到EurekaClient的心跳包,便會(huì)直接
從服務(wù)注冊(cè)列表中剔除該服務(wù),但是在短時(shí)間內(nèi)(90s)內(nèi)丟失了大量的服務(wù)實(shí)例心跳,
這時(shí)候EurekaSever會(huì)開啟 自我保護(hù)機(jī)制,不會(huì)剔除該服務(wù)(該現(xiàn)象可能出現(xiàn)在網(wǎng)絡(luò)不
通但是EurekaClient服務(wù)其實(shí)是可用的情況下) AP
二、Zookeeper
1)Zookeeper的微服務(wù)節(jié)點(diǎn)是臨時(shí)性節(jié)點(diǎn)。也就是說,微服務(wù)下線后,Zookeeper過一會(huì)
就會(huì)將微服務(wù)剔除 CP
查看節(jié)點(diǎn) ls /services

三、Consul
啟動(dòng) consul agent -dev
consul --version 查看consul版本
localhost:8500
當(dāng)節(jié)點(diǎn)掛了之后,consul就會(huì)立馬剔除掉該服務(wù)

Eureka Zookeeper Consul 小總結(jié)

負(fù)載均衡
一、Ribbon
@Configuration
public class MyRibbonRule {
@Bean
public IRule myRule(){
IRule irule = null;
//irule = new RoundRobinRule(); //輪詢
irule = new RandomRule(); //隨機(jī)輪詢
//irule = new RetryRule(); //先按照RoundRibbonRule方式,如果獲取失敗則在指定時(shí)間內(nèi)重試,獲取可用服務(wù)
//irule = new WeightedResponseTimeRule(); //對(duì)RoundRobinRule的擴(kuò)展,相應(yīng)速度越快的實(shí)例權(quán)重越大
//irule = new BestAvailableRule(); //先過濾掉由于多次訪問故障而處于斷路器跳閘狀態(tài)的服務(wù),然后選一個(gè)并發(fā)量最小的服務(wù)
//irule = new AvailabilityFilteringRule(); //先過濾掉故障實(shí)例,再選擇并發(fā)量較小的實(shí)例
//irule = new ZoneAvoidanceRule(); //復(fù)合判斷server所在區(qū)域的性能和server的可用性選擇服務(wù)器
return irule;
}
}
客戶端調(diào)用
OpenFeign
原來調(diào)用微服務(wù)的方式為 restTemplate + ribbon負(fù)載均衡
需要在restTemplate的@Bean上面加@LoadBlanced實(shí)現(xiàn)負(fù)載均衡
OpenFeign直接整合了restTemplate + ribbon調(diào)用方式,且內(nèi)置Ribbon,而且能用客戶端
調(diào)用的方式來調(diào)用API。
OpenFeigin超時(shí)控制:默認(rèn)1s超時(shí)
//application.yml
ribbon: #ribbon訪問接口超時(shí)時(shí)間設(shè)置,同上面的配置一個(gè)意思
ConnectTimeout: 5000
ReadTimeout: 5000

openfeign日志打印功能
1、開啟feign.Logger的configuration
@Bean
Logger.Level feignLoggerLevel(){
return Logger.Level.FULL; //詳細(xì)日志
}
2、yml配置
#開啟openfeign的調(diào)用日志
logging:
level:
#feign日志以什么級(jí)別監(jiān)控哪個(gè)接口
com.yiyang.service.PaymentService: debug
斷路器
一、Hystrix
主要的作用:降級(jí) 熔斷 接近實(shí)時(shí)的監(jiān)控
除此之外,還有限流、服務(wù)隔離等等
圖形化的服務(wù)監(jiān)控:hystrixDashboard
服務(wù)降級(jí):fallback
系統(tǒng)不可用,需要有一個(gè)兜底的方法,比如返回一個(gè)友好提示
出現(xiàn)降級(jí)的情況:程序異常,超時(shí),服務(wù)熔斷觸發(fā)服務(wù)降級(jí),線程池滿了
服務(wù)熔斷:break
類比保險(xiǎn)絲達(dá)到最大服務(wù)訪問數(shù),直接拒絕訪問,然后調(diào)用服務(wù)降級(jí)的方法并
返回友好提示
服務(wù)線路:limit
秒殺 高并發(fā)等操作,比如限制qps數(shù)量
斷路器概念:
“斷路器”本身就是一種開關(guān)設(shè)置,當(dāng)某個(gè)服務(wù)單元發(fā)生故障后,通過斷路器的故障監(jiān)控
(類似熔斷保險(xiǎn)絲),向調(diào)用方返回一個(gè)復(fù)合預(yù)期的、可處理的備選響應(yīng)(FallBack),
而不是長(zhǎng)時(shí)間的等待或者拋出調(diào)用方無(wú)法處理的異常,這樣就保證了服務(wù)調(diào)用方的線程
不會(huì)被長(zhǎng)時(shí)間、不必要的占用,從而避免了故障在分布式系統(tǒng)中的蔓延,乃至雪崩。
一般需要使用降級(jí) 熔斷 限流的場(chǎng)景有:
1、服務(wù)提供方8001超時(shí)了,調(diào)用者80不能一直卡死等待,需要服務(wù)降級(jí)
2、對(duì)方服務(wù)8001 down機(jī)了,80不能一直卡死等待,需要降級(jí)
3、8001服務(wù)OK,但是調(diào)用者80自己出故障或者有自我要求(自己等待的時(shí)間小于
服務(wù)執(zhí)行時(shí)間)
服務(wù)降級(jí):
既可以配置在服務(wù)提供者,也可以配置在服務(wù)消費(fèi)者。一般的來說,服務(wù)降級(jí)是放在
微服務(wù)消費(fèi)者一端。
微服務(wù)提供者降級(jí)配置如下:
//指定需要降級(jí)的方法
@Override
@HystrixCommand(fallbackMethod = "getByIdTimeoutHandler", commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")
})
//@EnableCircuitBreaker 開啟服務(wù)降級(jí)配置
@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker //開啟服務(wù)降級(jí)注解
public class PaymentApplicationHystrix8001 {
public static void main(String[] args) {
SpringApplication.run(PaymentApplicationHystrix8001.class, args);
}
}
微服務(wù)消費(fèi)者降級(jí)配置如下(結(jié)合OpenFeign使用):
服務(wù)熔斷:
滿足條件:
1、滿足一定的閾值的時(shí)候(默認(rèn)10s內(nèi)超過20個(gè)請(qǐng)求次數(shù))
2、當(dāng)失敗率達(dá)到一定的時(shí)候(默認(rèn)10s內(nèi)超過50%的請(qǐng)求失?。?br>
3、達(dá)到以上閾值,斷路器會(huì)開啟
4、當(dāng)開啟的時(shí)候,所有的請(qǐng)求將不會(huì)被轉(zhuǎn)發(fā)
5、一段時(shí)間后(默認(rèn)是5s),這個(gè)時(shí)候斷路器會(huì)變成半開狀態(tài),會(huì)讓其中一個(gè)請(qǐng)求訪問,若成功,斷路器會(huì)關(guān)閉,若失敗,繼續(xù)開啟,虛幻4和5
https://github.com/Netflix/Hystrix/wiki/Configuration 斷路器屬性解釋

HystrixDashboard:#####
注意:
1、dashboard和被監(jiān)控的服務(wù),都需要引入 spring-boot-starter-actuator
2、被監(jiān)控的模塊啟動(dòng)類里面要加上 如下代碼:
/**
* 此配置是為了服務(wù)監(jiān)控而配置,與服務(wù)容錯(cuò)本身無(wú)關(guān),springcloud升級(jí)后的坑
* ServletRegistrationBean是因?yàn)閟pringboot的默認(rèn)路徑不是/hystrix.stream,
* 只要在自己的項(xiàng)目里配置上下面的servlet就可以了。
* @author lsw
* @date 2022/4/9 11:39
*/
@Bean
public ServletRegistrationBean getServlet(){
HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
registrationBean.setLoadOnStartup(1);
registrationBean.addUrlMappings("/hystrix.stream");
registrationBean.setName("HystrixMetricsStreamServlet");
return registrationBean;
}
監(jiān)控地址:http://localhost:9001/hystrix


網(wǎng)關(guān)
一、gateway
gateway核心三要素:路由、斷言、過濾器
gateway作用:為外部請(qǐng)求提供服務(wù)接口,滿足路由規(guī)則,斷言規(guī)則,過濾器規(guī)則就可以
訪問。
配置中心
一、springcloud config

Client代表有通用配置的微服務(wù)
Server代表配置中心微服務(wù)
server鏈接github或者gitee等遠(yuǎn)程倉(cāng)庫(kù)yml,客戶端鏈接config服務(wù)端,當(dāng)github內(nèi)容變動(dòng),
通過curl -X POST "http://localhost:3355/actuator/refresh"動(dòng)態(tài)刷新客戶端yml配置。
但是如果用N個(gè)客戶端,就要刷新N次,所以就出現(xiàn)了服務(wù)總線,就是為了解決多次
刷新的問題。
服務(wù)總線
bus
config服務(wù)端和客戶端都要引入spring-cloud-starter-bus-amqp依賴,意思是引入bus和
rabbitmq。最后通過curl -X POST "http://localhost:3344/actuator/bus-refresh"來刷新通
知config客戶端。
現(xiàn)在就記個(gè)大概,后面有時(shí)間詳細(xì)貼代碼。
注意:bus支持的消息隊(duì)列有 rabbitmq和kafka
Spring cloud stream
服務(wù)鏈路追蹤
Sleuth Zipkin
spring cloud alibaba
https://github.com/alibaba/spring-cloud-alibaba/blob/2021.x/README-zh.md
注冊(cè)中心 + 配置中心
Nacos
https://github.com/alibaba/Nacos
等同于spring cloud的 eureka config bus
nacos單機(jī)版數(shù)據(jù)持久化用的是嵌入式數(shù)據(jù)庫(kù) derby
nacos集群

待續(xù)...持續(xù)學(xué)習(xí)更新中