springCloud --- 高級(jí)篇(1)

本系列筆記涉及到的代碼在GitHub上魏滚,地址:https://github.com/zsllsz/cloud

本文涉及知識(shí)點(diǎn):

  • springCloud Alibaba介紹盯腌;

  • nacos做注冊(cè)中心涨共;

  • nacos做配置中心;

  • sentinel流控伍宦;


歡迎大家關(guān)注我的公眾號(hào) javawebkf给猾,目前正在慢慢地將簡(jiǎn)書文章搬到公眾號(hào),以后簡(jiǎn)書和公眾號(hào)文章將同步更新先朦,且簡(jiǎn)書上的付費(fèi)文章在公眾號(hào)上將免費(fèi)缰冤。


一、springCloud Alibaba簡(jiǎn)介

1喳魏、為什么會(huì)誕生springCloud Alibaba棉浸?
通過springCloud初級(jí)篇和中級(jí)篇的學(xué)習(xí),我們知道springCloud很多技術(shù)現(xiàn)在都停更了刺彩,Netflix也說明了不再維護(hù)了迷郑。一開始阿里搞出了一個(gè)Dubbo,但是后面停更了幾年创倔,spring就聯(lián)合Netflix搞出了一個(gè)springCloud生態(tài)嗡害,Netflix主要技術(shù)有5個(gè),eureka畦攘、ribbon霸妹、feign、zuul和config知押。但是呢Netflix內(nèi)部神仙打架叹螟,意見不一,然后導(dǎo)致這些技術(shù)大部分停更了朗徊。這時(shí)首妖,阿里又殺出來了,搞出了一套springCloud Alibaba爷恳,spring官方看它還不錯(cuò)有缆,阿里也想推廣自己,所以在2018年四月份spring又把springCloud Alibaba給收編了温亲。所以對(duì)于我們使用者而言棚壁,無非就是從 springCloud Netflix 換成 springCloud Alibaba而已。

2栈虚、springCloud Alibaba能干嘛袖外?

  • 服務(wù)的注冊(cè)與發(fā)現(xiàn)
  • 服務(wù)的降級(jí)與限流
  • 分布式配置管理
  • 消息驅(qū)動(dòng)能力
  • 分布式任務(wù)調(diào)度
  • 阿里云對(duì)象存儲(chǔ)
  • 阿里云短信服務(wù)

可以發(fā)現(xiàn),springCloud能干的它幾乎都能干魂务,還多了一些springCloud不能干的曼验。springCloud Alibaba相關(guān)網(wǎng)址如下泌射,可以查閱相關(guān)文檔:
https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md
https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html
一般我們要學(xué)怎么使用查第二個(gè)文檔就好了。

二鬓照、springCloud Alibaba Nacos 代替eureka做服務(wù)注冊(cè)中心

之前springCloud的服務(wù)注冊(cè)可以用eureka熔酷、consul和zookeeper,配置中心用config和bus豺裆,現(xiàn)在springCloud Alibaba用Nacos搞定這些拒秘,簡(jiǎn)言之就是注冊(cè)中心加配置中心。
1臭猜、下載安裝:

bash startup.sh -m standalone
  • 測(cè)試:訪問 ip:8848/nacos蔑歌,看到如下畫面就啟動(dòng)成功了羹应,默認(rèn)賬號(hào)密碼都是nacos。


    nacos

2丐膝、基于nacos的服務(wù)提供者:

  • 新建名為cloudalibaba-provider-payment9001的module
  • 父pom.xml中添加springCloud Alibaba依賴(一開始就添加過了)
  • pom.xml:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator </artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
    <optional>true</optional>
</dependency>
<!-- nacos -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  • application.yml:
server:
  port: 9001
spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.0.106:8848
# 端點(diǎn)啟動(dòng)和暴露(這時(shí)actuator的功能量愧,學(xué)springcloud config時(shí)也配置過)
management:
  endpoints:
    web:
      exposure:
        include:
        - "*"
  • 主啟動(dòng)類:
