十赋铝、Gateway網關服務搭建和配置

1. 新建服務泼菌,pom文件

新建gateway-server服務迄薄,pom文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.12.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.test</groupId>
    <artifactId>gateway-server</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <name>gateway-server</name>
    <description>gateway網關服務</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
        <spring-cloud.version>Hoxton.SR9</spring-cloud.version>
    </properties>

    <dependencies>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
      </dependency>
        <!-- 測試路由用的琅关,
        可訪問 http://ip:port/actuator/gateway/routes 
        查看路由是否配置生效 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!-- Nacos注冊和服務配置,網關也要放到nacos上的 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

      <!-- Spring Cloud Gateway 的早期版本中讥蔽,Ribbon 被用作默認的負載均衡器, Spring Cloud 2020.0.0 版本開始涣易,Ribbon 被廢棄,Spring Cloud LoadBalancer 成為了推薦的負載均衡方案冶伞。為了靈活性新症,需要手動引入-->
        <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
        <!-- 后續(xù)關聯(lián)sentinel用 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
        </dependency>
        
        
        
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <finalName>gateway-service</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
            <!-- 編譯打包跳過test -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <skip>true</skip>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

特別注意:

  • Spring Cloud Gateway 不使用 Web 作為服務器,而是 使用 WebFlux 作為服務器响禽,Gateway 項目已經依賴了 starter-webflux徒爹,所以這里 千萬不要依賴 starter-web
  • 由于過濾器等功能依然需要 Servlet 支持,故這里還需要依賴 javax.servlet:javax.servlet-api

2. 跨域配置

因為不是Web 作為服務器芋类,和其他的稍有不同

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
import org.springframework.web.reactive.config.CorsRegistry;
import org.springframework.web.reactive.config.WebFluxConfigurer;

/**
 * 跨域配置
 */
@Configuration
public class CorsConfig implements WebFluxConfigurer 
  
  @Override
  public void addCorsMappings(CorsRegistry registry) {
      registry.addMapping("/**")
              .allowCredentials(true)
              .allowedOrigins("*")
              .allowedHeaders("*")
              .allowedMethods("*")
              .exposedHeaders(HttpHeaders.SET_COOKIE);
  }
  
  /**
   * 跨域過濾器
   * @return
   */
  @Bean
  public CorsWebFilter corsWebFilter() {
      CorsConfiguration corsConfiguration = new CorsConfiguration();
      corsConfiguration.setAllowCredentials(true);
      corsConfiguration.addAllowedHeader("*");
      corsConfiguration.addAllowedMethod("*");
      corsConfiguration.addAllowedOrigin("*");
      corsConfiguration.addExposedHeader(HttpHeaders.SET_COOKIE);
      UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();
      corsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
      return new CorsWebFilter(corsConfigurationSource);
  }
}

3. 啟動文件添加@EnableFeignClients注解

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class GatewayServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(GatewayServerApplication.class, args);
    }

}

4. nacos中配置信息

# 1.server
server:
  port: 10000
# 2.log
logging:
  level:
    org.springframework.cloud.gateway: info
# 3. openfeign
feign:
  sentinel:
    enabled: true
# 4. 為了監(jiān)控網關
management:
  endpoints:
    web:
      exposure:
        include: "*"
# 5.spring
spring: 
  # 統(tǒng)一設置返回的時間格式
  jackson: 
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
    default-property-inclusion: NON_NULL
  cloud: 
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
          # 自定義路由 ID
        - id: service-dict
          # 采用 LoadBalanceClient 方式請求隆嗅,以 lb:// 開頭,后面的是注冊在 Nacos 上的服務名
          uri: lb://service-dict
          # Predicate 翻譯過來是“謂詞”的意思侯繁,必須榛瓮,主要作用是匹配用戶的請求,有很多種用法
          predicates:
            # 路徑匹配巫击,以 api 開頭禀晓,直接配置是不生效的,看 filters 配置
            - Path=/api/dict/**
          filters:
            # 前綴過濾坝锰,默認配置下粹懒,我們的請求路徑是 http://localhost:9000/myshop-service-consumer-item/** 這時會路由到指定的服務
            # 此處配置去掉 1 個路徑前綴,再配置上面的 Path=/api/**顷级,就能按照 http://localhost:9000/api/** 的方式訪問了
            - StripPrefix=1
        - id: service-file
          uri: lb://service-file
          predicates:
            - Path=/api/file/**
          filters:
            - StripPrefix=1
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末凫乖,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌帽芽,老刑警劉巖删掀,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異导街,居然都是意外死亡披泪,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門搬瑰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來款票,“玉大人,你說我怎么就攤上這事泽论“伲” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵翼悴,是天一觀的道長缚够。 經常有香客問我,道長鹦赎,這世上最難降的妖魔是什么谍椅? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮钙姊,結果婚禮上,老公的妹妹穿的比我還像新娘埂伦。我一直安慰自己煞额,他們只是感情好,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布沾谜。 她就那樣靜靜地躺著膊毁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪基跑。 梳的紋絲不亂的頭發(fā)上婚温,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機與錄音媳否,去河邊找鬼栅螟。 笑死,一個胖子當著我的面吹牛篱竭,可吹牛的內容都是我干的力图。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼掺逼,長吁一口氣:“原來是場噩夢啊……” “哼吃媒!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤赘那,失蹤者是張志新(化名)和其女友劉穎刑桑,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體募舟,經...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡祠斧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了胃珍。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梁肿。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖觅彰,靈堂內的尸體忽然破棺而出吩蔑,到底是詐尸還是另有隱情,我是刑警寧澤填抬,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布烛芬,位于F島的核電站,受9級特大地震影響飒责,放射性物質發(fā)生泄漏赘娄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一宏蛉、第九天 我趴在偏房一處隱蔽的房頂上張望遣臼。 院中可真熱鬧,春花似錦拾并、人聲如沸揍堰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽屏歹。三九已至,卻和暖如春之碗,著一層夾襖步出監(jiān)牢的瞬間蝙眶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工褪那, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留幽纷,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓博敬,卻偏偏與公主長得像霹崎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子冶忱,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內容