SpringCloud gateway

server/2025/1/15 18:28:12/

Nacos:SpringCloud Nacos-CSDN博客 

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

认识网关 

什么是网关?

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

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

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

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

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

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

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

案例

项目初建

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

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

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

<?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 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

# 应用服务 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

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

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 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转发规则

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


http://www.ppmy.cn/server/117534.html

相关文章

基于SpringBoot的校园新闻网站设计与实现

需要项目源码请联系我&#xff0c;目前有各类成品 毕设 javaweb ssh ssm springboot等等项目框架&#xff0c;源码丰富。 专业团队&#xff0c;咨询就送开题报告&#xff0c;活动限时免费&#xff0c;有需要的朋友可以来留言咨询。 一、摘要 本论文主要论述了如何使用JAVA语言…

【白话树】之 二叉树

快速导航 一、二叉树的基本概念1、 二叉树定义2、常见术语3、基本操作1&#xff09;创建&#xff1a;2&#xff09;插入与删除&#xff1a; 4、常见类型1&#xff09;满二叉树&#xff08;完美二叉树&#xff09;2&#xff09;完全二叉树3&#xff09;完满二叉树4&#xff09;平…

supermap Iclient3d for cesium加载地形并夸大地形

先看效果图 这是没有夸张之前的都江堰 这是夸大五倍后的都江堰 下面展示代码 主要就是加载supermaponline的skt地形然后夸大 <template><div class"PartOneBox"><div id"cesiumContainer"></div></div> </template>…

22_图论中的高级数据结构

菜鸟&#xff1a;老鸟&#xff0c;我最近在处理一个网络节点数据的问题&#xff0c;发现代码运行得特别慢。你能帮我看看有什么优化的方法吗&#xff1f; 老鸟&#xff1a;当然可以。你处理的是图结构对吗&#xff1f;你是如何存储和操作这些节点的&#xff1f; 菜鸟&#xf…

websocket消息推送修改

WebSocket支持同时给app端和pc端发送消息 (1) WebSocket操作类 通过修改该类WebSocket可以进行同一用户多端的消息推送 Component Slf4j ServerEndpoint("/websocket/{userId}") public class WebSocket {//省略部分代码//1.增加app端标识private String APP_SESSIO…

说说synchronized的锁升级过程

在 JDK 1.6之前&#xff0c;synchronized 是一个重量级、效率比较低下的锁&#xff0c;但是在JDK 1.6后&#xff0c;JVM 为了提高锁的获取与释放效&#xff0c;,对 synchronized 进行了优化&#xff0c;引入了偏向锁和轻量级锁&#xff0c;至此&#xff0c;锁的状态有四种&…

JQuery:后台接收Json串与对象

一、接收对象 @RequestParam可以处理get 方式中queryString的值,也可以处理post方式中 body data的值。@RequestParam用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容,提交方式GET、POST。 <script src="http://libs.baidu.com/jquery/1.9.…

vue-router + el-menu

1. el-menu的router属性 在el-menu中有一属性&#xff1a;router&#xff0c;默认是false 1.1 使用默认配置&#xff0c;即false 这时候需要自己在点击子菜单的时候进行导航&#xff0c;在el-menu添加方法&#xff0c;里边有三个参数 index: 选中菜单项的 index,indexPath…