@SpringBootApplication
@EnableDiscoveryClient
public class NacosMainPayment9001 {
    public static void main(String[] args) throws Exception {
        SpringApplication.run(NacosMainPayment9001.class, args);
    }
}
  • 業(yè)務(wù)類:
@RestController
@RequestMapping("/provider")
public class PaymentController {
    
    @GetMapping("/payment/{id}")
    public String payment(@PathVariable("id") Integer id) {
        return "success" + id;
    }
}
  • 最后啟動(dòng)該項(xiàng)目,并訪問測(cè)試一下帅矗,然后看看nacos控制臺(tái)。


    服務(wù)成功注冊(cè)進(jìn)nacos
  • 為了等下演示nacos的負(fù)載均衡煞烫,新建9002浑此,內(nèi)容幾乎和9001一樣。

3滞详、基于nacos的服務(wù)消費(fèi)者:

  • 新建名為cloudalibaba-consumer-nacos-order80的module
  • pom.xml:和9001的一樣
  • application.yml:
server:
  port: 80
spring:
  application:
    name: nacos-order-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.0.106:8848
# 消費(fèi)者將要去訪問的微服務(wù)名稱
service-url:
  nacos-user-service: http://nacos-payment-provider
  • 主啟動(dòng)類:和9001的一樣凛俱,也是那兩個(gè)注解
  • 配置RestTemplate:
@Configuration
public class RestTemplateConfig {
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}
  • controller:
@RestController
@RequestMapping("/consumer")
public class OrderController {

    @Autowired
    private RestTemplate restTemplate;
    
    @Value("${service-url.nacos-user-service}")
    private String serverUrl;
    
    @GetMapping("/order/{id}")
    public String getPayment(@PathVariable("id") Integer id) {
        return restTemplate.getForObject(serverUrl + "/provider/payment/" + id, String.class);
    }
}

訪問這個(gè)controller,就會(huì)發(fā)現(xiàn)一次是調(diào)用9001料饥,一次是調(diào)用9002蒲犬。因?yàn)閚acos也集成了ribbon,所以自帶負(fù)載均衡岸啡。

4原叮、nacos的CAP模型:
nacos支持CP和AP,可以自由切換巡蘸。這樣一來奋隶,nacos可以代替所有的注冊(cè)中心。如果要代替eureka悦荒,用AP唯欣,如果要代替consul或者zookeeper,用CP搬味。

三境氢、springCloud Alibaba Nacos 代替config做服務(wù)配置中心

1蟀拷、新建名為cloudalibaba-config-nacos-client3377的module:

  • pom.xml:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator </artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
    <optional>true</optional>
</dependency>
<!-- nacos -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- nacos config -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
  • yml:和config一樣,要先搞一個(gè)bootstrap.yml從配置中心拉取配置萍聊,其他自己專有的再用application.yml匹厘。先有共性再有個(gè)性。
    bootstrap.yml:
server:
  port: 3377
spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.0.106:8848
      config:
        server-addr: 192.168.0.106:8848
        file-extension: yaml #指定yaml格式的配置脐区,就是對(duì)應(yīng)以前用config時(shí)GitHub上的配置文件

application.yml:

spring:
  profiles:
    active:
    - dev #激活開發(fā)環(huán)境
  • 主啟動(dòng)類:
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigMain3377 {
    public static void main(String[] args) throws Exception {
        SpringApplication.run(NacosConfigMain3377.class, args);
    }
}
  • controller:用@Value注解嘗試讀取nacos中的配置文件
@RestController
@RequestMapping("/config")
@RefreshScope // 動(dòng)態(tài)刷新
public class NacosConfigController {
    @Value("${config.info}")
    private String info;
    
    @GetMapping("/info")
    public String info() {
        return info;
    }
}

