国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁 > news >正文

阿里云怎么做網(wǎng)站滄浪seo網(wǎng)站優(yōu)化軟件

阿里云怎么做網(wǎng)站,滄浪seo網(wǎng)站優(yōu)化軟件,建立網(wǎng)站的基本條件,湘潭做網(wǎng)站公司選擇封象網(wǎng)做網(wǎng)站公司目錄 一、Feign 簡介 1、RestTemplate 遠(yuǎn)程調(diào)用中存在的問題 2、定義和使用 Feign 客戶端 3、Feign 自定義配置 4、Feign 性能優(yōu)化 5、Feign 最佳實(shí)踐 6、Feign 使用問題匯總 二、Gateway 網(wǎng)關(guān)簡介 1、搭建網(wǎng)關(guān)服務(wù) 2、路由斷言工廠 3、路由的過濾器配置 4、全局過…

目錄

一、Feign 簡介

1、RestTemplate 遠(yuǎn)程調(diào)用中存在的問題

2、定義和使用 Feign 客戶端

3、Feign 自定義配置

4、Feign 性能優(yōu)化

5、Feign 最佳實(shí)踐

6、Feign 使用問題匯總

二、Gateway 網(wǎng)關(guān)簡介

1、搭建網(wǎng)關(guān)服務(wù)

2、路由斷言工廠

3、路由的過濾器配置

4、全局過濾器

5、過濾器鏈執(zhí)行順序

6、網(wǎng)關(guān)的 cors 跨域配置

7、Gateway 網(wǎng)關(guān)使用問題匯總


一、Feign 簡介

Feign?是 Netflix 開發(fā)的聲明式、模板化的 Http 客戶端,Feign 可以幫助我們更快捷、優(yōu)雅地調(diào)用Http API。

  • Feign 是在 Ribbon 的基礎(chǔ)上進(jìn)行了一次改進(jìn),是一個(gè)使用起來更加方便的 HTTP 客戶端。
  • SpringCloud 對 Feign 進(jìn)行了增強(qiáng),使 Feign 支持了 Spring?MVC 注解,并整合了 Ribbon 和 Eureka,集成了服務(wù)發(fā)現(xiàn)和負(fù)載均衡,從而讓 Feign 的使用更加方便。

1、RestTemplate 遠(yuǎn)程調(diào)用中存在的問題

該遠(yuǎn)程調(diào)用的代碼有以下問題:

  • 代碼可讀性差,編程體驗(yàn)不統(tǒng)一;
  • 參數(shù)復(fù)雜,URL 難以維護(hù);

2、定義和使用 Feign 客戶端

在 SpringCloud 中,使用 Feign 非常簡單,創(chuàng)建一個(gè) Interface,并在接口上添加一些注解,代碼就完成了。?

(1)引入依賴

  • 給需要遠(yuǎn)程調(diào)用的模塊,引入 openfeign 起步依賴;

(2)添加 @EnableFeignClients 注解

  • 給需要遠(yuǎn)程調(diào)用的啟動(dòng)類,添加 @EnableFeignClients 注解;

(3)編寫 Feign 客戶端

  • 添加 @FeignClient 和 @GetMapping 注解;?

上述注解聲明了如下信息:

  • 服務(wù)名稱:user-service;
  • 請求方式:get;
  • 請求路徑:/user/{userId};
  • 請求參數(shù):String userId;
  • 返回值類型:User;

(4)OrderService 遠(yuǎn)程調(diào)用過程

該遠(yuǎn)程調(diào)用過程,就好像平常處理請求的逆過程:

  • OrderService 將 userId 傳遞給接口中的方法;
  • queryUserById 方法再將參數(shù)賦值給請求路徑中的占位符 {userId};
  • 然后再通過 get 請求向 UserController 發(fā)送請求;
  • 最終獲得 User 對象信息;

3、Feign 自定義配置

Spring 雖然幫我們做好了配置,但是也允許我們修改默認(rèn)配置。

