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

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

thinkphp官方網(wǎng)站貴陽網(wǎng)站建設(shè)

thinkphp官方網(wǎng)站,貴陽網(wǎng)站建設(shè),在網(wǎng)上招標(biāo)做兼職的網(wǎng)站,學(xué)生為學(xué)校做網(wǎng)站文章目錄 認(rèn)識(shí)微服務(wù):SpringCloud 服務(wù)拆分及遠(yuǎn)程調(diào)用實(shí)現(xiàn)夸遠(yuǎn)程服務(wù)調(diào)用使用RestTemplateEureka注冊(cè)中心 搭建EruekaServer注冊(cè)服務(wù)服務(wù)發(fā)現(xiàn) Ribbon負(fù)載均衡 修改負(fù)載均衡規(guī)則解餓加載 Nacos注冊(cè)中心(nacos一部分功能) 服務(wù)注冊(cè)到nacosnacos…
文章目錄
    • 認(rèn)識(shí)微服務(wù):
    • SpringCloud
      • 服務(wù)拆分及遠(yuǎn)程調(diào)用
      • 實(shí)現(xiàn)夸遠(yuǎn)程服務(wù)調(diào)用使用RestTemplate
      • Eureka注冊(cè)中心
        • 搭建EruekaServer
        • 注冊(cè)服務(wù)
        • 服務(wù)發(fā)現(xiàn)
      • Ribbon負(fù)載均衡
        • 修改負(fù)載均衡規(guī)則
        • 解餓加載
      • Nacos注冊(cè)中心(nacos一部分功能)
        • 服務(wù)注冊(cè)到nacos
        • nacos服務(wù)分級(jí)存儲(chǔ)模型
        • 環(huán)境隔離 -namespace
      • Nacos配置管理
      • http客戶端Feign
        • 自定義Feign的配置
        • Feign的性能優(yōu)化
      • 統(tǒng)一網(wǎng)關(guān)Gateway
        • 網(wǎng)關(guān)功能:
        • 搭建網(wǎng)關(guān)服務(wù):
        • 路由斷言工廠Route Predicate Factory
        • 過濾器工廠
          • 請(qǐng)求頭過濾器
          • 默認(rèn)過濾器
          • 自定義全局過濾器
          • 過濾器執(zhí)行順序
          • 解決跨域問題

認(rèn)識(shí)微服務(wù):

單體架構(gòu):將業(yè)務(wù)的所有功能集中在一個(gè)項(xiàng)目中開發(fā),打成一個(gè)包部署。

優(yōu)點(diǎn):

  • 部署簡單

  • 部署成本低

    缺點(diǎn):

  • 耦合度高

  • 擴(kuò)展性差

分布式架構(gòu):根據(jù)業(yè)務(wù)功能對(duì)系統(tǒng)進(jìn)行拆分,每個(gè)業(yè)務(wù)模塊作為獨(dú)立項(xiàng)目開發(fā),稱為一個(gè)服務(wù)。

優(yōu)點(diǎn):

  • 降低服務(wù)耦合度

  • 有利于服務(wù)升級(jí)擴(kuò)展

    缺點(diǎn):

  • 架構(gòu)復(fù)雜

  • 難度大

微服務(wù): 微服務(wù)是一種經(jīng)過良好架構(gòu)設(shè)計(jì)的分布式架構(gòu)方案,微服務(wù)架構(gòu)特征:

  • 單一職責(zé):微服務(wù)拆分粒度更小,每一個(gè)服務(wù)都對(duì)應(yīng)唯一的業(yè)務(wù)能力,能做到單一職責(zé),避免重復(fù)業(yè)務(wù)開發(fā)
  • 面向服務(wù):微服務(wù)對(duì)外暴露業(yè)務(wù)接口
  • 自治:團(tuán)隊(duì)獨(dú)立、技術(shù)獨(dú)立、數(shù)據(jù)獨(dú)立、部署獨(dú)立
  • 隔離性強(qiáng):服務(wù)調(diào)用做好隔離、容錯(cuò)、降級(jí)、避免出現(xiàn)級(jí)聯(lián)問題

優(yōu)點(diǎn): 拆分粒度更小、服務(wù)更獨(dú)立、耦合度更低

缺點(diǎn): 架構(gòu)非常復(fù)雜,運(yùn)維、監(jiān)控、部署難度提高

