Springclound常用五大組件及其使用原理

注冊中心Eureka

  • Eureka-Server:就是服務注冊中心(可以是一個集群),對外暴露自己的地址。

  • 提供者:啟動后向Eureka注冊自己信息(地址,服務名稱等),并且定期進行服務續約

  • 消費者:服務調用方,在使用的時候去拉取一次,之后會定期去Eureka拉取服務列表,然后使用負載均衡算法選出一個服務進行調用。

  • 心跳(續約):提供者和消費者定期通過http方式向Eureka刷新獲取(默認30秒)

?如果消費者之前已經調用過注冊中心獲取過提供者的地址信息,那么注冊中心宕機后,在提供者地址不變的前提下,不影響服務直接調用

引入SpringCloud為eureka提供的starter依賴:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

?編寫一個啟動類

給eureka-server服務編寫一個啟動類,一定要添加一個@EnableEurekaServer注解,開啟eureka的注冊中心功能:

@SpringBootApplication
@EnableEurekaServer  //開啟eureka的注冊中心功能
public class EurekaApplication {public static void main(String[] args) {SpringApplication.run(EurekaApplication.class, args);}
}

編寫一個application.yml文件,內容如下:

server:port: 10086
spring:application:name: eureka-server
eureka:client:service-url: defaultZone: http://127.0.0.1:10086/eurekaregister-with-eureka: false # 自己不注冊到eureka中fetch-registry: false #自己不從eureka中拉取別的服務

啟動微服務,然后在瀏覽器訪問:http://127.0.0.1:10086

?將微服務注冊到注冊中心->引入依賴->編寫配置文件,名字要指定

spring:application:name: userservice
eureka:client:service-url:defaultZone: http://127.0.0.1:10086/eureka

Ribbon負載均衡

@SpringBootApplication
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}//注冊RestTemplate,第三方的類,交給IOC容器管理@Bean@LoadBalanced//自動負載均衡public RestTemplate restTemplate() {return new RestTemplate();}
}

@LoadBalanced?

在遠程調用的RestTemplate,上添加了@LoadBalanced注解,即可實現負載均衡功能

原理:SpringCloud底層其實是利用了一個名為Ribbon的組件,來實現負載均衡功能的。

?SpringCloudRibbon的底層采用了一個攔截器,攔截了RestTemplate發出的請求,對地址做了修改。用一幅圖來總結一下:

基本流程如下:

  • 攔截我們的RestTemplate請求http://userservice/user/1

  • RibbonLoadBalancerClient會從請求url中獲取服務名稱,也就是user-service

  • DynamicServerListLoadBalancer根據user-service到eureka拉取服務列表

  • eureka返回列表,localhost:8081、localhost:8082

  • IRule利用內置負載均衡規則,從列表中選擇一個,例如localhost:8081

  • RibbonLoadBalancerClient修改請求地址,用localhost:8081替代userservice,得到http://localhost:8081/user/1,發起真實請求

Hystrix 熔斷器

雪崩問題

微服務中,服務間調用關系錯綜復雜,一個請求,可能需要調用多個微服務接口才能實現,會形成非常復雜的調用鏈路:Hystix解決雪崩問題的手段主要是服務降級和線程隔離;

服務降級的演示

第一步:導依賴

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency>

第二步:在引導類上開啟Hystrix ?


@EnableCircuitBreaker//開啟斷路器
@SpringBootApplication
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}//注冊RestTemplate,第三方的類,交給IOC容器管理@Bean@LoadBalanced//自動負載均衡public RestTemplate restTemplate() {return new RestTemplate();}}

第三步:開發一個方法作為降級的處理方式要求:方法的參數和返回結果類型要和原方法findById應該一致

public String queryOrderByIdFallback(Long orderId) {return "服務器太忙,請稍后重試........";
}

?第四步:修改原有的方法,在方法上添加注解

?全局降級

?上面的寫法中每個方法都需要一個降級方法,很麻煩,我們可以使用一個全局的降級方案

@Service
@DefaultProperties(defaultFallback="allMethodFallBack")
//在類上添加一個注解  @DefaultProperties(defaultFallback="allMethodFallBack")
public class OrderService {@HystrixCommand//指向降級方法public String queryOrderById() {    return "我出錯了";}//    全局降級方法public String allMethodFallBack() {return "服務器太太太太太太太忙,請稍后重試.....";}
}

?超時設置

Hystix的默認超時時長為1秒,如果這個微服務響應時間超過1秒,就會報錯,降級處理,但是有的方法本身需要執行的時間就長,自定義超時時間

