springcloud整合nacos、sentinal、springcloud-gateway,springboot security、oauth2总结

源码地址:下载地址
使用该架构的项目地址:下载地址

下面教大家整合nacos、sentinal、springcloud-gateway,springboot security、oauth2做一个分布式架构

1、第一步整合nacos

1、下载alibaba的nacos 下载地址,然后使用单机模式启动nacos

sh startup.sh -m standalone

启动之后登录 http://localhost:8848/nacos/#/login ,账号密码都是默认的nacos。

2、第二步建立业务项目结构

项目结构图片

3、第三步建立项目的入口(网关服务)

首先入口接口网关模块

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><parent><groupId>com.xyw.code</groupId><artifactId>xptx-gateway</artifactId><version>1.0.0</version></parent><groupId>com.xyw.code</groupId><artifactId>xptx-spring-gateway</artifactId><version>1.0.0</version><name>xptx-spring-cloud-gateway</name><description>spring-cloud-gateway网关服务</description><properties><java.version>1.8</java.version><swagger2.version>2.8.0</swagger2.version><xptx.version>1.0.0</xptx.version><spring-boot.version>2.1.8.RELEASE</spring-boot.version></properties><dependencies><!--nacos注册中心客户端--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--nacos配置中心客户端--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!--gateway 网关依赖,内置webflux 依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!--swagger2 --><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>${swagger2.version}</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>${swagger2.version}</version></dependency><dependency><groupId>com.xyw.code</groupId><artifactId>xptx-common-core</artifactId><version>${xptx.version}</version></dependency><dependency><groupId>com.xyw.code</groupId><artifactId>xptx-common-redis</artifactId><version>${xptx.version}</version></dependency><dependency><groupId>com.xyw.code</groupId><artifactId>xptx-auth-client</artifactId><version>${xptx.version}</version><exclusions><exclusion><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId></exclusion></exclusions></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

<font color=red>
集成网关的时候有个坑注意下,因为网关自带web,所以集成网关的时候不能携带任何api或者web的模块,不会启动会报错
</font>


设置好入口之后修改下application.yml文件设置下网关服务的入口和业务服务的入口

  routes:#        基础服务- id: xptx-system-base-server# lb代表从注册中心获取服务,且已负载均衡方式转发uri: lb://xptx-system-base-serverpredicates: # 路由条件,Predicate 接受一个输入参数,返回一个布尔值结果- Path=/sys/**filters:- SwaggerHeaderFilter- StripPrefix=1# 降级配置- name: Hystrixargs:name: fallbackfallbackUri: forward:/fallback#        授权服务- id: xptx-authuri: http://localhost:8001predicates:- Path=/auth/**filters:- ImageCodeFilter- RemoveRequestHeader=Origin- StripPrefix=1# 降级配置- name: Hystrixargs:name: fallbackcmdfallbackUri: forward:/fallback

然后有一点要注意的
网关和业务数据可以通过两种方式鉴权

1、服务器鉴权

首先业务数据集成xptx-common-auth模块拿到鉴权注解。之后的鉴权可以通过@PreAuthorize来实现。

例子

/*** 根据id删除菜单** @param id* @return*/@ApiOperation("删除菜单")@PreAuthorize("hasAuthority('sys:menu:delete')")@SysOperateLog(descrption = "删除菜单")@DeleteMapping("/{id}")public R deleteMenu(@PathVariable("id") Integer id) {return menuService.removeMenuById(id);}
2、网关那里鉴权

在网关那里实现一个全局拦截器去鉴权

package com.prex.gateway.filter;import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;import java.net.InetSocketAddress;
import java.nio.charset.StandardCharsets;
import java.util.Objects;/*** 调用鉴权*/
@Slf4j
@Component
public class AuthSignatureFilter implements GlobalFilter, Ordered {// 排除过滤的 uri 地址private static final String[] WHITE_LIST = {"/*/v2/api-docs", "/user/register", "/swagger-ui.html","/swagger-resources/**","/*/api-docs","/api/socket/**","/log"};private AntPathMatcher antPathMatcher = new AntPathMatcher();@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpRequest request = exchange.getRequest();String uriPath = request.getPath().toString();log.info("url:{}", uriPath);boolean action = false;for (String url : WHITE_LIST) {if (antPathMatcher.match(url, uriPath)) {action = true;break;}}// 跳过不需要验证的路径if (action) {return chain.filter(exchange);}String token = request.getHeaders().getFirst(HttpHeaders.AUTHORIZATION);if (null == token || token.isEmpty()) {ServerHttpResponse response = exchange.getResponse();//当请求不携带Token或者token为空时,直接设置请求状态码为401,返回InetSocketAddress remoteAddress = request.getRemoteAddress();String clientIp = Objects.requireNonNull(remoteAddress).getAddress().getHostAddress();log.info("非法请求,客户端IP:" + clientIp + "URL:" + request.getPath());JSONObject message = new JSONObject();message.put("code", HttpStatus.UNAUTHORIZED.value());message.put("msg", "非法请求");byte[] bits = message.toJSONString().getBytes(StandardCharsets.UTF_8);DataBuffer buffer = response.bufferFactory().wrap(bits);response.setStatusCode(HttpStatus.UNAUTHORIZED);//指定编码,否则在浏览器中会中文乱码response.getHeaders().add("Content-Type", "text/plain;charset=UTF-8");return response.writeWith(Mono.just(buffer));}ServerHttpRequest authorization = request.mutate().headers(httpHeaders -> {httpHeaders.add("Authorization", token);}).build();ServerWebExchange serverWebExchange = exchange.mutate().request(authorization).build();return chain.filter(serverWebExchange);}@Overridepublic int getOrder() {return -200;}
}