配置 Feign 日志有 2 種方式:

(1)application/bootstrap 配置文件方式

  • 注意:logging.level 屬性值需要改為 trace;?

(2)Java 代碼方式

4、Feign 性能優(yōu)化

Feign 底層客戶端實(shí)現(xiàn):

  • URLConnection:默認(rèn)使用,java 原生 jdk,性能較差,不支持連接池;
  • Apache HttpClient:支持連接池;(推薦)
  • OKHttp:支持連接池;(推薦)

對 Feign 的性能優(yōu)化,最重要的一點(diǎn)就是對底層實(shí)現(xiàn)的改變。

因此優(yōu)化 Feign 的性能主要包括:

  • 使用連接池代替默認(rèn)的 URLConnection;
  • 日志級別,最好用 basic 或 none;(因?yàn)殚_啟日志也需要占用較多資源)

下面以 HttpClient 為例子,說明性能優(yōu)化的步驟:

(1)引入依賴

  • httpClient 已經(jīng)被 Spring 管理好版本了,不需要指定版本;

(2)修改 application 配置文件

  • 將 feign.httpclient.enabled 的屬性值改為 true,表明底層使用 httpclient;

5、Feign 最佳實(shí)踐

最佳實(shí)踐是指,企業(yè)開發(fā)過程中,總結(jié)設(shè)計(jì)缺點(diǎn),得出的一種相對比較好的使用方式。

通常會用到 2 種方式,各有利弊,按自己的需求使用:

  • 繼承:給消費(fèi)者的 FeignClient 和提供者的 controller 定義統(tǒng)一的父接口,然后實(shí)現(xiàn)接口;
  • 比如 order 模塊要調(diào)用 user 模塊的服務(wù),就定義 UserClient 接口,繼承 UserAPI;
  • 缺點(diǎn):耦合度高;
  • 優(yōu)點(diǎn):遵從了契約;

  • 抽取:將 FeignClient 抽取為獨(dú)立模塊,并且把接口有關(guān)的 POJO、默認(rèn)的 Feign 配置都放到這個(gè)模塊中,提供給所有消費(fèi)者使用;
  • 缺點(diǎn):消費(fèi)者可能會引入很多用不到的 api;
  • 優(yōu)點(diǎn):耦合度低,層次分明;

我個(gè)人更喜歡第二種抽取的方式,下面使用這種方式做一個(gè)例子。

(1)創(chuàng)建 feign-api 模塊

  • 在 feign-api 模塊中引入 feign 的起步依賴;

  • 將消費(fèi)者模塊中對提供者模塊所需的 Client、Pojo,以及 Config 類都移動(dòng)到 feign-api 中;

(2)引入 feign-api 模塊

  • 在消費(fèi)者 order-service 模塊中,引入 feign-api 模塊;

(3)消除報(bào)錯(cuò)

  • 將 order-service 模塊內(nèi)原來依賴 pojo、config、client 的類,修改為 feign-api 模塊內(nèi)的類;

  • 由于 order-service 模塊的 application 啟動(dòng)類無法掃描到 feign-api 模塊下的 Client 的 Bean 對象,因此會出現(xiàn)如下報(bào)錯(cuò):

  • 需要在 @EnableFeignClients 中加入 clients 屬性;

6、Feign 使用問題匯總

(1)Did you forget to include spring-cloud-starter-loadbalancer?

出錯(cuò)原因:?

  • SpringCloud Feign 在 Hoxton.M2 RELEASED 版本之后不再使用?Ribbon,而是使用 spring-cloud-loadbalancer,所以在不引入 spring-cloud-loadbalancer 的情況下會報(bào)錯(cuò)。

參考了很多解決方法,主要是要區(qū)別版本問題:

包含 RELEASE 關(guān)鍵字的版本中,只有下面這樣操作才能使用:

  • 首先排除 ribbon 的起步依賴,排除位置在消費(fèi)者依賴的服務(wù)提供者的 dependency;
  • 添加 loadBalancer 依賴;

