什麼是Spring-Cloud、需要掌握哪些知識點,中高級工程師Java開發

熬夜布禿頭啊 2021-09-20 01:57:44 阅读数:180

spring-cloud spring cloud 需要 掌握
 return 0;
}
// 什麼時候該進行過濾
// 這裏我們可以進行一些判斷,這樣我們就可以過濾掉一些不符合規定的請求等等
@Override
public boolean shouldFilter() {
return true;
}
// 如果過濾器允許通過則怎麼進行處理
@Override
public Object run() throws ZuulException {
// 這裏我設置了全局的RequestContext並記錄了請求開始時間
RequestContext ctx = RequestContext.getCurrentContext();
ctx.set("startTime", System.currentTimeMillis());
return null;
}

}

```java
// lombok的日志
@Slf4j
// 加入 Spring 容器
@Component
public class AccessLogFilter extends ZuulFilter {
// 指定該過濾器的過濾類型
// 此時是後置過濾器
@Override
public String filterType() {
return FilterConstants.POST_TYPE;
}
// SEND_RESPONSE_FILTER_ORDER 是最後一個過濾器
// 我們此過濾器在它之前執行
@Override
public int filterOrder() {
return FilterConstants.SEND_RESPONSE_FILTER_ORDER - 1;
}
@Override
public boolean shouldFilter() {
return true;
}
// 過濾時執行的策略
@Override
public Object run() throws ZuulException {
RequestContext context = RequestContext.getCurrentContext();
HttpServletRequest request = context.getRequest();
// 從RequestContext獲取原先的開始時間 並通過它計算整個時間間隔
Long startTime = (Long) context.get("startTime");
// 這裏我可以獲取HttpServletRequest來獲取URI並且打印出來
String uri = request.getRequestURI();
long duration = System.currentTimeMillis() - startTime;
log.info("uri: " + uri + ", duration: " + duration / 100 + "ms");
return null;
}
}

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.

上面就簡單實現了請求時間日志打印功能,你有沒有感受到 Zuul 過濾功能的强大了呢?

沒有?好的、那我們再來。

2)令牌桶限流

當然不僅僅是令牌桶限流方式, Zuul 只要是限流的活它都能幹,這裏我只是簡單舉個栗子。
什麼是Spring-Cloud、需要掌握哪些知識點,中高級工程師Java開發_Java
我先來解釋一下什麼是 令牌桶限流 吧。

首先我們會有個桶,如果裏面沒有滿那麼就會以一定 固定的速率 會往裏面放令牌,一個請求過來首先要從桶中獲取令牌,如果沒有獲取到,那麼這個請求就拒絕,如果獲取到那麼就放行。

下面我們就通過 Zuul 的前置過濾器來實現一下令牌桶限流。

package com.lgq.zuul.filter;
import com.google.common.util.concurrent.RateLimiter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class RouteFilter extends ZuulFilter {
// 定義一個令牌桶,每秒產生2個令牌,即每秒最多處理2個請求 
private static final RateLimiter RATE_LIMITER = RateLimiter.create(2);
@Override
public String filterType() {
return FilterConstants.PRE_TYPE;
}
@Override
public int filterOrder() {
return -5;
}
@Override
public Object run() throws ZuulException {
log.info("放行");
return null;
}
@Override
public boolean shouldFilter() {
RequestContext context = RequestContext.getCurrentContext();
if(!RATE_LIMITER.tryAcquire()) {
log.warn("訪問量超載");
// 指定當前請求未通過過濾 
context.setSendZuulResponse(false);
// 向客戶端返回響應碼429,請求數量過多 
context.setResponseStatusCode(429);
return false;
}
return true;
}
}

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.

這樣我們就能將請求數量控制在一秒兩個,有沒有覺得很酷?

3.關於 Zuul 的其他

Zuul 的過濾器的功能肯定不止上面我所實現的兩種,它還可以實現 權限校驗,包括我上面提到的 灰度發布 等等。

當然, Zuul 作為網關肯定也存在 單點問題 ,如果我們要保證 Zuul 的高可用,我們就需要進行 Zuul 的集群配置,這個時候可以借助額外的一些負載均衡器比如 Nginx

##Spring Cloud配置管理——Config

4.為什麼要使用進行配置管理?

當我們的微服務系統開始慢慢地龐大起來,那麼多 ConsumerProviderEureka ServerZuul 系統都會持有自己的配置,這個時候我們在項目運行的時候可能需要更改某些應用的配置,如果我們不進行配置的統一管理,我們只能去每個應用下一個一個尋找配置文件然後修改配置文件再重啟應用。

首先對於分布式系統而言我們就不應該去每個應用下去分別修改配置文件,再者對於重啟應用來說,服務無法訪問所以直接拋弃了可用性,這是我們更不願見到的。

那麼有沒有一種方法既能對配置文件統一地進行管理,又能在項目運行時動態修改配置文件呢?

那就是我今天所要介紹的 Spring Cloud Config

能進行配置管理的框架不止 Spring Cloud Config 一種,大家可以根據需求自己選擇( disconf ,阿波羅等等)。而且對於 Config 來說有些地方實現的不是那麼盡人意。

5.Config 是什麼

Spring Cloud Config 為分布式系統中的外部化配置提供服務器和客戶端支持。使用 Config服務器,可以在中心比特置管理所有環境中應用程序的外部屬性。

簡單來說, Spring Cloud Config 就是能將各個 應用/系統/模塊 的配置文件存放到 統一的地方然後進行管理(Git 或者 SVN)。

你想一下,我們的應用是不是只有啟動的時候才會進行配置文件的加載,那麼我們的 Spring Cloud Config 就暴露出一個接口給啟動應用來獲取它所想要的配置文件,應用獲取到配置文件然後再進行它的初始化工作。就如下圖。
什麼是Spring-Cloud、需要掌握哪些知識點,中高級工程師Java開發_後端_02
當然這裏你肯定還會有一個疑問,如果我在應用運行時去更改遠程配置倉庫(Git)中的對應配置文件,那麼依賴於這個配置文件的已啟動的應用會不會進行其相應配置的更改呢?

答案是不會的。

什麼?那怎麼進行動態修改配置文件呢?這不是出現了 配置漂移 嗎?你個渣男,你又騙我!

別急嘛,你可以使用 Webhooks ,這是 github 提供的功能,它能確保遠程庫的配置文件更新後客戶端中的配置信息也得到更新。

噢噢,這還差不多。我去查查怎麼用。

慢著,聽我說完, Webhooks 雖然能解决,但是你了解一下會發現它根本不適合用於生產環境,所以基本不會使用它的。

而一般我們會使用 Bus 消息總線 + Spring Cloud Config 進行配置的動態刷新。

三、引出 Spring Cloud Bus

用於將服務和服務實例與分布式消息系統鏈接在一起的事件總線。在集群中傳播狀態更改很有用(例如配置更改事件)。

你可以簡單理解為 Spring Cloud Bus 的作用就是管理和廣播分布式系統中的消息,也就是消息引擎系統中的廣播模式。當然作為 消息總線Spring Cloud Bus 可以做很多事而不僅僅是客戶端的配置刷新功能。

而擁有了 Spring Cloud Bus 之後,我們只需要創建一個簡單的請求,並且加上 @ResfreshScope 注解就能進行配置的動態修改了,下面我畫了張圖供你理解。
什麼是Spring-Cloud、需要掌握哪些知識點,中高級工程師Java開發_程序員_03

四、總結

這兩篇文章中我帶大家初步了解了 Spring Cloud 的各個組件,他們有

  • Eureka 服務發現框架
  • Ribbon 進程內負載均衡器

最後

面試是跳槽漲薪最直接有效的方式,馬上金九銀十來了,各比特做好面試造飛機,工作擰螺絲的准備了嗎?

掌握了這些知識點,面試時在候選人中又可以奪目不少,暴擊9999點。機會都是留給有准備的人,只有充足的准備,才可能讓自己可以在候選人中脫穎而出。

 CodeChina開源項目:【一線大廠Java面試題解析+核心總結學習筆記+最新講解視頻】

什麼是Spring-Cloud、需要掌握哪些知識點,中高級工程師Java開發_程序員_04

什麼是Spring-Cloud、需要掌握哪些知識點,中高級工程師Java開發_程序員_05

版权声明:本文为[熬夜布禿頭啊]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/09/20210920015744010u.html