全局拦截器调用的是鉴权客户端,然后鉴权客户端可以通过feign去调用鉴权服务端来判断用户是否拥有这个权限。这就是大致简单的整合流程。

4、第三步建立项目的认证服务

认证服务分为两部分:

1:

一部分把认证服务作为一个jar包,目的是作为一个认证客户端给第三方引用(<font color='red'>这里有个坑,千万不能加入<artifactId>spring-boot-maven-plugin</artifactId>这个插件,因为这个插件会导致maven多moudle依赖找不到引入jar包依赖</font>)。

2:

就是一个鉴权服务,里面整合了spring-security和spring-oauth2。这两个大致作用是spring-security用来存储用户,通过用户鉴权来获取token。但是有些时候第三方服务想调用我们的接口,那我们为了不提供自己的账号密码给别人,因此就使用了oauth2,通过提供client_id和serect的方式来获取token,从而来被允许调用我们的服务。

获取token的链接:http://localhost:8002/auth/oauth/token?username=admin&password=admin&t=1571628400280&code=fzbz&grant_type=password&scope=server

总结

分布式项目整合一切以网关为入口,然后网关前缀分为业务项目的前缀和认证服务器前缀。最后网关还会有一个全局拦截器去拦截认证请求



喜欢的朋友记得点赞、收藏、关注哦!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/143745.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

828华为云征文 | 云服务器Flexus X实例,搭建上线前后端项目

828华为云征文 | 云服务器Flexus X实例&#xff0c;搭建上线前后端项目 项目搭建 演示使用华为云服务器Flexus X实例搭建上线前后端项目黑马vue电商后台管理系统 项目GitHub链接&#xff1a;https://github.com/Minori-ty/vue_shop.git 1、购买华为云 Flexus X 实例 Flexus云服…

搜索小车运动最短路径python代码实现

一、实验任务 场地中正方格代表障碍物&#xff0c;选取小车运动起点和终点。编程探究小车从起点运动到终点&#xff0c;总共有几种可行的路径&#xff08;路径不含重叠部分&#xff09;&#xff0c;同时找出最短路径并可视化。 二、实验思路 把场地抽象化为69的平面矩阵&…

基于Linux系统离线安装oracle数据库

注意事项&#xff1a; 在安装的时候多次涉及root用户和oracle用户的切换&#xff0c;请注意区分&#xff0c;本文已明显 一、环境准备 1、关闭防火墙 [rootlocalhost ~]# systemctl stop firewalld2、 禁用NetworkManager服务&#xff08;非必须&#xff09; [rootlocalhost …

4 路 4-20mA 电流/0-10V 电压转光纤

型号&#xff1a;MS-F155-AM 功能概述 MS-F155-AM 是将 4-20mA 电流转为光纤信号的模块&#xff0c;分发送和接收两个设备。发送模块将电流或者电压信号转变为光信号&#xff0c;通过光纤传输&#xff0c;接收端将光信号还原为电流或者电压信号。可以延长通信距离&#xff0c;最…

从零开始讲DDR(1)——DDR简介

一、DDR简介 DDR SDRAM&#xff08;Double Data Rate Synchronous DYNAMIC RAM&#xff09;中文名是&#xff1a;双倍数据速率同步动态随机存储器。 传统的SDRAM只在时钟信号的上升沿传输数据&#xff0c;而DDR可以同时在时钟的上升沿和下降沿传输数据&#xff0c;因此在同样的…

零信任安全架构--持续验证

随着网络安全威胁的不断演变&#xff0c;传统的“信任但验证”安全模式已无法应对现代复杂的攻击。零信任安全架构&#xff08;Zero Trust Architecture, ZTA&#xff09;应运而生&#xff0c;作为一种全新的安全理念&#xff0c;它彻底改变了企业的网络安全防护方式。核心思想…

windows查找端口号被占用

在很多开发的时候&#xff0c;可能端口号有被占用的情况&#xff0c;导致项目打不开。 用下面这个命令即可&#xff1a; 比如我的3000端口被占用&#xff0c;我找找哪个进程在占用我的3000端口号

JAVA惊喜连连无限可能沉浸式盲盒商城系统小程序源码