hystrix:command:default:execution:isolation:thread:timeoutInMilliseconds: 3000 # 超時時間3秒

熔斷原理

熔斷功能:默認5秒內發起20次請求,失敗率超過50% 進入熔斷狀態 5秒內的其他時間都會直接進入降級方法

熔斷器有3種狀態:open close half-open

狀態機有3個狀態:

  • Closed:關閉狀態(斷路器關閉),所有請求都正常訪問。

  • Open:打開狀態(斷路器打開),所有請求都會被降級。Hystix會對請求情況計數,當一定時間內失敗請求百分比達到閾值,則觸發熔斷,斷路器會完全關閉。默認失敗比例的閾值是50%,請求次數最少不低于20次。

  • Half Open:半開狀態,open狀態不是永久的,打開后會進入休眠時間(默認是5S)。隨后斷路器會自動進入半開狀態。此時會釋放1次請求通過,若這個請求是健康的,則會關閉斷路器,否則繼續保持打開,再次進行5秒休眠計時。

?Feign:封裝了RestTemple 遠程調用

導入依賴

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

創建interface接口


@FeignClient("userservice")
public interface UserClient {@GetMapping("/user/{id}")  //這里的返回結果和 url地址一定要和提供方保持一致User findById(@PathVariable("id") Long id);
}
  • 首先這是一個接口,Feign會通過動態代理,幫我們生成實現類。這點跟mybatis的mapper很像

  • @FeignClient,聲明這是一個Feign客戶端,同時通過value屬性指定服務名稱

  • 接口中的定義方法,完全采用SpringMVC的注解,Feign會根據注解幫我們生成URL,并訪問獲取結果

開啟Feign功能

@EnableFeignClients//開啟Feign
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}}

負載均衡

Feign中本身已經集成了Ribbon依賴和自動配置:

Feign默認也有對Hystix的集成:

feign:hystrix:enabled: true # 開啟Feign的熔斷功能
  • 首先,我們要定義一個類,是在剛才編寫的UserFeignClient,作為fallback的處理類
import cn.itcast.order.pojo.User;
import org.springframework.stereotype.Component;@Component
public class UserClientFallback implements UserFeignClient {@Overridepublic User findById(Long id) {User user = new User();user.setId(0L);user.setUsername("用戶查詢出現異常!");return user;}
}
  • 然后在UserFeignClient中,指定剛才編寫的實現類,就實現了降級方法
@FeignClient(value = "userservice", fallback = UserClientFallback.class)
public interface UserFeignClient {@GetMapping("/user/{id}")User findById(@PathVariable("id") Long id);
}

Gateway網關

網關的核心功能是:路由和過濾(鑒權)

  • ?搭建網關
<dependencies><!--引入gateway 網關--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>
</dependencies>
  • 編寫啟動類
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class ApiGatewayApplication {public static void main(String[] args) {SpringApplication.run(ApiGatewayApplication.class,args);}}
  • 編寫配置
server:port: 10010
spring:application:name: api-gatewaycloud:# 網關配置gateway:# 路由配置:轉發規則routes: #集合。# id: 唯一標識。默認是一個UUID# uri: 轉發路徑# predicates: 條件,用于請求網關路徑的匹配規則- id: userserviceuri: http://localhost:8081/predicates:- Path=/user/**

application.yml 中的uri是寫死的,就是Gateway-靜態路由

Gateway-動態路由

<dependency><--添加注冊中心Eureka--> <groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

?修改配置文件

server:port: 10010
spring:application:name: api-gatewaycloud:# 網關配置gateway:# 路由配置:轉發規則routes: #集合。# id: 唯一標識。默認是一個UUID# uri: 轉發路徑# predicates: 條件,用于請求網關路徑的匹配規則- id: user-serviceuri: lb://userservice # lb負載均衡predicates:- Path=/user/**eureka:client:service-url:defaultZone: http://127.0.0.1:10086/eureka

Gateway-過濾器

GatewayFilter:局部過濾器,針對單個路由 GlobalFilter :全局過濾器,針對所有路由

全局過濾器

  • GlobalFilter 全局過濾器,不需要在配置文件中配置,系統初始化時加載,并作用在每個路由上。

  • Spring Cloud Gateway 核心的功能也是通過內置的全局過濾器來完成。

  • 自定義全局過濾器步驟:

    1. 定義類實現 GlobalFilter 和 Ordered接口

    2. 復寫方法

    3. 完成邏輯處理