而在 2021 及更新版本中(也就是沒有 RELEASE 關(guān)鍵字的版本),只需要如下操作:

  • 引入 loadBalancer 依賴;
  • 不需要排除?ribbon 的起步依賴;

二、Gateway 網(wǎng)關(guān)簡介

為什么需要網(wǎng)關(guān)?

  • 如果沒有網(wǎng)關(guān),那么所有人都可以訪問我們所有的服務(wù),但是有很多服務(wù)其實(shí)是不能對外公開的。
  • 需要使用網(wǎng)關(guān)進(jìn)行身份驗(yàn)證,通過后才能訪問敏感服務(wù)。
  • 一切請求需要先通過網(wǎng)關(guān),才能到微服務(wù)。

因此,網(wǎng)關(guān)有如下功能:

  • 身份認(rèn)證和權(quán)限校驗(yàn);
  • 服務(wù)路由、負(fù)載均衡;(也就是能知道將請求送到哪個(gè)微服務(wù))
  • 限制請求流量;

SpringCloud 提供了 2 個(gè)組件實(shí)現(xiàn)網(wǎng)關(guān)功能:

  • gateway;(新版本)
  • zuul;(早期版本)

Zuul 是基于 Servlet 的實(shí)現(xiàn),屬于阻塞式編程。

而 SpringCloudGateway 則是基于 Spring5 中提供的 WebFlux,屬于響應(yīng)式編程的實(shí)現(xiàn),具備更好的性能。

1、搭建網(wǎng)關(guān)服務(wù)

(1)創(chuàng)建 gateway 模塊

  • 創(chuàng)建一個(gè)新的模塊專門用于網(wǎng)關(guān):gateway-module,需要 SpringBoot 啟動(dòng)類;
  • 引入 SpringCloudGateway 起步依賴;
  • 引入 Nacos 服務(wù)發(fā)現(xiàn)依賴;

(2)編寫路由配置以及 Nacos 地址

  • gateway 中的 routes 屬性之前的配置,目的是為了讓 gateway 將服務(wù)注冊到 nacos;
  • gateway 中的 routes 屬性之后的配置,指明了可以使用的 service 路由;
  • id:表示這個(gè)路由的名字,與其他屬性無關(guān);
  • uri:表示路由目標(biāo)地址,其中 lb 表示負(fù)載均衡,后面跟著服務(wù)的 name;
  • predicates:指定路由規(guī)則,符合規(guī)則就可以放行;

(3)測試網(wǎng)關(guān)功能

  • 啟動(dòng) gateway 的 application;
  • 發(fā)起請求:localhost:10010/order/queryOrderById/1;
  • 這個(gè)請求中,order-service 模塊會調(diào)用 user-service 的服務(wù);

  • 訪問失敗,說明我們的網(wǎng)關(guān)起作用了,因?yàn)槲覀儧]有為網(wǎng)關(guān)配置 order-service 的路由;

  • 添加對 order-service 的服務(wù)的路由后,就可以從 gateway 訪問 order 的服務(wù)了;

2、路由斷言工廠

路由斷言工廠 Route Predicate Factory,作用是:

  • 我們在配置文件中寫的 predicates 斷言規(guī)則只是字符串,這些字符串會被 Predicate Factory 讀取并解析為路由判斷的條件。
  • 每種規(guī)則都有各自的斷言工廠去解析,比如 Path 有 PathRoutePredicateFactory 斷言工廠;

下面以 After 舉一個(gè)例子:

(1)添加斷言規(guī)則 After

  • After 斷言規(guī)則,規(guī)定在這個(gè)時(shí)間之后,才能進(jìn)行訪問;?