(Dubbo、SpringCloud、SpringCloudAlibaba)微服務(wù)技術(shù)對(duì)比:

在這里插入圖片描述

企業(yè)需求:

在這里插入圖片描述

SpringCloud

SpringCloud是目前國內(nèi)使用最廣泛的微服務(wù)架構(gòu)框架。它集成了各種微服務(wù)功能組件,并基于SpringBoot實(shí)現(xiàn)了這些組件的自動(dòng)裝配。

官網(wǎng)地址:Spring Cloud
在這里插入圖片描述

服務(wù)拆分及遠(yuǎn)程調(diào)用

服務(wù)拆分注意事項(xiàng):

  1. 不同微服務(wù),不要開發(fā)相同業(yè)務(wù)
  2. 微服務(wù)數(shù)據(jù)獨(dú)立,不要訪問其他微服務(wù)的數(shù)據(jù)庫
  3. 微服務(wù)可以將自己的業(yè)務(wù)暴露為接口,提供給其他服務(wù)調(diào)用
實(shí)現(xiàn)夸遠(yuǎn)程服務(wù)調(diào)用使用RestTemplate

通過@Bean注解將RestTemplate對(duì)象交給spring管理,在需要的地方注入RestTemplate對(duì)象

調(diào)用方法:

		//利用RestTemplate發(fā)送http請(qǐng)求//url路徑String url = "http://localhost:8081/user/"+ order.getUserId();//發(fā)送http請(qǐng)求,實(shí)現(xiàn)遠(yuǎn)程調(diào)用User user = restTemplate.getForObject(url, User.class);
Eureka注冊(cè)中心

服務(wù)調(diào)用出現(xiàn)的問題 : 1.調(diào)用服務(wù)地址硬編碼 2.多個(gè)服務(wù)如何選擇 3.怎么知道服務(wù)提供者是否是健康狀態(tài)

Eureka的作用:

在這里插入圖片描述

  • 消費(fèi)者如何向服務(wù)提供者提供具體信息的

    • 服務(wù)啟動(dòng)時(shí)向eureka注冊(cè)自己的信息
    • eureka保存信息
    • 消費(fèi)者根據(jù)服務(wù)名稱向eureka拉取提供者信息
  • 如果多個(gè)提供者,消費(fèi)者該如何選擇

    • 消費(fèi)者利用負(fù)載均衡算法,從服務(wù)列表中挑選一個(gè)
  • 消費(fèi)者如何感知服務(wù)器提供者的健康狀態(tài)

    • 服務(wù)提供者每隔30秒向EruekaServer發(fā)送請(qǐng)求,報(bào)告健康狀態(tài)
    • eureka會(huì)更新服務(wù)器列表,不正常得到提供者會(huì)被剔除
搭建EruekaServer

1.創(chuàng)建項(xiàng)目引入依賴

<!--        eureak服務(wù)端--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency>

2.編寫啟動(dòng)類,添加@EnableEurekaServer注解

3.添加application.yml文件

server:port: 10086 #服務(wù)端口
spring:application:name: eurekaserver
eureka:client:service-url:  #eureka的地址信息deafultZone: http://127.0.0.1:10086/eureka

啟動(dòng)項(xiàng)目后方法10086端口就可以到eureka的界面

注冊(cè)服務(wù)

將服務(wù)注冊(cè)到eureka的步驟:

1.在服務(wù)項(xiàng)目中引入spring-cloud-starter-netflix-eureka-client的依賴

<!--        eureka客戶端依賴--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>

2.在application.yml文件,編寫配置

server:port: 8081
spring:datasource:url: jdbc:mysql://localhost:3306/cloud_user?useSSL=falseusername: rootpassword: ******driver-class-name: com.mysql.jdbc.Driverapplication:name: userService #user服務(wù)名稱
mybatis:type-aliases-package: cn.itcast.user.pojoconfiguration:map-underscore-to-camel-case: true
logging:level:cn.itcast: debugpattern:dateformat: MM-dd HH:mm:ss:SSS
eureka:client:service-url:  #eureka的地址信息defaultZone: http://127.0.0.1:10086/eureka
服務(wù)發(fā)現(xiàn)