至此工程新建完畢愈诚,接下來就要去nacos中新建配置文件。

2牛隅、在nacos上新建配置文件:

  • 先看一下nacos配置管理的界面:
nacos配置管理

可以看到有一個(gè)Data Id炕柔,一個(gè)Group。
Data Id的格式:

${prefix}-${spring.profile.active}.${file-extension}
  • prefix 默認(rèn)為 spring.application.name 的值媒佣,也可以通過配置項(xiàng) spring.cloud.nacos.config.prefix來配置匕累。
  • spring.profile.active 即為當(dāng)前環(huán)境對(duì)應(yīng)的 profile,注意:當(dāng) spring.profile.active 為空時(shí)默伍,對(duì)應(yīng)的連接符 - 也將不存在欢嘿,dataId 的拼接格式變成 ${prefix}.${file-extension}。在使用的時(shí)候也糊,還是不要讓它為空炼蹦,免得出現(xiàn)奇奇怪怪的問題。
  • file-exetension 為配置內(nèi)容的數(shù)據(jù)格式狸剃,可以通過配置項(xiàng) spring.cloud.nacos.config.file-extension 來配置掐隐。目前只支持 propertiesyaml 類型。
  • 通過 Spring Cloud 原生注解 @RefreshScope 實(shí)現(xiàn)配置自動(dòng)更新钞馁,這就是剛才controller中加這個(gè)注解的原因虑省。
    按照上面的格式,那3377這個(gè)項(xiàng)目的data Id就是:nacos-config-client-dev.yaml
    然后在nacos上新建如下配置:
新建配置

這個(gè)配置一定要注意每個(gè)冒號(hào)后面要加一個(gè)空格僧凰!

  • 然后訪問3377的controller探颈,就可以成功獲取到配置了:
成功讀取到配置
  • 動(dòng)態(tài)刷新:現(xiàn)在修改nacos上的配置文件,然后再次訪問3377的controller训措,會(huì)發(fā)現(xiàn)可以獲取到最新的內(nèi)容伪节。(如果沒有獲取到最新的,那就是瀏覽器緩存的原因)

3隙弛、nacos配置管理的命名空間架馋、data id和group的關(guān)系:

nacos
  • 命名空間:有一個(gè)默認(rèn)的public,相當(dāng)于對(duì)group進(jìn)行分組管理
  • 分組group:有一個(gè)默認(rèn)的DEFAULT_GROUP全闷,對(duì)data Id進(jìn)行分組管理
  • data Id:理解為配置文件的id

所以三者關(guān)系就是:namespace + group + data Id可以確認(rèn)一個(gè)唯一的配置文件叉寂。

這樣設(shè)計(jì)的好處就是可以方便地區(qū)分不同的環(huán)境。比如現(xiàn)在有開發(fā)总珠、測(cè)試和生產(chǎn)三個(gè)環(huán)境屏鳍,那我們就新建三個(gè)不同的namespace勘纯。

使用默認(rèn)命名空間默認(rèn)分組讀取不同data id的配置文件:

  • 在nacos上新建nacos-config-client-test.yaml,當(dāng)作測(cè)試環(huán)境的配置文件钓瞭,目前都是public命名空間默認(rèn)分組下驳遵;
  • 將3377的application.yml中的dev改成test,就可以讀測(cè)試環(huán)境配置文件了山涡;

使用默認(rèn)命名空間不同分組讀取配置配置文件:

  • 在nacos上新建兩個(gè)配置文件,名字都叫nacos-config-client-info.yaml堤结,分組分別為DEV_GROUP和TEST_GROUP;
  • 然后bootstrap.yml和application.yml分別改成這樣:
server:
  port: 3377
spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.0.106:8848
      config:
        server-addr: 192.168.0.106:8848
        file-extension: yaml #指定yaml格式的配置鸭丛,就是對(duì)應(yīng)以前用config時(shí)GitHub上的配置文件
        group: DEV_GROUP