(2)訪問 order 的服務(wù)

  • 發(fā)送請求 /order/queryOrderById/1;
  • 理向情況應(yīng)該是:無法訪問;

  • 修改斷言規(guī)則的時(shí)間為:2020-12-31,重啟 gateway 模塊;

  • 再次發(fā)起請求,就可以訪問了;

3、路由的過濾器配置

路由過濾器是:GatewayFilter。

  • GatewayFilter 是網(wǎng)關(guān)中提供的一種過濾器,可以對進(jìn)入網(wǎng)關(guān)的請求微服務(wù)返回的響應(yīng)做處理。

在這個(gè)過程中,過濾器就可對請求和響應(yīng)做出各種各樣的處理,這樣往下游傳遞的數(shù)據(jù)中,就包含了修改后的信息。

具體有什么樣的操作,就要看使用哪個(gè)過濾器工廠:

下面我們以添加一個(gè)請求頭為例子:

(1)修改 application 配置文件

  • 給 routes 中的一個(gè)路由添加 filters 屬性;
  • filters 中添加:- AddRequestHeader=[key],[value];

(2)編寫 Controller,獲取請求頭信息

  • 既然在 filter 中設(shè)置了 header:orderStatus=001;
  • 那么請求傳遞到 Controller 后,一定可以獲取到這個(gè)頭信息;

  • 訪問 /order/queryOrderById/1,查看控制臺輸出;

(3)編寫默認(rèn)過濾器 default-filter

如果我們想為所有的請求都添加 header 信息,也不需要給每一個(gè)路由都寫上 filters。

  • 只需要在 routes 同級下,添加 default-filter 屬性;
  • 給?default-filter 屬性添加:- AddRequestHeader=[key],[value] 等屬性值;

  • 訪問 /order/queryOrderById/1,查看控制臺輸出;

4、全局過濾器

全局過濾器是:GlobalFilter。

  • 全局過濾器的作用:處理一切進(jìn)入網(wǎng)關(guān)的請求和微服務(wù)響應(yīng),與 GatewayFilter 的作用一樣,只是作用范圍不同。
  • 其中,GatewayFilter 通過配置定義,運(yùn)行邏輯是固定的。(官方定義)
  • 而 GlobalFilter 的運(yùn)行邏輯需要自己寫代碼實(shí)現(xiàn)。(自定義)

需求

定義全局過濾器,攔截請求,判斷請求的參數(shù)是否滿足下面條件:

  • 參數(shù)中是否有 authorization;
  • authorization 參數(shù)值是否為 admin;
  • 如果同時(shí)滿足則放行,否則攔截;

(1)定義實(shí)現(xiàn)類

  • 創(chuàng)建 AuthorFilter 實(shí)現(xiàn)類,實(shí)現(xiàn) GlobalFilter 接口;
  • exchange:請求上下文,里面可以獲取Request. Response等信息;
  • chain:用來把請求委托給下一個(gè)過濾器;
  • ?Nono<Void>:返回表示當(dāng)前過濾器業(yè)務(wù)結(jié)束

(2)定義 filter 方法的運(yùn)行邏輯

  • 添加 @Component;
  • 添加 @Order,方便多過濾器時(shí)指定順序;
  • 網(wǎng)關(guān)中采用的都是基于 WebFlux(響應(yīng)式編程)的 API,因此使用上與 ServletAPI 不同;
@Order(-1)
@Component
public class AuthorFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 1.獲取請求參數(shù)ServerHttpRequest request = exchange.getRequest();MultiValueMap<String, String> params = request.getQueryParams();// 2.獲取請求參數(shù)中的 author 參數(shù)值String author = params.getFirst("author");// 3.判斷是否等于 adminif (author.equalsIgnoreCase("admin")) {// 放行return chain.filter(exchange);}// 4.不相等,獲取響應(yīng)ServerHttpResponse response = exchange.getResponse();// 4.1.設(shè)置狀態(tài)碼,401表示未登錄response.setStatusCode(HttpStatus.UNAUTHORIZED);// 4.2.攔截請求return response.setComplete();}
}

