本系列筆記涉及到的代碼在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臭猜、下載安裝:
- 入口網(wǎng)站:https://nacos.io/zh-cn/index.html
- 下載地址(本次下載1.1.4的linux版):https://github.com/alibaba/nacos/tags
- 安裝運(yùn)行:前提要有maven和jdk1.8及以上的環(huán)境躺酒。下載完解壓,然后直接進(jìn)入bin目錄下執(zhí)行以下命令啟動(dòng)單機(jī)版nacos:
bash startup.sh -m standalone
-
測(cè)試:訪問 ip:8848/nacos蔑歌,看到如下畫面就啟動(dòng)成功了羹应,默認(rèn)賬號(hào)密碼都是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)。
為了等下演示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配置管理的界面:
可以看到有一個(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
來配置掐隐。目前只支持properties
和yaml
類型。 - 通過 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)系:
- 命名空間:有一個(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默認(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)日志增加端口打印炬称,如下圖,上面是修改前涡拘,下面是修改后:
這樣就改完了玲躯。
- 修改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
,登錄后可以看到如下效果:
可能遇到的坑:
- 異常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。
相比豪豬哥漾岳,簡(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中就有了摇锋。
然后訪問幾次8401,實(shí)時(shí)監(jiān)控中就會(huì)有相關(guān)信息了站超,如下圖:
可能遇到的坑:不管怎么訪問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的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)鏈路那里添加流控即可忽洛,比如我添加的如下:
這里設(shè)置的意思就是腻惠,訪問testB,一秒鐘超過一次欲虚,就是直接快速報(bào)錯(cuò)集灌。我現(xiàn)在對(duì)testB連點(diǎn)兩下,就會(huì)返回如下信息:
- 存在的問題:超過QPS閾值的時(shí)候苍在,返回的是默認(rèn)信息
Blocked by Sentinel (flow limiting)
绝页,如何自定義呢?應(yīng)該有hystrix一樣的兜底方法(后續(xù)再說其用法)寂恬。
線程數(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):
配置如下:
這里的意思就是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簇點(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次吧。
- 排隊(duì)等待:就是不管同時(shí)有多少個(gè)請(qǐng)求過來仑扑,我每秒鐘只處理閾值數(shù)的請(qǐng)求览爵,其他老老實(shí)實(shí)排隊(duì)等待去。如下圖配置意思就是每秒鐘只處理一個(gè)镇饮,其他的排隊(duì)等著蜓竹,每隔1000毫秒才放下一個(gè)請(qǐng)求進(jìn)來。