1.在請(qǐng)求路徑上面把路徑換成我們注冊(cè)服務(wù)的名稱

 public Order queryOrderById(Long orderId) {// 1.查詢訂單Order order = orderMapper.findById(orderId);//利用RestTemplate發(fā)送http請(qǐng)求//url路徑(將路徑換成需要的服務(wù)的名稱)String url = "http://userservice/user/"+ order.getUserId();//發(fā)送http請(qǐng)求,實(shí)現(xiàn)遠(yuǎn)程調(diào)用User user = restTemplate.getForObject(url, User.class);order.setUser(user);// 4.返回return order;}

2.加上RestTemplate的Bean上面加 @LoadBalanced 注解

Ribbon負(fù)載均衡

在這里插入圖片描述

ribbon的負(fù)載均衡策略

在這里插入圖片描述

在這里插入圖片描述

修改負(fù)載均衡規(guī)則

默認(rèn)是輪詢方式

1.代碼方式:在消費(fèi)端的Application中,定義一個(gè)新的IRule

@Bean
public IRule randomRule(){return new RandowRule();
}

2.配置文件方式:配置文件只是更改一個(gè)服務(wù)的負(fù)載,不是全局

userservice:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
解餓加載

Ribbon默認(rèn)是采用懶加載,即第一次加載時(shí)才會(huì)去創(chuàng)建LoadBalanceClient,請(qǐng)求時(shí)間會(huì)很長。而解餓加載則會(huì)在項(xiàng)目啟動(dòng)時(shí)創(chuàng)建,降低第一次訪問的耗時(shí)。

ribbon:eager-load:enabled: true #開啟解餓加載clients: -userservice #指定服務(wù)名稱,多個(gè)服務(wù)需要在下面加 -
Nacos注冊(cè)中心(nacos一部分功能)

Nacos是阿里巴巴的產(chǎn)品,現(xiàn)在是SpringCloud中的一個(gè)組件。相比Eureka功能更加豐富。

Windows啟動(dòng)nacos命令:startup.cmd -m standalone

服務(wù)注冊(cè)到nacos

1.在Cloud-demo父工程中添加Spring-cloud-alilbaba 的管理依賴:

    <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.2.5.RELEASE</version><type>pom</type><scope>import</scope></dependency>

2.添加nacos的客戶端依賴

<!--        nacos客戶端依賴包--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>

3.改寫application.yml 文件,向yml文件中加入nacos的服務(wù)地址配置

  application:name: userservice #user服務(wù)名稱cloud:nacos:discovery:server-addr: localhost:8848 #nacos服務(wù)地址
nacos服務(wù)分級(jí)存儲(chǔ)模型

添加服務(wù)集群屬性

修改application.yml

  cloud:nacos:discovery:server-addr: localhost:8848 #nacos服務(wù)地址cluster-name: SH #集群名稱,Hz代指杭州

更改服務(wù)訪問規(guī)則(NacosRule負(fù)載均衡規(guī)則)

userservice:ribbon:NFLoadBalancerRuleClassName: com.alibaba.nacos.ribbon.NacosRule

NacosRule負(fù)載均衡規(guī)則 : 集群優(yōu)先

環(huán)境隔離 -namespace

1.在nacos網(wǎng)站去創(chuàng)建namespace命名空間

在這里插入圖片描述

2.配置服務(wù)所在命名空間,在application.yml文件中修改

  cloud:nacos:discovery:server-addr: localhost:8848cluster-name: HZnamespace: 359d6479-2271-43fa-9ca3-9cf1f1082906 #dev環(huán)境(復(fù)制我們創(chuàng)建好的命名空間Id)

不同nameSpace下的服務(wù)不可見(不能訪問)

在這里插入圖片描述

Nacos和eureka的區(qū)別

在這里插入圖片描述

Nacos配置管理

配置更改熱更新

在這里插入圖片描述

統(tǒng)一配置管理

1.引入Nacos的配置管理客戶端依賴:

<!--        nacos的配置管理依賴--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency>

2.在服務(wù)提供者中的resource目錄中添加一個(gè)bootstrap.yml文件,這個(gè)文件是引導(dǎo)文件,優(yōu)先級(jí)高于application.yml文件

spring:application:name: userservice #服務(wù)名稱profiles:active: dev #環(huán)境cloud:nacos:discovery:server-addr: localhost:8848 #nacos地址config:file-extension: yaml #文件后綴名

將application.yml文件中重復(fù)的配置刪掉

在這里插入圖片描述

配置自動(dòng)刷新

  • 方式一:在@Value注入的變量所在類上添加注解@RefreshScope

  • 方式二:使用@ConfigurationProperties注解

    @Data
    @Component
    @ConfigurationProperties(prefix = “pattern”)
    public class PatternProperties {
    private String dateformat;
    }

多環(huán)境配置共享優(yōu)先級(jí):

服務(wù)名-profile.yaml > 服務(wù)名.yaml > 本地配置

熱更新的Springboot實(shí)現(xiàn)

1.導(dǎo)入jar包

        <dependency><groupId>com.alibaba.boot</groupId><artifactId>nacos-config-spring-boot-starter</artifactId><version>0.2.11</version></dependency>

2.更改application.yaml文件

nacos:config:data-id: jc-club-oss  #用于指定要獲取的配置數(shù)據(jù)的ID或名稱。secret-key: nacos     # 用于進(jìn)行訪問控制的密鑰,用于對(duì)配置中心的訪問進(jìn)行認(rèn)證和授權(quán)。access-key: nacos   # 用于進(jìn)行訪問控制的密鑰,用于對(duì)配置中心的訪問進(jìn)行認(rèn)證和授權(quán)。group: DEFAULT_GROUP  #用于指定配置數(shù)據(jù)所屬的分組,這樣可以更好地組織和管理配置。type: yaml        #指定配置數(shù)據(jù)的類型,例如 YAML、Properties 等。server-addr: http://117.72.14.166:8848/  #指定Nacos配置中心的地址,包括主機(jī)名和端口。auto-refresh: true    #標(biāo)識(shí)是否自動(dòng)刷新配置內(nèi)容,當(dāng)配置中心的配置發(fā)生變化時(shí),客戶端是否自動(dòng)更新配置。remote-first: true    #當(dāng)配置中心不可用時(shí),是否優(yōu)先使用本地緩存的配置。bootstrap:enable: true    #是否啟用Bootstrap配置,Bootstrap配置是在Spring應(yīng)用程序啟動(dòng)時(shí)首先加載的一組配置。

3.使用@NacosValue注解

    @NacosValue(value = "${storage.service.type}",autoRefreshed = true)private String storageType;@GetMapping("/testNacos")public String testNacos() {return storageType;}

出現(xiàn) failed to req API:/nacos/v1/ns/instance after all servers([localhost:8848]) tried: java.net.ConnectException: Connection refused: connect 異常

因?yàn)橥瑫r(shí)導(dǎo)入了Nacos的配置中心和注冊(cè)中心的依賴導(dǎo)致

