spring boot + gateway + nacos 网关统一代理
spring boot + gateway + nacos(个人学习)
- demo构思
- 项目构建
- 父工程
- 通用工具类 commons
- 网关模块
- 登录模块
demo构思
个人打算完成一个项目架构:具体使用 spring boot + cloud + nacos + mybatis-plus + mysql。现处于摸索阶段。从零开始搭建学习。目前已完成网关统一代理,服务注册。暂时不打算用 nacos 做配置中心,直接使用本地配置。
项目构建
父工程
父工程不用写代码,所以删掉 src 那些文件。具体 pomx.ml 文件如下配置:
spring boot 引用
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.5.RELEASE</version><relativePath/></parent>
各依赖版本配置信息,也可以直接写在对应依赖中,这么做是为了方便版本统一管理,实际上应该新建一个 dependencies 模块做通用的依赖管理。
<properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UFT-8</project.reporting.outputEncoding><spring-cloud.version>Hoxton.SR3</spring-cloud.version><spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.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>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>
通用工具类 commons
暂时只写了一个全局响应的统一处理,其他的通用工具类待完善。
新建 modules
工具类不需要作为去写其他业务代码。提供功能给其他模块去使用。
这里表示了 commons 模块引用的父工程是第一层。
<packaging>pom</packaging><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.11.2</version></dependency><dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-core</artifactId></dependency></dependencies>
全局返回对象
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;import java.io.Serializable;/*** @Author: WIN11* @Date: 2022/2/25* @Time: 10:05* @Version: 1.0* @Description:*/
@Data
public class ResponseResult<T> implements Serializable {private static final long serialVersionUID = 5085236955494285994L;/*** 状态码*/private Integer code;/*** 消息*/private String message;/*** 返回对象*/@JsonInclude(JsonInclude.Include.NON_NULL)private T data;public ResponseResult() {super();}public ResponseResult(Integer code) {super();this.code = code;}public ResponseResult(Integer code, String message) {super();this.code = code;this.message = message;}public ResponseResult(Integer code, Throwable throwable) {super();this.code = code;this.message = throwable.getMessage();}public ResponseResult(Integer code, T data) {super();this.code = code;this.data = data;}public ResponseResult(Integer code, String message, T data) {super();this.code = code;this.message = message;this.data = data;}public T getData() {return data;}public void setData(T data) {this.data = data;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + ((data == null) ? 0 : data.hashCode());result = prime * result + ((message == null) ? 0 : message.hashCode());result = prime * result + ((code == null) ? 0 : code.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj) {return true;}if (obj == null) {return false;}if (getClass() != obj.getClass()) {return false;}ResponseResult<?> other = (ResponseResult<?>) obj;if (data == null) {if (other.data != null) {return false;}} else if (!data.equals(other.data)) {return false;}if (message == null) {if (other.message != null) {return false;}} else if (!message.equals(other.message)) {return false;}if (code == null) {return other.code == null;} else return code.equals(other.code);}
}
网关模块
现在的网关只是实现了统一的代理转发,没有实现统一鉴权。关于鉴权,可以每个服务自己单独鉴权或者网关统一鉴权,个人倾向于使用网关统一鉴权。
<parent><artifactId>myproject</artifactId><groupId>org.example</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>gateway</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies>
注意:这里不需要使用 spring-boot-start-web 因为 gateway 使用的是 webflux 去启动的。所以在 spring-cloud-starter-gateway 中已经整合了。并且这里还容易出现 webflux 和 spring boot 的版本对应问题,第一遍写的时候报错了,没有想到是版本对应问题。
例如:这里看一下就好了不用修改
<groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.3.RELEASE</version>
spring-cloud 使用的是 Hoxton.SR3 就导致报错了。一直报关于 webflux 的问题
解决方法:
<groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.3.RELEASE</version>
升到
<groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.5.RELEASE</version>
开始编写网关模块的内容:
网关只需要一个启动类就好了
@EnableDiscoveryClient
把网关服务注册到 nacos
新增或编辑 application.yml 文件
server:port: 8900
spring:application:name: gatewaycloud:nacos:discovery:server-addr: 127.0.0.1:8848password: nacosusername: nacosgateway:routes:# 基于注册中心的路由策略- id: login-server# 基于lb负载均衡形式转发,后面地址为注册中心的服务名称uri: lb://login-server# 匹配规则predicates:- Path=/login/**filters:# 转发请求时去掉1级前缀,eg:http://localhost:9999/login/test?token=111中间的member字段会被清掉- StripPrefix=1discovery:# 路由访问方式:http://Gateway_HOST:Gateway_PORT/大写的serviceId/**,其中微服务应用名默认大写访问locator:# 是否与服务发现组件进行结合,通过 serviceId(必须设置成大写) 转发到具体的服务实例。默认为false,设为true便开启通过服务中心的自动根据 serviceId 创建路由的功能。enabled: true# 允许通过模块名小写代理lower-case-service-id: true
有关 gateway 的 routes 的其他配置方案这里暂时不做考虑,动态路由这类后面在考虑。具体里面的路由配置操作实现的效果和该怎样使用,等下个模块在解释。现在可以启动网关模块,注册到 nacos 上。
登录模块
新建一个 login 模块,现在没有实现具体的登陆、退出等功能,只是为了演示网关的统一代理、通用模块的使用。
pom.xml
<parent><artifactId>myproject</artifactId><groupId>org.example</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>login</artifactId><packaging>jar</packaging><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.7.0</version></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.2.0</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId><exclusions><!-- 排除 tomcat-jdbc 以使用 HikariCP --><exclusion><groupId>org.apache.tomcat</groupId><artifactId>tomcat-jdbc</artifactId></exclusion></exclusions></dependency><!-- 引用自己写的 commons 模块 --><dependency><groupId>org.example</groupId><artifactId>commons</artifactId><version>1.0-SNAPSHOT</version><scope>compile</scope></dependency><!-- swagger --><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.9.2</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins><resources><resource><directory>src/main/java</directory><!--包含了src/main/java目录下的所有xml资源配置文件--><includes><include>**/*.xml</include></includes></resource><resource><directory>src/main/resources</directory><includes><!--包含了src/main/resources目录下的所有资源配置文件,有别的格式的配置文件时,不要写成**/*.xml--><include>**/*</include></includes><filtering>false</filtering></resource></resources></build>
application.yml
server:port: 9000
spring:cloud:nacos:discovery:server-addr: localhost:8848username: nacospassword: nacosapplication:name: login-serverdatasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTCusername: rootpassword: roothikari:minimum-idle: 5maximum-pool-size: 15idle-timeout: 180000auto-commit: trueconnection-timeout: 30000connection-test-query: SELECT 1logging:level:root: info
mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImplmapper-locations: classpath*=/org/example/mapper/*.xmltype-aliases-package: org.example.mapper
具体数据库、生成的通用的entity、mapper、services 这些就暂时不考虑放上来了太多了。只用一个测试的 controller 来演示一下网关的统一代理。
package org.example.controller;import lombok.AllArgsConstructor;
import org.example.entity.User;
import org.example.hh.global.ResponseResult;
import org.example.services.UserService;
import org.springframework.web.bind.annotation.*;/*** @Author: WIN11* @Date: 2022/2/24* @Time: 10:34* @Version: 1.0* @Description:*/
@RequestMapping("/user")
@RestController
@AllArgsConstructor
public class LoginController {private final UserService userService;@PostMapping("/login")public ResponseResult login(){User user = new User();return new ResponseResult(200, "成功", user);}@GetMapping("/find")public ResponseResult find() {return new ResponseResult(200, "找到一个人", new User());}@PostMapping("/register")public ResponseResult register(@RequestBody User user) {user.setId(null);return userService.save(user) ? new ResponseResult(200) : new ResponseResult(200, "注册失败");}@GetMapping("/test")public ResponseResult getOne(){return new ResponseResult(200, "成功", "结果");}
}
ResponseResult 就是 commons 模块 中的工具类。
启动类
然后启动 login 模块,在 nacos 上能看到注册上去了
网关统一代理
正常情况下去访问接口是直接:http://ip地址:端口号/路径。
http://localhost:9000/user/find
使用网关后就可以做到统一代理
http://localhost:8900/login/user/find
之后无论有多少的服务,都可以在路由中去定义,让网关统一代理,前端就只需要用到网关的 ip 地址和端口号就好了,具体的地址和端口号不需要关心。
解释一下:
gateway:routes:### 基于注册中心的路由策略- id: login-server#### 基于lb负载均衡形式转发,后面地址为注册中心的服务名称uri: lb://login-server### 匹配规则predicates:- Path=/login/**filters:# 转发请求时去掉1级前缀,eg:http://localhost:9999/login/test?token=111中间的member字段会被清掉- StripPrefix=1
网关把请求接口
http://localhost:8900/login/user/find
替换成了
http://localhost:9000/user/find
spring boot + gateway + nacos 网关统一代理相关推荐
- Spring Cloud Gateway实现网关统一鉴权,网关统一Token认证
需求背景 在微服务的场景下,采用了Spring Cloud Oauth2进行token的管理,实现认证和授权,在这下背景下,有两种解决方案: 网关统一鉴权 此模式适用于网关下的所有模式都是通过一种模式 ...
- spring cloud gateway nacos 网关设置
前期准备:可参考上一篇,spring cloud nacos 服务提供.服务消费(Feign.RestTemplate)及Hystrix熔断设置 1.下载安装 Nacos 服务中心(下载地址 http ...
- spring cloud gateway nacos搭建动态路由
spring cloud gateway nacos搭建动态路由 一.环境 开发工具:IntelliJ Idea JDK 1.8 Spring boot 2.3.12.RELEASE spring c ...
- Spring cloud Gateway 服务网关 实战
Spring cloud Gateway 服务网关 一.简介 优点: 特性: 总结: 二.核心概念 三.路由规则 1.Path 2.Query 3.Method 4.Datetime 5.Romote ...
- Spring Boot整合Nacos时遇到 java.lang.IllegalStateException: Context has been already given a name 的解决办法
问题概述 在进行项目开发过程中,通过Spring Boot整合Alibaba Nacos的服务注册与发现和配置中心时,遇到个梗,启动时打印出一串错误日志信息 " Failed to rena ...
- Spring Cloud —— Gateway 服务网关
导航 一.什么是服务网关 二.业界常见网关组件 三.Spring Cloud Gateway 四.Gateway 快速入门 4.1 创建 gateway 服务 4.2 添加 gateway 依赖和 n ...
- 微服务接入oauth2_微服务权限终极解决方案,Spring Cloud Gateway+Oauth2实现统一认证和鉴权!...
最近发现了一个很好的微服务权限解决方案,可以通过认证服务进行统一认证,然后通过网关来统一校验认证和鉴权.此方案为目前最新方案,仅支持Spring Boot 2.2.0.Spring Cloud Hox ...
- 使用Zuul和Spring Boot创建API网关
介绍 使用微服务时,通常具有对系统的统一访问点(也称为API Gateway ). 消费者仅与API网关交谈,而不与服务直接交谈. 这掩盖了您的系统由多个较小的服务组成的事实. API网关还可帮助解决 ...
- spring cloud gateway+nacos 服务下线感知延迟,未及时出现503,请求依然转发到下线服务
spring cloud gateway服务下线感知延迟,未及时出现503 1.场景描述 2.分析 2.1定位问题 3.解决方案 本篇算是配合之前的一篇了.整体问题是gateway对下线服务感知延迟, ...
- Spring Boot中使用AOP统一处理Web请求日志
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是Spring框架中的一个重要内容,它通 ...
最新文章
- 加锁查询 FOR UPDATE 解决表格查询极慢的问题
- openwrt dhcp不分配_【装维技巧】DHCP工作原理详解(上)
- JAVA 判断其是否为合法标识符
- 年底怎样才能“被评优”
- php文件运行的域名怎么改,discuz论坛更换域名,详细文件修改步骤
- 微软caffe-SSD的训练和预测(windows cpu)
- 电脑显示器不亮主机正常_电脑主机已开机 显示屏却不亮(看完秒懂)
- NLP人机对话与落地案例分享
- 计算机内 云盘图标,如何关闭我的电脑中百度网盘图标
- vue中echarts实现甘特图
- pc端vue登录如何调用软键盘_vue.js怎样隐藏软键盘
- 1个英文字母、1个汉字、标点符号各占几个字节?以及文件的编码方式查看
- 果断型性格分析,果断型人格的职业发展
- kafka安装和部署
- linux mint安装sbt及环境配置
- Storm部分:Storm Grouping -- 数据流分组(各种数据分发策略的练习)【Java版纯代码】
- 推荐的几本数学书【by DaHua Lin】
- 平方求和、立方求和公式
- html:对于拼多多网页的简单制作
- PAT A1110 Complete Binary Tree ——雨打梨花深闭门