最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Cloud Gateway入門解讀

 更新時間:2018年04月26日 10:42:18   作者:Aoho''s Blog  
本篇文章主要介紹了Spring Cloud Gateway入門解讀,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

Spring Cloud Gateway介紹

前段時間剛剛發(fā)布了Spring Boot 2正式版,Spring Cloud Gateway基于Spring Boot 2,是Spring Cloud的全新項(xiàng)目,該項(xiàng)目提供了一個構(gòu)建在Spring 生態(tài)之上的API網(wǎng)關(guān),包括:Spring 5,Spring Boot 2和Project Reactor。 Spring Cloud Gateway旨在提供一種簡單而有效的途徑來發(fā)送API,并為他們提供橫切關(guān)注點(diǎn),例如:安全性,監(jiān)控/指標(biāo)和彈性。當(dāng)前最新的版本是v2.0.0.M8,正式版最近也會到來。

Spring Cloud Gateway的特征:

  1. Java 8
  2. Spring Framework 5
  3. Spring Boot 2
  4. 動態(tài)路由
  5. 內(nèi)置到Spring Handler映射中的路由匹配
  6. 基于HTTP請求的路由匹配 (Path, Method, Header, Host, etc…​)
  7. 過濾器作用于匹配的路由
  8. 過濾器可以修改下游HTTP請求和HTTP響應(yīng) (Add/Remove Headers, Add/Remove Parameters, Rewrite Path, Set Path, Hystrix, etc…​)
  9. 通過API或配置驅(qū)動
  10. 支持Spring Cloud DiscoveryClient配置路由,與服務(wù)發(fā)現(xiàn)與注冊配合使用

vs Netflix Zuul

Zuul基于servlet 2.5(使用3.x),使用阻塞API。 它不支持任何長連接,如websockets。而Gateway建立在Spring Framework 5,Project Reactor和Spring Boot 2之上,使用非阻塞API。 Websockets得到支持,并且由于它與Spring緊密集成,所以將會是一個更好的開發(fā)體驗(yàn)。

Spring Cloud Gateway入門實(shí)踐

筆者最近研讀了Spring Cloud Gateway的源碼,大部分功能的實(shí)現(xiàn)也寫了源碼分析的文章,但畢竟正式版沒有發(fā)布,本文算是一篇入門實(shí)踐,展示常用的幾個功能,期待最近的正式版本發(fā)布。

示例啟動兩個服務(wù):Gateway-Server和user-Server。模擬的場景是,客戶端請求后端服務(wù),網(wǎng)關(guān)提供后端服務(wù)的統(tǒng)一入口。后端的服務(wù)都注冊到服務(wù)發(fā)現(xiàn)Consul(搭建zk,Eureka都可以,筆者比較習(xí)慣使用consul)。網(wǎng)關(guān)通過負(fù)載均衡轉(zhuǎn)發(fā)到具體的后端服務(wù)。

用戶服務(wù)

用戶服務(wù)注冊到Consul上,并提供一個接口/test。

依賴

需要的依賴如下:

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

配置文件

spring:
 application:
  name: user-service
 cloud:
  consul:
   host: 192.168.1.204
   port: 8500
   discovery:
    ip-address: ${HOST_ADDRESS:localhost}
    port: ${SERVER_PORT:${server.port}}
    healthCheckPath: /health
    healthCheckInterval: 15s
    instance-id: user-${server.port}
    service-name: user
server:
 port: 8005
management:
 security:
  enabled: false

暴露接口

@SpringBootApplication
@RestController
@EnableDiscoveryClient
public class GatewayUserApplication {
  public static void main(String[] args) {
    SpringApplication.run(GatewayUserApplication.class, args);
  }
  @GetMapping("/test")
  public String test() {
    return "ok";
  }
}

暴露/test接口,返回ok即可。

網(wǎng)關(guān)服務(wù)

網(wǎng)關(guān)服務(wù)提供多種路由配置、路由斷言工廠和過濾器工廠等功能。

依賴

需要引入的依賴:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-actuator</artifactId>
</dependency>
//依賴于webflux,必須引入
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-gateway-core</artifactId>
</dependency>
//服務(wù)發(fā)現(xiàn)組件,排除web依賴
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-consul-discovery</artifactId>
  <version>2.0.0.M6</version>
  <exclusions>
    <exclusion>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </exclusion>
  </exclusions>
</dependency>
//kotlin依賴
<dependency>
  <groupId>org.jetbrains.kotlin</groupId>
  <artifactId>kotlin-stdlib</artifactId>
  <version>${kotlin.version}</version>
  <optional>true</optional>
</dependency>
<dependency>
  <groupId>org.jetbrains.kotlin</groupId>
  <artifactId>kotlin-reflect</artifactId>
  <version>${kotlin.version}</version>
  <optional>true</optional>
</dependency>

如上引入了kotlin相關(guān)的依賴,這里需要支持kotlin的路由配置。Spring Cloud Gateway的使用需要排除web相關(guān)的配置,引入的是webflux的引用,應(yīng)用啟動時會檢查,必須引入。