Nacos配置中心依賴 -config 注冊(cè)中心 -discovery

http客戶端Feign

使用之前的RestTemplate方式調(diào)用會(huì)出現(xiàn)一些問題

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

Feign是一聲明式的http客戶端,作用是幫助我們優(yōu)雅的實(shí)現(xiàn)http請(qǐng)求的發(fā)送。

1.引入Feign依賴

<!-- feign客戶端依賴-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>2.2.7.RELEASE</version>
</dependency>

2.在啟動(dòng)類上添加注解開啟Feign的功能

@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
@EnableFeignClients

3.編寫Feign客戶端

@FeignClient("userservice")
public interface UserClient {@GetMapping("/user/{id}")User findById(@PathVariable("id") Long id);
}

注意:若出現(xiàn) Load balancer does not have available server for client: userservice 錯(cuò)誤 需要查看服務(wù)的命名空間是否一致

微服務(wù)之間用openfeign調(diào)用要想保證微服務(wù)之間的用戶上下信息一致需要添加feign的攔截器

@Component
public class FeignRequestInterceptor implements RequestInterceptor {@Overridepublic void apply(RequestTemplate requestTemplate) {ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = requestAttributes.getRequest();if (!ObjectUtils.isEmpty(request)) {String loginId = request.getHeader("loginId");if (StringUtils.isNotBlank(loginId)){requestTemplate.header("loginId",loginId);}}}
}

同時(shí)將FeignRequestInterceptor注冊(cè)成Bean交給Spring管理

@Configuration
public class FeignConfiguration {@Beanpublic RequestInterceptor requestInterceptor(){return new FeignRequestInterceptor();}
}

