springcloud

springcloud選型推薦:https://start.spring.io/actuator/info

springcloud技術(shù)選型


技術(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

微服務(wù)重新上線后節(jié)點(diǎn)ID對(duì)比
三、Consul

啟動(dòng) consul agent -dev
consul --version 查看consul版本
localhost:8500

當(dāng)節(jié)點(diǎn)掛了之后,consul就會(huì)立馬剔除掉該服務(wù)

consul注冊(cè)進(jìn)consul

Eureka Zookeeper Consul 小總結(jié)

三者對(duì)比

負(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
超時(shí)演示

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 斷路器屬性解釋

hystrix工作流程-官方網(wǎng)站
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

監(jiān)控地址

監(jiān)控畫面

網(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集群


nacos集群

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 幫你輕松入門SpringCloud~ 1 微服務(wù)概述 1.1什么是微服務(wù) 如idea中使用maven建立的一個(gè)個(gè)m...
    24f83f0cb309閱讀 224評(píng)論 0 0
  • 本系列筆記涉及到的代碼在GitHub上,地址:https://github.com/zsllsz/cloud 本文...
    貪挽懶月閱讀 1,650評(píng)論 2 15
  • 目錄 1 概念 2 Springboot 3 Spring Cloud Eureka 4 Spring C...
    小小千千閱讀 843評(píng)論 0 0
  • 一、什么是微服務(wù)架構(gòu)? 微服務(wù)架構(gòu)是一種架構(gòu)模式或者說是一種架構(gòu)風(fēng)格, 它提倡將單一應(yīng)用程序劃分成一組小的服務(wù) ,...
    西谷haul閱讀 504評(píng)論 0 1
  • 相當(dāng)詳細(xì)[https://blog.csdn.net/cuiqwei/article/details/118329...
    zhengaoly閱讀 5,819評(píng)論 1 3

友情鏈接更多精彩內(nèi)容