前面的基础都搭建好了,网关自然是不可少的一个组件了。

有了网关就可以统一暴露在外的端口,将其余服务放在防火墙内,网关接口暴露在外,也增加了安全性。

之前搭建过spring-security+jwt+zuul的权限认证与路由转发,由于zuul不在停更,所以转向功能更强大的gateway,但是gateway使用的并非是stater-web,所以自然也就没有HttpServletRequest也就没法直接替代zuul,这样gateway调用其他服务就会略微复杂,下面我们先来搭建gateway并解决服务之间调用问题。

创建一个新项目,引入gateway,因为gateway的webflux与spring-webmvc有冲突,所以不用引入stater-web

<?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.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.cloudalibaba</groupId>
    <artifactId>gateway</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>gateway</name>
    <description>Demo project for Spring Boot</description>

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

    <dependencies>
        <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>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </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>

        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.8</version>
            <scope>provided</scope>
        </dependency>
        <!--geteway-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <!--feign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</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>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

springcloud和alibabacloud的版本跟之前保持一致。

创建完项目,目录结构,com.cloudalibaba.gateway下的目录是我创建的,一会介绍

启动类加启动注解

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients

然后最重要的环节来了,配置yml,因为是网关,所以经常修改,把大部分配置文件放在nacos中配置比较方便。

创建bootstrap.yml,添加一些基本配置。

server:
  port: 9102
spring:
  application:
    name: gateway
  main:
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        #此处的namespace是discovery服务对应的命名空间,与config不同
        #namespace: b7d26021-28b5-42d1-b36d-737a818a2146
      config:
        server-addr: localhost:8848
        file-extension: yaml
        #此处只是对应config的命名空间
        #namespace: b7d26021-28b5-42d1-b36d-737a818a2146
    gateway:
      discovery:
        locator:
          #表示将请求路径的服务名配置改成小写  因为服务注册的时候,向注册中心注册时将服务名转成大写的了
          lowerCaseServiceId: true
          #表示gateway开启服务注册和发现功能,
          #并且spring cloud gateway自动根据服务发现为每一个服务创建了一个router,这个router将以服务名开头的请求路径转发到对应的服务
          enabled: true
      httpclient:
        response-timeout: 5000
        connect-timeout: 5000
  profiles:
    active: router
ribbon:
  ReadTimeout: 120000
  ConnectTimeout: 120000

首先nacos注册中心必须打开,然后启动项目,并启动之前搭建的,nacos,nacos2,server-one。

进去nacos注册中心,添加gateway的配置文件。

这个是我配置好的,调用服务。

代码

spring:
    cloud:
        gateway:
            routes:
            - id: nacos-server
              uri: lb://nacos-server #代表从注册中心获取服务,且以lb(负载均衡)的方式转发
              predicates:             #断言
              - Path=/nacos-server/**     #表示将以/provider/**开头的请求转发到uri为lb://nacos-server的地址上
              filters:
              - StripPrefix=1 #1为去掉path的/provider
            - id: server-one
              uri: lb://server-one #代表从注册中心获取服务,且以lb(负载均衡)的方式转发
              predicates:             #断言
              - Path=/server-one/**     #表示将以/provider/**开头的请求转发到uri为lb://nacos-server的地址上
              filters:
              - StripPrefix=1 #1为去掉path的/server-one

切记,routes是数组,- id中的-必须要与routes缩进相同,不然可能会出错。所有参数缩进按我这个来就行,如果是在项目中配置yml缩进可能要改改。但是也routes下的不用改,切记。

这样的话就可以通过网关进行服务调用了。因为uti中使用的是lb所以开启了负载均衡。

下一篇会说gateway结合安全框架使用,也就是改造之前的springsecurity+jwt+zuul;

之前搭建springsecurity+jwt+zuul请看这

https://blog.csdn.net/qq_41755287/article/details/106425890

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