這樣其他微服務(wù)就可以通過攔截器拿到loginId

自定義Feign的配置

在這里插入圖片描述

配置日志級(jí)別方式一(修改配置文件的方式):

feign:client:config:default:# 設(shè)置日志記錄級(jí)別,其取值共有none、basic、headers、fullloggerLevel: FULL

配置日志級(jí)別方式二(聲明Bean的方式):

public class DefaultFeignConfiguration {@Beanpublic Logger.Level logLevel(){return Logger.Level.BASIC;}
}

全局有效

@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class)

具體服務(wù)有效

@FeignClient(value = "userservice",configuration = DefaultFeignConfiguration.class)
Feign的性能優(yōu)化

在這里插入圖片描述

使用連接池代替默認(rèn)的URLConnection:

Feign添加HttpClient的支持依賴:

<!--        引入HttpClient依賴--><dependency><groupId>io.github.openfeign</groupId><artifactId>feign-httpclient</artifactId></dependency>

配置application.yml文件:

feign:httpclient:enabled: true  #支持httpClient的開關(guān)max-connections: 200  #最大連接數(shù)max-connections-per-route: 50  #單個(gè)路徑的最大連接數(shù)

Feign的優(yōu)化:

  • 日志級(jí)別盡量用basic
  • 使用HttpClient或者OkHttp代替URLConnection

Feign的最佳實(shí)踐
在這里插入圖片描述

方式二:

  1. 新建module并引入feign的starter的依賴

            <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
    
  2. 將feign的客戶端和實(shí)體類抽取到新建的module中

  3. 在需要使用服務(wù)的pom文件中引入依賴

  4. 修改組件有關(guān)的import部分,改成使用新建module中的包

在這里插入圖片描述

統(tǒng)一網(wǎng)關(guān)Gateway
網(wǎng)關(guān)功能:
  • 身份認(rèn)證和權(quán)限校驗(yàn)
  • 服務(wù)路由,負(fù)載均衡
  • 請(qǐng)求限流

Springcloud 中網(wǎng)關(guān)的實(shí)現(xiàn)包括兩種:

  • gateway
  • zuul
搭建網(wǎng)關(guān)服務(wù):

1.創(chuàng)建一個(gè)module,引入SpringCloudGateway的依賴和Nacos的服務(wù)發(fā)現(xiàn)依賴:

<!--        nacos服務(wù)發(fā)現(xiàn)依賴--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>
<!--        網(wǎng)關(guān)gateway依賴--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>

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

server:port: 10010 #網(wǎng)關(guān)端口
spring:application:name: gateway #服務(wù)名稱cloud:nacos:server-addr: localhost:8848gateway:routes: #網(wǎng)關(guān)路由配置- id: user-service #路由Id,自定義,只要唯一即可#uri: http://127.0.0.1:8081 #路由的目標(biāo)地址http是固定地址uri: lb://userservice #路由目標(biāo)地址 lb就是負(fù)載均衡,后面跟服務(wù)名稱predicates: #路由斷言,也就是判斷請(qǐng)求是否符合路由規(guī)則的條件- Path=/user/** #按照路徑匹配,只要以/user/開頭就符合條件- id: order-serviceuri: lb://orderservicepredicates: - Path=/order/** 

在這里插入圖片描述

總結(jié):

網(wǎng)關(guān)搭建步驟:

  1. 創(chuàng)建項(xiàng)目,引入nacos服務(wù)發(fā)現(xiàn)和gateway依賴

  2. 配置application.yml,包括服務(wù)基本信息、nacos地址、路由

路由配置包括:

  1. 路由id:路由的唯一標(biāo)示

  2. 路由目標(biāo)(uri):路由的目標(biāo)地址,http代表固定地址,lb代表根據(jù)服務(wù)名負(fù)載均衡

  3. 路由斷言(predicates):判斷路由的規(guī)則,

  4. 路由過濾器(filters):對(duì)請(qǐng)求或響應(yīng)做處理

路由斷言工廠Route Predicate Factory

我們?cè)谂渲梦募袑懙臄嘌砸?guī)則只是字符串,這些字符串會(huì)被Predicate Factory讀取并處理,轉(zhuǎn)變?yōu)槁酚膳袛嗟臈l件