spring:
  profiles:
    active:
    #- dev #激活開發(fā)環(huán)境
    - info

這樣就搞定了竞穷,這樣讀取的就是dev_group分組下的info配置文件。

使用不同的命名空間讀取不同的配置文件:

  • 新建DEV和TEST命名空間鳞溉;
命名空間

bootstrap.yml再加一行配置瘾带,如下:

server:
  port: 3377
spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.0.106:8848
      config:
        server-addr: 192.168.0.106:8848
        file-extension: yaml #指定yaml格式的配置,就是對(duì)應(yīng)以前用config時(shí)GitHub上的配置文件
        namespace: 4d4b4c98-2746-4ff7-8ce9-eb2837db456c
        group: DEV_GROUP

這樣就可以指定命名空間指定分組讀取指定后綴文件了熟菲。

四看政、nacos集群和持久化

官網(wǎng)的集群架構(gòu)圖:VIP的意思是虛擬IP,我們可以認(rèn)為vip就是nginx的集群抄罕。

nacos集群架構(gòu)圖

nacos默認(rèn)自帶了一個(gè)數(shù)據(jù)庫(derby)用來做持久化允蚣,當(dāng)nacos集群的時(shí)候,每一臺(tái)服務(wù)器上的nacos都以自己自帶的數(shù)據(jù)庫來搞持久化贞绵,會(huì)存在數(shù)據(jù)一致性的問題荠卷。所以干脆都別用自帶的數(shù)據(jù)庫了姑宽,都用MySQL懒棉。

1蚕键、用MySQL做持久化:

  • 在nacos/conf目錄下有一個(gè)nacos-mysql.sql的腳本你画,在MySQL中新建一個(gè)名為nacos_config的數(shù)據(jù)庫沟娱,在此數(shù)據(jù)庫中執(zhí)行這個(gè)腳本即可械巡;
  • 在nacos/conf目錄下有一個(gè)application.properties文件七婴,打開修改它將官網(wǎng)的這段配置粘貼到其中乳怎,并將MySQL連接地址改成自己的就可以了:
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://192.168.0.106:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=你的MySQL密碼
  • 修改完重啟nacos,重啟之后立即訪問可能會(huì)訪問不了彩郊,畢竟人家啟動(dòng)也要時(shí)間嘛。啟動(dòng)完登陸進(jìn)去蚪缀,發(fā)現(xiàn)之前的配置都沒了秫逝。然后自己新增配置,再去數(shù)據(jù)庫查看询枚,發(fā)現(xiàn)nacos_config數(shù)據(jù)庫的config_info表中就有數(shù)據(jù)了违帆,說明切換到MySQL成功了。

2金蜀、nacos集群:
需要的環(huán)境:

  • 2個(gè)nginx(此處為了簡(jiǎn)單就只啟動(dòng)了一個(gè)nginx刷后,想了解nginx集群可以參考我nginx相關(guān)文章)
  • 3個(gè)nacos
  • 1個(gè)mysql

nginx集群和mysql已經(jīng)安裝好了的畴,nacos集群通過如下步驟搞定:

  • nacos的application.properties中加上MySQL配置(之前已經(jīng)加過);
  • 拷貝cluster.conf.example改名為cluster.conf尝胆,然后修改其內(nèi)容:
192.168.2.43:8848
192.168.2.43:8849
192.168.2.43:8850

由于這里是在一臺(tái)虛擬機(jī)上啟動(dòng)3份nacos丧裁,所以后面要加上端口。如果有3臺(tái)不同的機(jī)器含衔,那么這里直接寫那3臺(tái)機(jī)器的ip就好了煎娇。并且要注意,這個(gè)ip不能填寫127.0.0.1贪染,執(zhí)行hostname -i缓呛,填寫ens33后面跟著的那個(gè)IP。

  • 修改nacos的startup.sh抑进,使其能夠指定端口啟動(dòng):
    修改有兩處强经,第一處,增加端口啟動(dòng)寺渗,如下圖匿情,左邊是修改前,右邊是修改后:
增加端口啟動(dòng)

第二次啟動(dòng)信殊,啟動(dòng)日志增加端口打印炬称,如下圖,上面是修改前涡拘,下面是修改后:

增加端口打印

這樣就改完了玲躯。

  • 修改nginx的conf配置文件:
 upstream cluster {
      server  192.168.2.43:8848;
      server  192.168.2.43:8849;
      server  192.168.2.43:8850;
  }

  server {
      listen       80;
      server_name  192.168.2.43;
      location / {
      proxy_pass  http://cluster;
  }

這樣所有配置都整完了,接下來依次啟動(dòng)nginx和nacos.

  • 啟動(dòng)nginx鳄乏;
  • 啟動(dòng)nacos集群:
./startup.sh -p 8848
./startup.sh -p 8849
./startup.sh -p 8850

啟動(dòng)成功后跷车,訪問:192.168.2.43/nacos,登錄后可以看到如下效果:

集群節(jié)點(diǎn)

可能遇到的坑:

  • 異常1:
unable to find local peer: 192.168.2.43:0, all peers: [192.168.2.43:8850, 192.168.2.43:8849, 192.168.2.43:8848]

解決辦法:在nacos/config/application.properties中加上如下配置:

nacos.inetutils.ip-address=192.168.2.43
  • 異常2:一直啟動(dòng)中橱野,nacos is starting……朽缴,可能是虛擬機(jī)內(nèi)存不夠,將啟動(dòng)命令中為jvm分配的內(nèi)存設(shè)置小一點(diǎn)即可水援,如下:
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"


五密强、springCloud Alibaba Sentinel介紹和基本使用

1、sentinel介紹:
之前我們用hystrix豪豬哥來實(shí)現(xiàn)服務(wù)降級(jí)熔斷蜗元,sentinel也是干這事的或渤,并且更加強(qiáng)大和好用。

  • 官網(wǎng):https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D

sentinel能夠解決的問題:

  • 服務(wù)雪崩
  • 服務(wù)降級(jí)
  • 服務(wù)熔斷
  • 服務(wù)限流

2奕扣、優(yōu)點(diǎn):

  • 豐富的應(yīng)用場(chǎng)景:秒殺薪鹦、消息削峰填谷,集群流量控制成畦,實(shí)時(shí)熔斷等
  • 完備的實(shí)時(shí)監(jiān)控:精確到秒的實(shí)時(shí)監(jiān)控
  • 廣泛的開原生態(tài):可以快速的與springCloud距芬、dubbo等框架整合
  • 完善的SPI擴(kuò)展點(diǎn):提供了完善的SPI擴(kuò)展接口涝开,可以通過實(shí)現(xiàn)擴(kuò)展接口來定制邏輯

3、下載安裝:

  • 下載地址:https://github.com/alibaba/Sentinel/releases框仔,選擇對(duì)應(yīng)版本點(diǎn)擊進(jìn)入舀武,下載dashboard即可,比如我下載的是sentinel-dashboard-1.7.0.jar

  • 使用文檔:https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html#_spring_cloud_alibaba_sentinel

  • sentinel運(yùn)行:控制臺(tái)由兩部分構(gòu)成离斩,前臺(tái)和后臺(tái)银舱。前臺(tái)(即web界面)的端口是8080,所以8080端口不能被占用跛梗,并且要jdk8及以上寻馏。下載完成后直接java -jar運(yùn)行jar包即可。然后訪問8080核偿,出現(xiàn)如下界面即啟動(dòng)成功诚欠,默認(rèn)用戶名和密碼都是sentinel。

sentinel

相比豪豬哥漾岳,簡(jiǎn)單了很多轰绵,豪豬哥需要我們引入依賴后自己?jiǎn)?dòng)一個(gè)微服務(wù)當(dāng)成dashboard,而sentinel不需要自己寫尼荆,直接運(yùn)行jar包就可以了左腔。

