SpringCloud gateway

Nacos:SpringCloud Nacos-CSDN博客

*****************************************************

认识网关

什么是网关?

顾明思议,网关就是网络的关口。数据在网络间传输,从一个网络传输到另一网络时就需要经过网关来做数据的路由 和转发以及数据安全的校验

更通俗的来讲,网关就像是以前园区传达室的大爷。

  • 外面的人要想进入园区,必须经过大爷的认可,如果你是不怀好意的人,肯定被直接拦截。

  • 外面的人要传话或送信,要找大爷。大爷帮你带给目标人。

现在,微服务网关就起到同样的作用。前端请求不能直接访问微服务,而是要请求网关

  • 网关可以做安全控制,也就是登录身份校验,校验通过才放行

  • 通过认证后,网关再根据请求判断应该访问哪个微服务,将请求转发过去

案例

项目初建

新建一个springboot项目,导入如下依赖

把src删掉后,目录结构是这样的

将pom.xml里面的一些不必要的东西去掉(build dependencies),这个pom文件将作为parent来管理子模块的依赖

XML 复制代码
<?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>
    <groupId>com.example</groupId>
    <artifactId>demo-gateway02</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo-gateway02</name>
    <description>demo-gateway02</description>
    <properties>
        <java.version>17</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>3.0.2</spring-boot.version>
        <spring-cloud-alibaba.version>2022.0.0.0-RC2</spring-cloud-alibaba.version>
        <spring-cloud.version>2022.0.0-RC2</spring-cloud.version>
    </properties>
    <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>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.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>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

</project>

user-service模块

新建一个user-service模块,导入需要的依赖

修改pom文件 (去掉properties,dependence management 引入parent)

XML 复制代码
<?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>
    <groupId>com.example</groupId>
    <artifactId>user-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>user-service</name>
    <description>user-service</description>
    
<!--    引入parent的三坐标-->
    <parent>
        <groupId>com.example</groupId>
        <artifactId>demo-gateway02</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>


    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>17</source>
                    <target>17</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <mainClass>com.example.UserServiceApplication</mainClass>
                    <skip>true</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

在parent的pom文件下修改打包方式为pom 并标记modules

注册nacos服务

user-service的端口号为8090

XML 复制代码
# 应用服务 WEB 访问端口
server.port=8090

# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
spring.application.name=user-service
# Nacos认证信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
#虚拟机的ip为192.168.168.168
spring.cloud.nacos.discovery.server-addr=192.168.168.168:8848  
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public

写一个控制器,用于等下测试

java 复制代码
package com.example.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
@RequestMapping("/home")
public class UserController {
    @GetMapping("hello")
    public String hello() {
        return "this is user-service";
    }
}

order-service模块

order-service模块的创建如法炮制

parent的pom也要知道它的存在

注册nacos服务 ,服务的端口号为8091

控制器

做完这些工作后,项目的结构如下

试着启动order-service 和 user-service 在nacos可以看到注册的两个服务

gateway-service模块

新建一个gateway-service ,导入如下依赖

不能导入web的起步依赖,因为web里面默认使用tomcat服务器,gateway自带了netty服务器,两者会冲突

需要额外导入loadbalancer 用于负载均衡

gateway的pom文件如下

XML 复制代码
<?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>
    <groupId>com.example</groupId>
    <artifactId>gateway-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>gateway-service</name>
    <description>gateway-service</description>
    <parent>
        <groupId>com.example</groupId>
        <artifactId>demo-gateway02</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <dependencies>

        <!--负载均衡依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</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>
        </dependency>
    </dependencies>


    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>17</source>
                    <target>17</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <mainClass>com.example.GatewayServiceApplication</mainClass>
                    <skip>true</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

</project>

parent的pom文件也要知道它的存在

在application.properties中注册nacos服务,编写gateway转发规则

XML 复制代码
# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
spring.application.name=gateway-service

# Nacos认证信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=192.168.168.168:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public

# gateway 请求配置

# 允许跨域
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowed-origin-patterns=*

spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedHeaders=*
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowCredentials=true

# 允许以下请求方式的请求
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedMethods[0]=GET
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedMethods[1]=POST
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedMethods[2]=PUT
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedMethods[3]=DELETE
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedMethods[4]=OPTIONS
spring.cloud.gateway.discovery.locator.enabled=true


# 配置gateway的转发规则


# user-service
# id 需要跟服务注册中心一致
spring.cloud.gateway.routes[0].id=user-service
# uri值需要跟服务注册中心一致
spring.cloud.gateway.routes[0].uri=lb://user-service
# 路径里面带user就需要转发到user-service
spring.cloud.gateway.routes[0].predicates[0]=Path=/user/**
# 移除前缀
spring.cloud.gateway.routes[0].filters[0]=StripPrefix=1

# order-service
# id 需要跟服务注册中心一致
spring.cloud.gateway.routes[1].id=order-service
# uri值需要跟服务注册中心一致
spring.cloud.gateway.routes[1].uri=lb://order-service
# 路径里面带order就需要转发到order-service
spring.cloud.gateway.routes[1].predicates[0]=Path=/order/**
# 移除前缀
spring.cloud.gateway.routes[1].filters[0]=StripPrefix=1

最终的目录结构如下

测试

现在启动 user-service order-service gateway-service,在nacos的服务列表中可以看到我们注册的3个服务

现在访问一下user-service和order-service的控制器,检查是否能够正常访问(注意看端口)

现在我们通过网关访问一下这两个模块,可以看到成功访问了

总结

由此案例,我们可以感受到gateway带给我们的方便。有了gateway,前端就只需要请求8080端口,以模块进行路径的书写,就能访问所有的后端接口了,同时gateway也解决了跨域的问题。

相关推荐
云来喜2 天前
关于Spring Cloud Gateway中 Filters的理解
java·spring boot·gateway
小小小小关同学2 天前
【Gateway】网关服务快速上手
java·开发语言·gateway
小小小小关同学2 天前
【Gateway】Gateway Filter Factories
网络·gateway
两仪式quq2 天前
服务网关Gateway快速入门
服务器·网络·gateway
szc17674 天前
Gateway学习笔记
笔记·学习·gateway
huaqianzkh7 天前
什么是API网关(API Gateway)?
架构·gateway
亚林瓜子7 天前
Spring Cloud Gateway中的常见配置
spring·spring cloud·gateway
潘多编程7 天前
Gateway Timeout504: 网关超时的完美解决方法
gateway
lamb张7 天前
nginx搭配gateway的集群配置
网络·nginx·gateway