(3)啟動(dòng) gateway 的 application

  • 訪問 /order/queryOrderById/1/author=admin111,先使用錯(cuò)誤的 authon 參數(shù)值;
  • 發(fā)現(xiàn)返回了 401;

  • 訪問 /order/queryOrderById/1/author=admin,使用正確的 authon 參數(shù)值;
  • 可以正常訪問

5、過濾器鏈執(zhí)行順序

請求進(jìn)入網(wǎng)關(guān)會碰到三類過濾器:當(dāng)前路由的過濾器、DefaultFilter、GlobalFilter。

請求路由后,會將當(dāng)前路由過濾器DefaultFilterGlobalFilter,合并到一個(gè)過濾器鏈(集合)中,排序后依次執(zhí)行每個(gè)過濾器。

過濾器執(zhí)行順序:

  • 每一個(gè)過濾器都必須指定一個(gè) int 類型的 order 值:order 值越小,優(yōu)先級越高,執(zhí)行順序越靠前;
  • GlobalFilter 通過實(shí)現(xiàn) Ordered 接口,或者添加 @Order 注解來指定 order 值,由我們自己指定;
  • 路由過濾器和 defaultFilter 的 order 由 Spring 官方指定,默認(rèn)是按照聲明順序從 1 遞增;
  • 當(dāng)過濾器的 order 值一樣時(shí),會按照 defaultFilter > 路由過濾器 > GlobalFilter 的順序執(zhí)行;

6、網(wǎng)關(guān)的 cors 跨域配置

由于一些頁面可能需要從微服務(wù)中獲取某些數(shù)據(jù),此時(shí)需要發(fā)起 AJAX 請求,那么這就可能屬于跨域請求的范疇。(一般我們的 web 頁面端口都不會與微服務(wù)的相同,所以請求基本上都是跨域請求)

跨域請求不需要在微服務(wù)中處理,只需要在網(wǎng)關(guān)中處理即可。

跨域:域名不一致就是跨域,主要包括:

  • 域名不同:www.taobao.com 和 www.taobao.org 和 www.jd.com 和 miaosha.jd.com;
  • 域名相同,端口不同:localhost:8080 和 localhost:8081

跨域問題的 2 個(gè)要素:

  • 瀏覽器、服務(wù)端:瀏覽器禁止請求向服務(wù)端發(fā)起跨域 ajax 請求,請求會被攔截;
  • 解決方案:CORS;

需求:

  • 使用 localhost:8090 發(fā)起請求,8090 發(fā)送的是 AJAX 的 GET 請求。
  • 8090 發(fā)起的 AJAX 請求需要通過網(wǎng)關(guān),在 AJAX 的目標(biāo)地址中要用 10010 端口;

(1)編寫 gateway 的配置文件

  • 各個(gè)屬性的作用都寫在注釋中了;

(2)端口 8090 的 AJAX 請求

  • 這里使用 JQuery 發(fā)起 AJAX 請求,傳遞參數(shù)為 author=admin;
  • 這里參數(shù)是必須傳遞的,因?yàn)榘l(fā)起的請求目標(biāo)地址是要通過網(wǎng)關(guān)的,需要鑒權(quán);
<head><meta charset="UTF-8"><title>Title</title><script type="text/javascript" src="JQuery-3.7.0.js"></script><script type="text/javascript">$(function() {$("#ajaxButton").click(function() {$.ajax({url:"http://localhost:10010/order/queryOrderById/1",data: {author : "admin"},type: "get",dataType: "json",success: function(data) {console.log(data);}});});});</script>
</head>
<body><a href="http://localhost:10010/order/queryOrderById/1?author=admin"> 發(fā)起普通GET請求 </a><input id="ajaxButton" type="button" value="發(fā)起 ajax 請求"/>
</body>
  • 發(fā)起請求,可以在控制臺看到返回的數(shù)據(jù);

  • 而如果我們用 <a> 來請求,是會跳轉(zhuǎn)到 10010 得頁面的,這就不算跨域請求了;