4、初用sentinel:

  • 啟動(dòng)8848的nacos(為了簡(jiǎn)單捅儒,就啟動(dòng)了單機(jī)版而不是集群版)
  • 新建名為cloudalibaba-sentinel-service8401的module:
    pom.xml:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator </artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
    <optional>true</optional>
</dependency>
<!-- nacos -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 做持久化的時(shí)候會(huì)用到的 -->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
<!-- sentinel -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- openfeign -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

application.yml:

server:
  port: 8401
spring:
  application:
    name: cloudalibaba-sentinel-service
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.0.106:8848
    sentinel:
      transport:
        dashboard: 192.168.0.106:8080
        port: 8719 # 默認(rèn)8719液样,如果被占用會(huì)依次加1,直至找到?jīng)]有被占用的端口
# actuator圖形化配置
management:
  endpoints:
    web:
      exposure:
        include:
        - "*"

主啟動(dòng)類:

@SpringBootApplication
@EnableDiscoveryClient
public class SentinalMain8401 {
    public static void main(String[] args) throws Exception {
        SpringApplication.run(SentinalMain8401.class, args);
    }
}

controller:

@RestController
@RequestMapping("/sentinel")
public class FlowLimitController {

    @GetMapping("/testA")
    public String testA() {
        return "=========== testA ==========";
    }
    
    @GetMapping("/testB")
    public String testB() {
        return "=========== testB ==========";
    }
}
  • 啟動(dòng)8080的sentinel
  • 啟動(dòng)8401的微服務(wù)
  • 訪問8401微服務(wù)巧还,然后看sentinel控制臺(tái)是否有相關(guān)信息

8080控制臺(tái)并沒有任何8401的相關(guān)信息鞭莽,不要方,這是因?yàn)閟entinel使用懶加載機(jī)制麸祷,沒調(diào)用的不會(huì)出現(xiàn)在dashboard中撮抓。訪問一下8401,然后再看dashboard中就有了摇锋。

sentinel正在監(jiān)控8401

然后訪問幾次8401,實(shí)時(shí)監(jiān)控中就會(huì)有相關(guān)信息了站超,如下圖:

testA的調(diào)用信息

可能遇到的坑:不管怎么訪問8401荸恕,實(shí)時(shí)監(jiān)控中都沒有調(diào)用信息,可能的原因有:

  • 如果你的sentinel運(yùn)行在虛擬機(jī)上死相,8401運(yùn)行在自己電腦上融求,那么可能原因是虛擬機(jī)時(shí)間和本機(jī)時(shí)間不一致導(dǎo)致。解決辦法就是更新虛擬機(jī)時(shí)間算撮,命令如下:
yum -y install ntp ntpdate
ntpdate cn.pool.ntp.org
  • 如果sentinel運(yùn)行在虛擬機(jī)上生宛,8401在本機(jī)县昂,訪問8401后,sentinel沒有監(jiān)控到陷舅,并且sentinel運(yùn)行日志報(bào)了如下的錯(cuò)誤:
java.util.concurrent.ExecutionException: java.net.NoRouteToHostException: 沒有到主機(jī)的路由

解決辦法就是在8401的application.yml中加上如下配置:

sentinel:
      transport:
        dashboard: 192.168.0.106:8080
        client-ip: 192.168.0.104 # 這一行是新加的
        port: 8719 # 默認(rèn)8719倒彰,如果被占用會(huì)依次加1,直至找到?jīng)]有被占用的端口

就是加上client-ip莱睁,值就是8401項(xiàng)目待讳,即你要sentinel監(jiān)控的項(xiàng)目所運(yùn)行的機(jī)器的IP。

六仰剿、sentinel流控規(guī)則

1创淡、基本介紹:

sentinel流控規(guī)則

在sentinel的dashboard中有一個(gè)流控規(guī)則,如上圖南吮,下面對(duì)這些名詞進(jìn)行解釋琳彩。

  • 資源名:唯一名稱,默認(rèn)請(qǐng)求路徑
  • 針對(duì)來源:sentinel可以針對(duì)調(diào)用者進(jìn)行限流部凑,填寫微服務(wù)名稱露乏,默認(rèn)default,表示不區(qū)分來源
  • 閾值類型:QPS(每秒鐘的請(qǐng)求數(shù)):當(dāng)調(diào)用該API的QPS達(dá)到閾值時(shí)砚尽,進(jìn)行限流施无;線程數(shù):當(dāng)調(diào)用該API的線程數(shù)達(dá)到閾值時(shí)進(jìn)行限流
  • 是否集群:不需要集群
  • 流控模式:直接:達(dá)到限流條件時(shí)直接限流;關(guān)聯(lián):關(guān)聯(lián)的資源達(dá)到閾值時(shí)限流自己(當(dāng)與A關(guān)聯(lián)的資源B達(dá)到閾值時(shí)必孤,就限流A自己猾骡。應(yīng)用場(chǎng)景:支付服務(wù)達(dá)到閾值的時(shí)候,就限流下訂單的服務(wù))敷搪;鏈路:只記錄指定鏈路上的流量(指定資源從入口資源進(jìn)來的流量兴想,如果達(dá)到閾值,就進(jìn)行限流赡勘,API級(jí)別的針對(duì)來源)
  • 流控效果:快速失斏┍恪:直接失敗,拋異常闸与;warm up:根據(jù)codeFactor(冷加載因子毙替,默認(rèn)是3)的值,從閾值/codeFactor践樱,經(jīng)過預(yù)熱時(shí)長(zhǎng)厂画,才達(dá)到設(shè)置的QPS閾值
  • 排隊(duì)等待:勻速排隊(duì),讓請(qǐng)求以勻速通過拷邢,閾值類型必須設(shè)置為QPS袱院,否則無效

2、流控模式:

流控模式之直接:

QPS直接快速失敗:

  • 添加流控規(guī)則:在簇點(diǎn)鏈路那里添加流控即可忽洛,比如我添加的如下:
sentinel QPS直接快速失敗

這里設(shè)置的意思就是腻惠,訪問testB,一秒鐘超過一次欲虚,就是直接快速報(bào)錯(cuò)集灌。我現(xiàn)在對(duì)testB連點(diǎn)兩下,就會(huì)返回如下信息:

sentinel對(duì)testB進(jìn)行流控
  • 存在的問題:超過QPS閾值的時(shí)候苍在,返回的是默認(rèn)信息Blocked by Sentinel (flow limiting)绝页,如何自定義呢?應(yīng)該有hystrix一樣的兜底方法(后續(xù)再說其用法)寂恬。

線程數(shù)直接失斝:

sentinel線程數(shù)直接失敗

我們?cè)僭L問testB,發(fā)現(xiàn)不管點(diǎn)多快初肉,都沒有被流控給攔住酷鸦。因?yàn)槲覀冊(cè)谝粋€(gè)瀏覽器中訪問,始終是一個(gè)線程牙咏。這樣配置的意思就是并發(fā)線程數(shù)超過閾值1時(shí)臼隔,就會(huì)返回失敗信息⊥可以用jmeter模擬并發(fā)訪問的情況摔握。

流控模式之關(guān)聯(lián):

配置如下:

sentinel流控之關(guān)聯(lián)

這里的意思就是testA的QPS數(shù)超過1,就會(huì)導(dǎo)致testB不能用丁寄。測(cè)試方法:用jmeter對(duì)testA進(jìn)行并發(fā)訪問氨淌,然后我們?cè)跒g覽器訪問testB。就會(huì)發(fā)現(xiàn)也會(huì)返回Blocked by Sentinel (flow limiting)伊磺。