&#x1f381;惊喜连连&#xff0c;无限可能&#xff01;沉浸式盲盒商城系统&#xff0c;等你来探索&#x1f50d; &#x1f389;【开篇&#xff1a;盲盒热潮&#xff0c;席卷而来】&#x1f389; 在这个充满未知与惊喜的时代&#xff0c;盲盒文化正以前所未有的速度席卷全球…

Vue学习记录之五(组件/生命周期)

一、组件 在每一个.vue文件可以看作是一个组件&#xff0c;组件是可以复用的&#xff0c;每个应用可以看作是一棵嵌套的组件树。 在Vue3中&#xff0c;组件导入以后即可直接使用。 二、组件的生命周期 生命周期就是从诞生(创建)到死亡(销毁) 的过程。 Vue3 组合式API中(se…

Rocky 8.7 操作系统 安装部署 MySQL 5.7.32 验证测试

一、安装部署 主从服务器都需提前安装部署MySQL 5.7.32 数据库软件&#xff0c;本次选择采用二进制安装。 配置主从&#xff0c;要注意调整主备库server_id不能保持一致。 主库修改/etc/my.cnf文件&#xff0c;添加 server-id1log-binmysql-binbinlog-do-dbmsdbbinlog-ign…

java se 快速入门

文章目录 java se 快速入门Java 简介Java的优点jdk 和 jre安装jdk配置环境变量Java 语法快速入门程序入口文件名类规范 基本语法注释变量和常量输入输出条件语句循环语句 基本数据类型Java字符串常用方法字符串拼接java字节数组和字符串相互转化java字符数组和字符串相互转换ja…

传输层协议 —— TCP协议(上篇)

目录 1.认识TCP 2.TCP协议段格式 3.可靠性保证的机制 确认应答机制 超时重传机制 连接管理机制 三次握手 四次挥手 1.认识TCP 在网络通信模型中&#xff0c;传输层有两个经典的协议&#xff0c;分别是UDP协议和TCP协议。其中TCP协议全称为传输控制协议&#xff08;Tra…

torch.embedding 报错 IndexError: index out of range in self

文章目录 1. 报错2. 原因3. 解决方法 1. 报错 torch.embedding 报错&#xff1a; IndexError: index out of range in self2. 原因 首先看下正常情况&#xff1a; import torch import torch.nn.functional as Finputs torch.tensor([[1, 2, 4, 5], [4, 3, 2, 9]]) embedd…

游戏如何检测加速外挂

在游戏面临的众多外挂风险中&#xff0c;除了常见的内存修改挂、注入挂等作弊手段&#xff0c;黑灰产还常用「加速」手段实现作弊。 游戏安全风险分布占比图 「加速」顾名思义是指改变游戏内的速度。游戏在运行中需要以帧为单位播放画面&#xff0c;而计算每帧动画播放所需时间…

代码随想录算法训练营第3天|链表理论基础、203. 移除链表元素、 707.设计链表、 206.反转链表

目录 链表理论基础203. 移除链表元素1、题目描述2、思路3、code4、复杂度分析 707. 设计链表1、题目描述2、思路3、code 206. 反转链表1、题目描述2、思路3、code4、复杂度分析 链表理论基础 ❤️链表增删的时间复杂度都是 O ( 1 ) O(1) O(1)&#xff0c;适合动态增删&#xf…

C语言进阶【4】---数据在内存中的存储【1】(你不想知道数据是怎样存储的吗?)

本章概述 整数在内存中的存储大小端字节序和字节序判断练习1练习2练习3练习4练习5练习6 彩蛋时刻&#xff01;&#xff01;&#xff01; 整数在内存中的存储 回忆知识&#xff1a;在讲操作符的那章节中&#xff0c;对于整数而言咱们讲过原码&#xff0c;反码和补码。整数分为有…

【初阶数据结构】一文讲清楚 “堆” 和 “堆排序” -- 树和二叉树(二)(内含TOP-K问题)

文章目录 前言1. 堆1.1 堆的概念1.2 堆的分类 2. 堆的实现2.1 堆的结构体设置2.2 堆的初始化2.3 堆的销毁2.4 添加数据到堆2.4.1 "向上调整"算法 2.5 从堆中删除数据2.5.1 “向下调整”算法 2.6 堆的其它各种方法接口函数 3. 堆排序3.1 堆排序的代码实现 4. TOP-K问题…

CWFED:自然灾害检测数据集(猫脸码客 第192期)

Cyclone Wildfire Flood Earthquake Database 在自然灾害频发的今天&#xff0c;准确、及时地获取并分析相关数据对于灾害预防、预警及响应至关重要。为此&#xff0c;Cyclone Wildfire Flood Earthquake Database&#xff08;以下简称CWFE Database&#xff09;应运而生&…

PostgreSQL 的log_hostname 参数测试

PostgreSQL 的log_hostname 参数测试 log_hostname 是 PostgreSQL 配置文件 (postgresql.conf) 中的一个参数&#xff0c;用于控制是否在日志条目中记录客户端主机名。默认情况下&#xff0c;PostgreSQL 只记录客户端的IP地址&#xff0c;而 log_hostname 参数允许数据库管理员…