路由斷言工廠

路由斷言工廠有多種類型,根據(jù)請求的時間、host、路徑、方法等等。如下定義的是一個基于路徑的路由斷言匹配。

@Bean
public RouterFunction<ServerResponse> testFunRouterFunction() {
  RouterFunction<ServerResponse> route = RouterFunctions.route(
      RequestPredicates.path("/testfun"),
      request -> ServerResponse.ok().body(BodyInserters.fromObject("hello")));
  return route;
}

當(dāng)請求的路徑為/testfun時,直接返回ok的狀態(tài)碼,且響應(yīng)體為hello字符串。

過濾器工廠

網(wǎng)關(guān)經(jīng)常需要對路由請求進(jìn)行過濾,進(jìn)行一些操作,如鑒權(quán)之后構(gòu)造頭部之類的,過濾的種類很多,如增加請求頭、增加請求參數(shù)、增加響應(yīng)頭和斷路器等等功能。

@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder, ThrottleGatewayFilterFactory throttle) {
  //@formatter:off
  return builder.routes()
      .route(r -> r.path("/image/webp")
          .filters(f ->
              f.addResponseHeader("X-AnotherHeader", "baz"))
          .uri("http://httpbin.org:80")
      )
      .build();
  //@formatter:on
}

如上實(shí)現(xiàn)了當(dāng)請求路徑為/image/webp時,將請求轉(zhuǎn)發(fā)到http://httpbin.org:80,并對響應(yīng)進(jìn)行過濾處理,增加響應(yīng)的頭部X-AnotherHeader: baz。

自定義路由

上面兩小節(jié)屬于API自定義路由,還可以通過配置進(jìn)行定義:

spring:
 cloud:
  gateway:
   locator:
    enabled: true
   default-filters:
   - AddResponseHeader=X-Response-Default-Foo, Default-Bar
   routes:
   # =====================================
   - id: default_path_to_http
    uri: blueskykong.com
    order: 10000
    predicates:
    - Path=/**

如上的配置定義了路由與過濾器。全局過濾器將所有的響應(yīng)加上頭部X-Response-Default-Foo: Default-Bar。定義了id為default_path_to_http的路由,只是優(yōu)先級比較低,當(dāng)該請求都不能匹配時,將會轉(zhuǎn)發(fā)到blueskykong.com。

kotlin自定義路由

Spring Cloud Gateway可以使用kotlin自定義路由:

@Configuration
class AdditionalRoutes {
 @Bean
 fun additionalRouteLocator(builder: RouteLocatorBuilder): RouteLocator = builder.routes {
 route(id = "test-kotlin") {
  path("/image/png")
  filters {
  addResponseHeader("X-TestHeader", "foobar")
  }
  uri("http://httpbin.org:80")
 }
 }
}

當(dāng)請求的路徑是/image/png,將會轉(zhuǎn)發(fā)到http://httpbin.org:80,并設(shè)置了過濾器,在其響應(yīng)頭中加上了X-TestHeader: foobar頭部。

服務(wù)發(fā)現(xiàn)組件

與服務(wù)注冊于發(fā)現(xiàn)組件進(jìn)行結(jié)合,通過serviceId轉(zhuǎn)發(fā)到具體的服務(wù)實(shí)例。在前面的配置已經(jīng)引入了相應(yīng)的依賴。

@Bean
public RouteDefinitionLocator discoveryClientRouteDefinitionLocator(DiscoveryClient discoveryClient) {
  return new DiscoveryClientRouteDefinitionLocator(discoveryClient);
}

將DiscoveryClient注入到DiscoveryClientRouteDefinitionLocator的構(gòu)造函數(shù)中,關(guān)于該路由定義定位器,后面的源碼分析會講解,此處不展開。

spring:
 cloud:
  gateway:
   locator:
    enabled: true
   default-filters:
   - AddResponseHeader=X-Response-Default-Foo, Default-Bar
   routes:
   # =====================================
   - id: service_to_user
    uri: lb://user
    order: 8000
    predicates:
    - Path=/user/**
    filters:
    - StripPrefix=1

上面的配置開啟了DiscoveryClient定位器的實(shí)現(xiàn)。路由定義了,所有請求路徑以/user開頭的請求,都將會轉(zhuǎn)發(fā)到user服務(wù),并應(yīng)用路徑的過濾器,截取掉路徑的第一部分前綴。即訪問/user/test的實(shí)際請求轉(zhuǎn)換成了lb://user/test。

websocket

還可以配置websocket的網(wǎng)關(guān)路由:

spring:
 cloud:
  gateway:
   default-filters:
   - AddResponseHeader=X-Response-Default-Foo, Default-Bar
   routes:
   - id: websocket_test
    uri: ws://localhost:9000
    order: 9000
    predicates:
    - Path=/echo

啟動一個ws服務(wù)端wscat --listen 9000,將網(wǎng)關(guān)啟動(網(wǎng)關(guān)端口為9090),進(jìn)行客戶端連接即可wscat --connect ws://localhost:9090/echo。

客戶端的訪問

上述實(shí)現(xiàn)的功能,讀者可以自行下載源碼進(jìn)行嘗試。筆者這里只展示訪問用戶服務(wù)的結(jié)果:

網(wǎng)關(guān)成功負(fù)載均衡到user-server,并返回了ok。響應(yīng)的頭部中包含了全局過濾器設(shè)置的頭部X-Response-Default-Foo: Default-Bar

總結(jié)

在本文中,我們探討了屬于Spring Cloud Gateway的一些功能和組件。 這個新的API提供了用于網(wǎng)關(guān)和代理支持的開箱即用工具。期待Spring Cloud Gateway 2.0正式版。

源碼地址

https://github.com/keets2012/Spring-Cloud_Samples

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java實(shí)現(xiàn)的簡單字符串反轉(zhuǎn)操作示例

    Java實(shí)現(xiàn)的簡單字符串反轉(zhuǎn)操作示例

    這篇文章主要介紹了Java實(shí)現(xiàn)的簡單字符串反轉(zhuǎn)操作,結(jié)合實(shí)例形式分別描述了java遍歷逆序輸出以及使用StringBuffer類的reverse()方法兩種字符串反轉(zhuǎn)操作技巧,需要的朋友可以參考下
    2018-08-08
  • Java將List轉(zhuǎn)換為String的幾種常見方式

    Java將List轉(zhuǎn)換為String的幾種常見方式

    在實(shí)際開發(fā)中經(jīng)常遇到List轉(zhuǎn)為String字符串的情況,下面這篇文章主要給大家介紹了關(guān)于Java將List轉(zhuǎn)換為String的幾種常見方式,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • idea 配置checkstyle詳細(xì)步驟

    idea 配置checkstyle詳細(xì)步驟

    checkstyle是提高代碼質(zhì)量,檢查代碼規(guī)范的很好用的一款工具,本文簡單介紹一下集成的步驟,并提供一份完整的checkstyle的代碼規(guī)范格式文件,以及常見的格式問題的解決方法,需要的朋友可以參考下
    2023-11-11
  • JAVA隨機(jī)打亂數(shù)組順序的方法

    JAVA隨機(jī)打亂數(shù)組順序的方法

    這篇文章主要介紹了JAVA隨機(jī)打亂數(shù)組順序的方法,包含了隨機(jī)數(shù)的應(yīng)用及數(shù)組的排序等操作,是Java操作數(shù)組的典型應(yīng)用,需要的朋友可以參考下
    2014-11-11
  • Maven Plugin的@Mojo和@Execute的具體使用

    Maven Plugin的@Mojo和@Execute的具體使用

    本文主要介紹了Maven Plugin的@Mojo和@Execute的具體使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • kafka生產(chǎn)實(shí)踐(詳解)

    kafka生產(chǎn)實(shí)踐(詳解)

    下面小編就為大家?guī)硪黄猭afka生產(chǎn)實(shí)踐(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • Go反射底層原理及數(shù)據(jù)結(jié)構(gòu)解析

    Go反射底層原理及數(shù)據(jù)結(jié)構(gòu)解析

    這篇文章主要介紹了Go反射底層原理及數(shù)據(jù)結(jié)構(gòu)解析,反射的實(shí)現(xiàn)和interface的組成很相似,都是由“類型”和“數(shù)據(jù)值”構(gòu)成,下面小編分享更多相關(guān)內(nèi)容需要的小伙伴可以參考一下
    2022-06-06
  • springboot?加載本地jar到maven的實(shí)現(xiàn)方法

    springboot?加載本地jar到maven的實(shí)現(xiàn)方法

    如何在SpringBoot項(xiàng)目中加載本地jar到Maven本地倉庫,使用Maven的install-file目標(biāo)來實(shí)現(xiàn),本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • Java中的@SneakyThrows注解詳解

    Java中的@SneakyThrows注解詳解

    這篇文章主要介紹了Java中的@SneakyThrows注解詳解,@SneakyThrows將當(dāng)前方法拋出的異常,包裝成RuntimeException,騙過編譯器,使得調(diào)用點(diǎn)可以不用顯示處理異常信息,需要的朋友可以參考下
    2023-10-10
  • 關(guān)于File與MultipartFile的用法概述

    關(guān)于File與MultipartFile的用法概述

    這篇文章主要介紹了關(guān)于File與MultipartFile的用法概述,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09

最新評論

湟中县| 乡城县| 建宁县| 德江县| 斗六市| 彭泽县| 阳高县| 德钦县| 云安县| 厦门市| 承德市| 上思县| 崇仁县| 玉龙| 三门县| 涞源县| 都江堰市| 武胜县| 天峨县| 广西| 长岛县| 桃园县| 福州市| 岚皋县| 永泰县| 洪泽县| 白河县| 晋宁县| 鄂尔多斯市| 四会市| 甘谷县| 文安县| 望奎县| 宜兴市| 娄烦县| 芷江| 新和县| 修文县| 沙洋县| 湖北省| 长丰县|