流控模式之鏈路:
多個(gè)請(qǐng)求調(diào)用了同一個(gè)微服務(wù)超過了QPS閾值就會(huì)快速失敗盛正,配置如下:

sentinel流控之鏈路

注意入口資源的名字就是sentinel簇點(diǎn)鏈路中顯示的名字。然后快速訪問A屑埋,只要QPS超過1豪筝,就會(huì)返回Blocked by Sentinel (flow limiting)

3摘能、流控效果:
上面用的流控效果都是快速失敗续崖,現(xiàn)在來認(rèn)識(shí)一下這些流控效果。

  • 快速失斖鸥恪:上面的案例都是直接失敗袜刷,就是超過閾值就返回Blocked by Sentinel (flow limiting)
  • 預(yù)熱( Warm Up):請(qǐng)求的QPS從 閾值 / 冷加載因子(默認(rèn)是3)開始,經(jīng)過 預(yù)熱時(shí)長(zhǎng)莺丑,最后達(dá)到閾值。比如下圖的配置意思是:初始閾值為 10 / 3 = 3,經(jīng)過10秒鐘的時(shí)間梢莽,閾值慢慢升到10∠舳梗現(xiàn)在快速訪問testA,因?yàn)橐婚_始QPS閾值為3昏名,所以你點(diǎn)快一點(diǎn)可能就失敗了涮雷,但是慢慢地,你點(diǎn)很快都不會(huì)失敗了轻局,因?yàn)樽詈箝撝瞪秊?0洪鸭,正常情況下沒有人手速能達(dá)到1秒鐘點(diǎn)11次吧。
sentinel流控效果之預(yù)熱
  • 排隊(duì)等待:就是不管同時(shí)有多少個(gè)請(qǐng)求過來仑扑,我每秒鐘只處理閾值數(shù)的請(qǐng)求览爵,其他老老實(shí)實(shí)排隊(duì)等待去。如下圖配置意思就是每秒鐘只處理一個(gè)镇饮,其他的排隊(duì)等著蜓竹,每隔1000毫秒才放下一個(gè)請(qǐng)求進(jìn)來。
sentinel流控效果之排隊(duì)等待
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載储藐,如需轉(zhuǎn)載請(qǐng)通過簡(jiǎn)信或評(píng)論聯(lián)系作者俱济。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市钙勃,隨后出現(xiàn)的幾起案子蛛碌,更是在濱河造成了極大的恐慌,老刑警劉巖辖源,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蔚携,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡同木,警方通過查閱死者的電腦和手機(jī)浮梢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來彤路,“玉大人秕硝,你說我怎么就攤上這事≈拮穑” “怎么了远豺?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)坞嘀。 經(jīng)常有香客問我躯护,道長(zhǎng),這世上最難降的妖魔是什么丽涩? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任棺滞,我火速辦了婚禮裁蚁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘继准。我一直安慰自己枉证,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布移必。 她就那樣靜靜地躺著室谚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪崔泵。 梳的紋絲不亂的頭發(fā)上秒赤,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音憎瘸,去河邊找鬼入篮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛含思,可吹牛的內(nèi)容都是我干的崎弃。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼含潘,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼饲做!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起遏弱,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤盆均,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后漱逸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泪姨,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年饰抒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肮砾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡袋坑,死狀恐怖仗处,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情枣宫,我是刑警寧澤婆誓,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站也颤,受9級(jí)特大地震影響洋幻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜翅娶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一文留、第九天 我趴在偏房一處隱蔽的房頂上張望好唯。 院中可真熱鬧,春花似錦厂庇、人聲如沸渠啊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至贯溅,卻和暖如春拄氯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背它浅。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工译柏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人姐霍。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓鄙麦,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親镊折。 傳聞我的和親對(duì)象是個(gè)殘疾皇子胯府,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354