7、Gateway 網(wǎng)關(guān)使用問題匯總

(1)搭建網(wǎng)關(guān)服務(wù)時(shí),報(bào)錯(cuò) 503

這是因?yàn)樵?Spring Cloud 2020 版本以后,默認(rèn)移除了對 Netflix 的依賴,其中就包括 Ribbon,官方默認(rèn)推薦使用 Spring Cloud Loadbalancer 正式替換 Ribbon,并成為了 Spring Cloud 負(fù)載均衡器的唯一實(shí)現(xiàn)。

Loadbalancer 依賴:

http://aloenet.com.cn/news/43184.html

相關(guān)文章:

  • 學(xué)完html怎么做網(wǎng)站網(wǎng)絡(luò)營銷工程師培訓(xùn)
  • 做電影網(wǎng)站程序哪個(gè)好360網(wǎng)站安全檢測
  • 誰知道深圳松崗天橋旁的網(wǎng)站建設(shè)營銷軟文200字
  • apache 創(chuàng)建網(wǎng)站網(wǎng)絡(luò)公司網(wǎng)站建設(shè)
  • 杭州的網(wǎng)站建設(shè)公司哪家好網(wǎng)絡(luò)營銷是以什么為基礎(chǔ)
  • 怎么做網(wǎng)站聊天視頻直播進(jìn)入百度官網(wǎng)
  • 網(wǎng)站開發(fā)的測試計(jì)劃全網(wǎng)營銷軟件
  • 諸城 網(wǎng)站 建設(shè)企業(yè)應(yīng)該如何進(jìn)行網(wǎng)站推廣
  • 云南熱搜科技做網(wǎng)站不給源碼seo這個(gè)職位是干什么的
  • 企業(yè)網(wǎng)站制作模板免費(fèi)下載做seo需要哪些知識
  • 如何自己建設(shè)電影網(wǎng)站制作網(wǎng)站需要什么
  • 網(wǎng)站手機(jī)訪問跳轉(zhuǎn)萬網(wǎng)官網(wǎng)域名注冊
  • 網(wǎng)站建設(shè)培訓(xùn)南寧短視頻seo排名加盟
  • 軟件下載類型網(wǎng)站怎么做廣告推送平臺
  • 電子商務(wù)旅游網(wǎng)站建設(shè)策劃書廣州網(wǎng)絡(luò)營銷推廣公司
  • 問卷調(diào)查網(wǎng)站JAVA怎么做網(wǎng)站搭建步驟
  • 客戶開發(fā)軟件工具西安優(yōu)化seo
  • 昆明北京網(wǎng)站建設(shè)做網(wǎng)站的軟件叫什么
  • 婚紗網(wǎng)站建設(shè) 最開始百度百度
  • 個(gè)人公眾號做網(wǎng)站網(wǎng)店推廣培訓(xùn)
  • 套網(wǎng)站模板軟件wix網(wǎng)站制作
  • 西寧網(wǎng)站建設(shè)的公司哪家好免費(fèi)二級域名建站
  • 百度wap網(wǎng)站建設(shè)cdq百度指數(shù)
  • 惠州企業(yè)自助建站自己怎么創(chuàng)建網(wǎng)站
  • 臨沂購買模板建站網(wǎng)頁首頁設(shè)計(jì)圖片
  • 深圳教育網(wǎng)站設(shè)計(jì)公司鄭州seo顧問培訓(xùn)
  • java做網(wǎng)站沒有php好嗎360瀏覽器網(wǎng)頁版入口
  • 網(wǎng)站查詢信息愛站網(wǎng)關(guān)鍵字挖掘
  • wordpress建設(shè)網(wǎng)站石家莊全網(wǎng)seo
  • 美國網(wǎng)站服務(wù)器營銷活動(dòng)推廣策劃