/*** 自定義全局過濾器*/
@Component
public class MyGlobalFilter implements GlobalFilter, Ordered {//需求 :請求參數中帶有token 內容,就放行,否則提示未授權@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//        獲取請求對象ServerHttpRequest request = exchange.getRequest();
//        獲取參數MultiValueMap<String, String> valueMap = request.getQueryParams();List<String> valList = valueMap.get("token");if(CollectionUtils.isEmpty(valList)){//異常情況,沒有token參數// 獲取響應對象ServerHttpResponse response = exchange.getResponse();// 返回響應碼response.setStatusCode(HttpStatus.FORBIDDEN);//401// 完成響應return response.setComplete();}return chain.filter(exchange);//放行}@Overridepublic int getOrder() {return 0;}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/79525.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/79525.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/79525.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Docker —— 隔離的基本操作(2)

Docker —— 隔離的基本操作&#xff08;2&#xff09; unshareunshare 命令詳解基本語法常用選項常用示例實際應用場景注意事項與 Docker 的關系1. 執行命令2. 修改主機名3. 退出命名空間4. 驗證宿主機主機名關鍵原理類比 Docker 容器總結 實戰操作一&#xff08;PID 隔離&…

Java List分頁工具

PageUtil.java import com.google.common.collect.Lists; import com.jd.platform.hotkey.dashboard.common.domain.Page; import org.springframework.util.CollectionUtils;import java.util.ArrayList; import java.util.List;public class PageUtil {/*** 通用分頁工具類*…

中陽策略:如何從K線行為中提取交易邏輯信號?

中陽策略&#xff1a;如何從K線行為中提取交易邏輯信號&#xff1f; 在量化趨勢研究中&#xff0c;中陽形態常被視作市場動能變化的重要標志。它不僅代表價格的強勢上行&#xff0c;更隱含著主力資金換手與情緒轉換的信號。將“中陽”這一結構元素抽象為模型中的“強動能突破”…

Java SE(8)——繼承

1.繼承的概念&作用 在Java中&#xff0c;繼承是面向對象編程的三大基本特性之一&#xff08;還有封裝和多態&#xff09;&#xff0c;允許一個類&#xff08;子類/繼承類&#xff09;繼承另一個類&#xff08;父類/基類&#xff09;的屬性和方法 繼承的核心目的是&#xf…

Python爬蟲(18)反爬攻防戰:動態IP池構建與代理IP實戰指南(突破95%反爬封禁率)

目錄 引言一、背景&#xff1a;為什么代理IP是爬蟲的“第二生命”&#xff1f;1.1 反爬系統的IP檢測三把刀1.2 代理IP的核心價值 二、基礎實戰&#xff1a;快速搭建代理IP系統2.1 免費代理IP的獲取與篩選2.2 代理IP的智能容錯機制 三、高階攻防&#xff1a;突破企業級反爬封鎖3…

LFU算法解析

文章目錄 LFU緩存中關鍵變量的訪問與更新機制1. min_freq - 最小頻率訪問時機更新時機更新示例 2. capacity - 緩存容量訪問時機更新時機訪問示例 3. key_to_node - 鍵到節點的映射訪問時機更新時機更新示例 4. freq_to_dummy - 頻率到鏈表啞節點的映射訪問時機更新時機更新示例…

ByteArrayInputStream 類詳解

ByteArrayInputStream 類詳解 ByteArrayInputStream 是 Java 中用于從字節數組讀取數據的輸入流&#xff0c;位于 java.io 包。它允許將內存中的字節數組當作輸入流來讀取&#xff0c;是處理內存數據的常用工具。 1. 核心特性 內存數據源&#xff1a;從字節數組&#xff08;b…

rvalue引用()

一、先確定基礎:左值(Lvalue)和右值(Rvalue) 理解Rvalue引用,首先得搞清楚左值和右值的概念。 左值(Lvalue):有明確內存地址的表達式,可以取地址。比如變量名、引用等。 復制代碼 int a = 10; // a是左值 int& ref = a; // ref也是左值右值(Rval…

吳恩達深度學習作業 RNN模型——字母級語言模型

一. 簡單復習一下RNN RNN RNN適用于處理序列數據&#xff0c;令是序列的第i個元素&#xff0c;那么就是一個長度為的序列&#xff0c;NLP中最常見的元素是單詞&#xff0c;對應的序列是句子。 RNN使用同一個神經網絡處理序列中的每一個元素。同時&#xff0c;為了表示序列的…

基于python的哈希查表搜索特定文件

Python有hashlib庫&#xff0c;支持多種哈希算法&#xff0c;比如MD5、SHA1、SHA256等。通常SHA256比較安全&#xff0c;但MD5更快&#xff0c;但可能存在碰撞風險&#xff0c;得根據自己需求決定。下面以SHA256做例。 import hashlib import os from typing import Dict, Lis…

idea創建springboot項目無法創建jdk8原因及多種解決方案

idea創建springboot項目無法創建jdk8原因及多種解決方案 提示&#xff1a;幫幫志會陸續更新非常多的IT技術知識&#xff0c;希望分享的內容對您有用。本章分享的是springboot的使用。前后每一小節的內容是存在的有&#xff1a;學習and理解的關聯性。【幫幫志系列文章】&#x…

【C++進階十】多態深度剖析

【C進階十】多態深度剖析 1.多態的概念及條件2.虛函數的重寫3.重寫、重定義、重載區別4.C11新增的override 和final5.抽象類6.虛表指針和虛表6.1什么是虛表指針6.2指向誰調用誰&#xff0c;傳父類調用父類&#xff0c;傳子類調用子類 7.多態的原理8.單繼承的虛表狀態9.多繼承的…

面向網絡安全的開源 大模型-Foundation-Sec-8B

1. Foundation-Sec-8B 整體介紹 Foundation-Sec-8B 是一個專注于網絡安全領域的大型語言模型 (LLM),由思科的基礎人工智能團隊 (Foundation AI) 開發 。它基于 Llama 3.1-8B 架構構建,并通過在一個精心策劃和整理的網絡安全專業語料庫上進行持續預訓練而得到增強 。該模型旨在…

Python爬蟲的基礎用法

Python爬蟲的基礎用法 python爬蟲一般通過第三方庫進行完成 導入第三方庫&#xff08;如import requests &#xff09; requests用于處理http協議請求的第三方庫,用python解釋器中查看是否有這個庫&#xff0c;沒有點擊安裝獲取網站url&#xff08;url一定要解析正確&#xf…

WHAT - Tailwind CSS + Antd = MetisUI組件庫

文章目錄 Tailwind 和 Antd 組件庫MetisUI 組件庫 Tailwind 和 Antd 組件庫 在 WHAT - Tailwind 樣式方案&#xff08;不寫任何自定義樣式&#xff09; 中我們介紹了 Tailwind&#xff0c;至于 Antd 組件庫&#xff0c;我們應該都耳熟能詳&#xff0c;官網地址&#xff1a;htt…

Day 4:牛客周賽Round 91

好久沒寫了&#xff0c;問題還蠻多的。聽說這次是苯環哥哥出題 F題 小苯的因子查詢 思路 考慮求因子個數&#xff0c;用質因數分解&#xff1b;奇數因子只需要去掉質數為2的情況&#xff0c;用除法。 這里有個比較妙的細節是&#xff0c;提前處理出數字x的最小質因數&#xff0…

使用直覺理解不等式

問題是這個&#xff1a; 題目 探究 ∣ max ? b { q 1 ( z , b ) } ? max ? b { q 2 ( z , b ) } ∣ ≤ max ? b ∣ q 1 ( z , b ) ? q 2 ( z , b ) ∣ |\max_b\{q_1(z,b)\}-\max_b\{q_2(z,b)\}|\le\max_b|q_1(z,b)-q_2(z,b)| ∣maxb?{q1?(z,b)}?maxb?{q2?(z,b)}∣≤…

惡心的win11更新DIY 設置win11更新為100年

?打開注冊表編輯器?&#xff1a;按下Win R鍵&#xff0c;輸入regedit&#xff0c;然后按回車打開注冊表編輯器。?12?導航到指定路徑?&#xff1a;在注冊表編輯器中&#xff0c;依次展開HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings?新建DWORD值?&…

嵌入式驅動學習

時鐘 定義 周期型的0、1信號 時鐘信號由“心臟”時鐘源產生&#xff0c;通過“動脈”時鐘樹傳播到整個芯片中。 SYSCLK系統時鐘&#xff0c;由HSI、HSE、PLLCLK三選一。 HCLK是AHB總線時鐘&#xff0c; PCLK是APB總線時鐘。 使用某個外設&#xff0c;必須要先使能該外設時鐘系統…

Java:從入門到精通,你的編程之旅

Java&#xff0c;一門歷久彌新的編程語言&#xff0c;自誕生以來就以其跨平臺性、面向對象、穩定性和安全性等特性&#xff0c;在企業級應用開發領域占據著舉足輕重的地位。無論你是初學者還是經驗豐富的開發者&#xff0c;Java 都能為你提供強大的工具和廣闊的舞臺。 為什么選…