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也解决了跨域的问题。

相关推荐
一一程序3 小时前
Thinkphp 使用workerman消息实现消息推送完整示例
websocket·gateway·thinkphp·workerman
开着拖拉机回家3 天前
【Ambari】使用 Knox 进行 LDAP 身份认证
大数据·hadoop·gateway·ambari·ldap·knox
BothSavage4 天前
Knife4j在Gateway下的URI优化以及热刷新
windows·gateway
壹佰大多5 天前
【spring-cloud-gateway总结】
java·spring·gateway
龙哥·三年风水5 天前
workman服务端开发模式-应用开发-后端api推送修改二
分布式·gateway·php
龙哥·三年风水6 天前
workman服务端开发模式-应用开发-后端api推送修改一
分布式·gateway·php
Hello Dam6 天前
面向微服务的Spring Cloud Gateway的集成解决方案:用户登录认证与访问控制
spring cloud·微服务·云原生·架构·gateway·登录验证·单点登录
小笨猪-6 天前
统⼀服务⼊⼝-Gateway
java·spring cloud·微服务·gateway
bohu836 天前
通过gateway实现服务的平滑迁移
gateway·平滑·weight
岁月变迁呀6 天前
Spring Cloud Gateway 源码
java·spring·spring cloud·gateway