例如Path=/user/**是按照路徑匹配,這個(gè)規(guī)則是由

org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory類來

處理的,像這樣的斷言工廠在SpringCloudGateway還有十幾個(gè):

名稱

說明

示例

After

是某個(gè)時(shí)間點(diǎn)后的請(qǐng)求

- After=2037-01-20T17:42:47.789-07:00[America/Denver]

Before

是某個(gè)時(shí)間點(diǎn)之前的請(qǐng)求

- Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai]

Between

是某兩個(gè)時(shí)間點(diǎn)之前的請(qǐng)求

- Between=2037-01-20T17:42:47.789-07:00[America/Denver], 2037-01-21T17:42:47.789-07:00[America/Denver]

Cookie

請(qǐng)求必須包含某些cookie

- Cookie=chocolate, ch.p

Header

請(qǐng)求必須包含某些header

- Header=X-Request-Id, d+

Host

請(qǐng)求必須是訪問某個(gè)host(域名)

- Host=.somehost.org,.anotherhost.org

Method

請(qǐng)求方式必須是指定方式

- Method=GET,POST

Path

請(qǐng)求路徑必須符合指定規(guī)則

- Path=/red/{segment},/blue/**

Query

請(qǐng)求參數(shù)必須包含指定參數(shù)

- Query=name, Jack或者- Query=name

RemoteAddr

請(qǐng)求者的ip必須是指定范圍

- RemoteAddr=192.168.1.1/24

Weight

權(quán)重處理

過濾器工廠

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

在這里插入圖片描述

名稱

說明

AddRequestHeader

給當(dāng)前請(qǐng)求添加一個(gè)請(qǐng)求頭

RemoveRequestHeader

移除請(qǐng)求中的一個(gè)請(qǐng)求頭

AddResponseHeader

給響應(yīng)結(jié)果中添加一個(gè)響應(yīng)頭

RemoveResponseHeader

從響應(yīng)結(jié)果中移除有一個(gè)響應(yīng)頭

RequestRateLimiter

限制請(qǐng)求的流量

請(qǐng)求頭過濾器

下面我們以AddRequestHeader 為例來講解。

需求:給所有進(jìn)入userservice的請(qǐng)求添加一個(gè)請(qǐng)求頭:Truth=itcast is freaking awesome!

只需要修改gateway服務(wù)的application.yml文件,添加路由過濾即可:

spring:cloud:gateway:routes:- id: user-service uri: lb://userservice predicates: - Path=/user/** filters: # 過濾器- AddRequestHeader=Truth, Itcast is freaking awesome! # 添加請(qǐng)求頭

當(dāng)前過濾器寫在userservice路由下,因此僅僅對(duì)訪問userservice的請(qǐng)求有效。

默認(rèn)過濾器

如果要對(duì)所有的路由都生效,則可以將過濾器工廠寫到default下。格式如下:

spring:cloud:gateway:routes:- id: user-service uri: lb://userservice predicates: - Path=/user/**default-filters: # 默認(rèn)過濾項(xiàng)- AddRequestHeader=Truth, Itcast is freaking awesome! 
自定義全局過濾器

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

  • 參數(shù)中是否有authorization,

  • authorization參數(shù)值是否為admin

如果同時(shí)滿足則放行,否則攔截

實(shí)現(xiàn):

在gateway中定義一個(gè)過濾器:

package cn.itcast.gateway.filters;import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;@Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 1.獲取請(qǐng)求參數(shù)MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();// 2.獲取authorization參數(shù)String auth = params.getFirst("authorization");// 3.校驗(yàn)if ("admin".equals(auth)) {// 放行return chain.filter(exchange);}// 4.攔截// 4.1.禁止訪問,設(shè)置狀態(tài)碼exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);// 4.2.結(jié)束處理return exchange.getResponse().setComplete();}
}
過濾器執(zhí)行順序

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

請(qǐng)求路由后,會(huì)將當(dāng)前路由過濾器和DefaultFilter、GlobalFilter,合并到一個(gè)過濾器鏈(集合)中,排序后依次執(zhí)行每個(gè)過濾器:

在這里插入圖片描述

排序的規(guī)則:

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

詳細(xì)內(nèi)容,可以查看源碼:

org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator#getFilters()方法是先加載defaultFilters,然后再加載某個(gè)route的filters,然后合并。

org.springframework.cloud.gateway.handler.FilteringWebHandler#handle()方法會(huì)加載全局過濾器,與前面的過濾器合并后根據(jù)order排序,組織過濾器鏈

解決跨域問題

在gateway服務(wù)的application.yml文件中,添加下面的配置:

spring:cloud:gateway:# 。。。globalcors: # 全局的跨域處理add-to-simple-url-handler-mapping: true # 解決options請(qǐng)求被攔截問題corsConfigurations:'[/**]':allowedOrigins: # 允許哪些網(wǎng)站的跨域請(qǐng)求 - "http://localhost:8090"allowedMethods: # 允許的跨域ajax的請(qǐng)求方式- "GET"- "POST"- "DELETE"- "PUT"- "OPTIONS"allowedHeaders: "*" # 允許在請(qǐng)求中攜帶的頭信息allowCredentials: true # 是否允許攜帶cookiemaxAge: 360000 # 這次跨域檢測的有效期

網(wǎng)關(guān)提示503錯(cuò)誤,并且配置的地址信息都符合 查看是否配置的負(fù)載均衡的依賴

        <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-loadbalancer</artifactId></dependency>
http://m.aloenet.com.cn/news/808.html

相關(guān)文章:

  • 2015個(gè)人網(wǎng)站如何去工信部備案深圳網(wǎng)站提升排名
  • 網(wǎng)站開發(fā)流程主要分成什么seo外鏈代發(fā)
  • 網(wǎng)站代理怎么做/成都seo正規(guī)優(yōu)化
  • 學(xué)網(wǎng)頁設(shè)計(jì)需要什么基礎(chǔ)/寧波優(yōu)化網(wǎng)站排名軟件
  • 廣東個(gè)人備案網(wǎng)站內(nèi)容/百度平臺(tái)推廣聯(lián)系方式
  • 01.線性代數(shù)是如何將復(fù)雜的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)化為可計(jì)算的數(shù)學(xué)問題,這個(gè)過程是如何進(jìn)行的
  • Cursor Pro取消500次請(qǐng)求限制,無限用的體驗(yàn)更好了嗎?
  • 武漢互聯(lián)網(wǎng)公司排行榜/成都seo顧問
  • 紹興做企業(yè)網(wǎng)站的公司/營銷策劃主要做些什么
  • sae wordpress sitemap/東莞seo建站公司
  • 武漢網(wǎng)站制作/建立一個(gè)網(wǎng)站的費(fèi)用
  • 黑河商城網(wǎng)站建設(shè)/東莞網(wǎng)絡(luò)推廣平臺(tái)
  • 蔚縣做網(wǎng)站/云資源軟文發(fā)布平臺(tái)
  • 小企業(yè)網(wǎng)站建設(shè)的大品牌/優(yōu)化整站
  • 網(wǎng)站開發(fā)管理/網(wǎng)站優(yōu)化員seo招聘
  • 慶陽網(wǎng)站設(shè)計(jì)/創(chuàng)建自己的網(wǎng)頁
  • 做系統(tǒng)下載網(wǎng)站建設(shè)/最新經(jīng)濟(jì)新聞
  • 工會(huì)網(wǎng)站平臺(tái)建設(shè)/推廣普通話的宣傳標(biāo)語
  • 做網(wǎng)站和做網(wǎng)頁一樣嗎/大數(shù)據(jù)查詢
  • 3d做號(hào)網(wǎng)站/刷推廣軟件
  • 網(wǎng)上購物系統(tǒng)源代碼/關(guān)鍵詞優(yōu)化建議
  • 北京 做網(wǎng)站/新站整站優(yōu)化
  • c語言在線編程網(wǎng)站/全自動(dòng)推廣軟件
  • 怎么網(wǎng)站代備案/微信推廣方式有哪些
  • 網(wǎng)站規(guī)劃的一般步驟/搭建一個(gè)網(wǎng)站平臺(tái)需要多少錢
  • 石家莊網(wǎng)站搭建/我的百度賬號(hào)登錄
  • 做網(wǎng)站怎么加彈幕/營銷咨詢公司
  • 網(wǎng)站建設(shè)中的功能/百度地址
  • 素材網(wǎng)站下載/口碑營銷的主要手段有哪些
  • 校友網(wǎng)站 建設(shè)/強(qiáng)力搜索引擎