pig 权限管理开源项目学习
pig 源码 https://github.com/pig-mesh/pig
文档在其中,前端在文档中,官方视频教学也在文档中有。
第一次搭建,建议直接去看单体视频,照着做即可,需 mysql,redis 基础。
文章目录
- 项目结构
- Maven 多模块项目
- pig-boot 启动核心模块
- 总 profile
- pig-auth 实现认证和授权
- pig-gateway API 网关
- Nacos
- 启动 Nacos
- Spring Cloud
- Spring Cloud Gateway
- pig-upms 核心业务
- 项目交互细节
- 验证码
项目结构
这是典型的 Spring Boot 微服务项目

- auth : authentication 身份验证
- common 公共的、通用的
- gateway 网关
- upms : user permission management system 用户权限管理系统
- visual : visualization 可视化
- pom : project object model , Maven的项目对象模型
Maven 多模块项目
聚合项目(Aggregator Project)指的是一个 父项目(Parent POM),它不包含实际代码,只是统一管理多个子模块(Submodule)
pig/pom.xml 聚合
明确聚合的子模块:
<modules><module>pig-register</module><module>pig-gateway</module><module>pig-auth</module><module>pig-upms</module><module>pig-common</module><module>pig-visual</module>
</modules>
<dependencyManagement> 统一管理依赖版本
pluginManagement 统一插件版本
profiles 支持不同构建环境
这里就对应 idea 右边 maven 里的 profiles
<!-- --><profiles><profile> <!-- 代表一个特定的构建配置集合 --><id>cloud</id> <!-- 唯一标识符 --><properties> <!-- 定义一组属性 --><!-- 环境标识,需要与配置文件的名称相对应 --> <profiles.active>dev</profiles.active> <!-- 当前激活的环境为 dev --><!-- 设置 Nacos 注册中心的用户名和密码 --><nacos.username>nacos</nacos.username> <nacos.password>nacos</nacos.password></properties><activation><!-- 默认环境 --><activeByDefault>true</activeByDefault></activation></profile><profile><id>boot</id><modules> <!-- 激活时要包含的模块 --><module>pig-boot</module></modules></profile>
pig-boot 启动核心模块
SpringBootApplication 注解是
@Configuration // ※ 使 spring boot 默认扫描其上级和同级的子包
@EnableAutoConfiguration
@ComponentScan
的组合。
项目结构是一个 多模块 Maven 工程
pig/pom.xml中,已经把子模块都聚合进来了(见上文):

而 @ComponentScan 默认就是从 com.pig.boot 扫描其“上级和同级的子包” (这里是 com.pig4cloud.pig )
因此只要它们的包路径是 com.pig 开头,Spring Boot 默认就能扫描到!
总 profile
Spring Boot 会加载所有依赖模块中的 resources 目录下的配置文件,合并成一个配置环境,再根据 spring.profiles.active 去选择性加载 profile 文件。
无论模块是 pig-boot、pig-gateway 还是别的,只要这个模块是当前应用启动时依赖的模块,并且里面有resources/application.yml(或 .properties),Spring Boot 就会统一加载。
如果有多个模块都有 application.yml,Spring Boot 会合并它们的配置(后加载的覆盖前面的,或者由 @Order、@PropertySource 等控制顺序)。

pig-auth 实现认证和授权
使用了 Spring Security 和 OAuth2
pig-gateway API 网关
过滤器会对路径进行修改,从而转发到对应的微服务:

路由配置 resources/application.yml:

配置了服务器端口,而网关信息由 Nacos 读入
.yaml 文件,一种数据序列化格式
阅读提示:
下面的 server: port: 等价于 server.port
server:port: 9999 # 服务器端口号spring:application:name: @artifactId@ # 应用名称,会被替换为pig/pom.xml的同名标记cloud:nacos:username: @nacos.username@password: @nacos.password@discovery:server-addr: ${NACOS_HOST:pig-register}:${NACOS_PORT:8848} # 配置 Nacos 服务发现的服务器地址watch:enabled: true # 启用服务发现的监听watch-delay: 1000 # 监听的延迟时间msconfig: # 配置 Nacos 作为配置中心的服务器地址server-addr: ${spring.cloud.nacos.discovery.server-addr} # . 即 :config:import: ## Spring 应用从 Nacos 配置中心导入配置文件 ##- optional:nacos:application-@profiles.active@.yml- optional:nacos:${spring.application.name}-@profiles.active@.yml
Nacos
Naming and Configuration Service
一个服务发现和配置管理的平台
- 集中管理微服务的配置信息,无需重启应用即可使配置生效
- 允许微服务在 Nacos 中进行注册,其他服务可以通过 Nacos 发现并获取到这些已注册服务的实例信息,从而实现服务间的调用。
启动 Nacos

阅读 pig-gateway 的配置文件:


spring:cloud:gateway:locator:enabled: trueroutes:# 认证中心- id: pig-authuri: lb://pig-authpredicates:- Path=/auth/**#UPMS 模块- id: pig-upms-bizuri: lb://pig-upms-bizpredicates:- Path=/admin/**filters:# 限流配置- name: RequestRateLimiterargs:key-resolver: '#{@remoteAddrKeyResolver}'redis-rate-limiter.replenishRate: 100redis-rate-limiter.burstCapacity: 200# 代码生成模块- id: pig-codegenuri: lb://pig-codegenpredicates:- Path=/gen/**# 代码生成模块- id: pig-quartzuri: lb://pig-quartzpredicates:- Path=/job/**# 固定路由转发配置 无修改- id: openapiuri: lb://pig-gatewaypredicates:- Path=/v3/api-docs/**filters:- RewritePath=/v3/api-docs/(?<path>.*), /$\{path}/$\{path}/v3/api-docs
Spring Cloud
Spring Cloud 是一整套用来构建和管理“分布式微服务系统”的工具集。
「微服务系统的全家桶」
-
传统单体项目:一个项目包含了所有功能,部署在一个服务里。
-
微服务架构:把系统拆成多个独立的小服务(例如用户服务、订单服务、商品服务),每个服务都可以独立部署、独立开发、独立扩展。
拆了之后服务间怎么交互?!:
| 问题 | 举例 |
|---|---|
| 服务之间怎么通信? | A 服务怎么访问 B 服务? |
| 服务地址怎么发现? | B 服务的 IP 是谁?端口是多少? |
| 服务挂了怎么办? | 有没有熔断机制? |
| 用户请求怎么统一入口? | 所有请求能不能先经过一个地方统一鉴权、限流? |
| 配置这么多服务,怎么管理? | 能不能有一个配置中心? |
Spring Cloud 核心模块:
| 模块 | 作用 | 类比 |
|---|---|---|
| Spring Cloud Gateway | 网关,统一请求入口、路由、限流 | 高速公路收费站 |
| Nacos / Eureka | 注册中心,服务自动注册发现 | 电话簿/联系人列表 |
| OpenFeign | 服务调用客户端(HTTP) | 拨电话的工具 |
| Hystrix / Sentinel | 熔断限流,防止雪崩 | 跌倒保护垫 |
| Config | 配置中心,统一配置管理 | 云端配置文件 |
| Bus | 消息总线,配置变更通知 | 群发消息 |
| Sleuth + Zipkin | 链路追踪,查看请求全流程 | 快递跟踪系统 |
Spring Cloud Gateway
Spring Cloud Gateway 是 Spring 官方提供的一个微服务网关组件,用于:
- 统一入口:所有请求都先经过网关
- 路由转发:根据路径、请求头、参数等,把请求转发到对应的微服务
- 权限校验、限流、熔断降级等
通俗讲:就像超市收银台,你不同商品(服务)都通过一个地方集中收银(请求都先走网关)。
上述.yml配置中
spring:cloud:gateway:locator:enabled: true # 动态注册服务(结合 nacos、eureka 等注册中心)routes: # 静态配置路由列表- id: pig-authuri: lb://pig-authpredicates:- Path=/auth/**
routes 就是我们最关注的内容,每一个 - 项目就是一个微服务的路由规则。
- id 唯一标识
- uri 转发的目标服务。lb:// 表示走注册中心(如 Nacos)进行负载均衡
- predicates 匹配路径才会路由,比如 /auth/** 请求才转发
- locator.enabled=true 开启服务发现的自动路由,根据服务自动生成 lb://pig-auth 路由 (如果rotues里有,优先用静态配置的)
- filters 可选:对请求进行增强,如限流、鉴权、改写路径等
pig-upms 核心业务
- Controller :对外提供接口
- Service :封装具体业务逻辑
- Mapper :与数据库交互
项目交互细节

验证码

Request URL:
http://localhost:8888/api/admin/code/image?randomStr=477ba151-80ab-43cf-b70b-a5077dd4f919
Request Method:
GET
Status Code:
200 OK
通过路径找到对应代码:

为什么前面有 /api/admin 呢,见上文 pig-gataway 网关介绍
相关文章:
pig 权限管理开源项目学习
pig 源码 https://github.com/pig-mesh/pig 文档在其中,前端在文档中,官方视频教学也在文档中有。 第一次搭建,建议直接去看单体视频,照着做即可,需 mysql,redis 基础。 文章目录 项目结构Maven 多模块项…...
设计模式:依赖倒转原则 - 依赖抽象,解耦具体实现
一、为什么用依赖倒转原则? 在软件开发中,类与类之间的依赖关系是架构设计中的关键。如果依赖过于紧密,系统的扩展性和维护性将受到限制。为了应对这一挑战,依赖倒转原则(Dependency Inversion Principle,…...
探秘Transformer系列之(26)--- KV Cache优化 之 PD分离or合并
探秘Transformer系列之(26)— KV Cache优化 之 PD分离or合并 文章目录 探秘Transformer系列之(26)--- KV Cache优化 之 PD分离or合并0x00 概述0x01 背景知识1.1 自回归&迭代1.2 KV Cache 0x02 静态批处理2.1 调度策略2.2 问题…...
鸿蒙5.0 非桌面页面,设备来电后挂断,自动返回桌面
1.背景 其实在Android上面打开一个应用,然后设备来电后挂断应该是返回到前面打开的这个应用的,但是在鸿蒙里面现象是直接返回桌面,设计如此 2.分析 这个分析需要前置知识,鸿蒙的任务栈页面栈,具体参考如下链接: zh-cn/application-dev/application-models/page-missio…...
C++语言程序设计——02 变量与数据类型
目录 一、变量与数据类型(一)变量的数据类型(二)变量命名规则(三)定义变量(四)变量赋值(五)查看数据类型 二、ASCII码三、进制表示与转换(一&…...
Model Context Protocol (MCP) - 尝试创建和测试一下MCP Server
1.简单介绍 MCP是Model Context Protocol的缩写,是Anthropic开源的一个标准协议。MCP使得大语言模型可以和外部的数据源,工具进行集成。当前MCP在社区逐渐地流行起来了。同时official C# SDK(仓库是csharp-sdk) 也在不断更新中,目前最新版本…...
十四种逻辑器件综合对比——《器件手册--逻辑器件》
目录 逻辑器件 简述 按功能分类 按工艺分类 按电平分类 特殊功能逻辑器件 应用领域 详尽阐述 1 逻辑门 一、基本概念 二、主要类型 三、实现方式 四、应用领域 2 反相器 工作原理 基本功能 主要应用 常见类型 特点 未来发展趋势 3 锁存器 基本概念 工作原理 主要类型…...
将已有 SVN 服务打包成 Docker 镜像的详细步骤
将已有 SVN 服务打包成 Docker 镜像的详细步骤 一、服务器环境准备 在开始将 SVN 服务打包成 Docker 镜像之前,我们需要确保目标服务器的环境满足一定条件。 首先要确保目标服务器已安装 Docker。同时服务器可以连接互联网,可以通过以下简单命令来验证…...
python文件打包无法导入ultralytics模块
💥打包的 .exe 闪退了?别慌!教你逐步排查 PyInstaller 打包的所有错误! 🛠 运行 .exe 查看报错信息✅ 正确姿势: ⚠ importlib 动态导入导致打包失败❓什么是动态导入?✅ 解决方式: …...
AMBA-CHI协议详解(二十六)
AMBA-CHI协议详解(一)- Introduction AMBA-CHI协议详解(二)- Channel fields / Read transactions AMBA-CHI协议详解(三)- Write transactions AMBA-CHI协议详解(四)- Other transactions AMBA-CHI协议详解(五)- Transaction identifier fields AMBA-CHI协议详解(六…...
Go小技巧易错点100例(二十六)
本期分享: 1. string转[]byte是否会发生内存拷贝 2. Go程序获取文件的哈希值 正文: string转[]byte是否会发生内存拷贝 在Go语言中,字符串转换为字节数组([]byte)确实会发生内存拷贝。这是因为在Go中,字…...
FPGA_BD Block Design学习(一)
PS端开发流程详细步骤 1.第一步:打开Vivado软件,创建或打开一个工程。 2.第二步:在Block Design中添加arm核心,并将其配置为IP核。 3.第三步:配置arm核心的外设信息,如DDR接口、时钟频率、UART接口等。 …...
ubuntu20.04+qt5.12.8安装serialbus
先从官网https://download.qt.io/archive/qt/5.12/5.12.8/submodules/ 下载 qtserialbus-everywhere-src-5.12.8.tar.xz 有需要其他版本的点击返回上一级自行寻找对应版本。 也可从 https://download.csdn.net/download/zhouhui1982/90595810 下载 在终端中依次输入以下命令…...
银河麒麟V10 Ollama+ShellGPT打造Shell AI助手——筑梦之路
环境说明 1. 操作系统版本: 银河麒麟V10 2. CPU架构:X86 3. Python版本:3.12.9 4. 大模型:mistral:7b-instruct 准备工作 1. 编译安装python 3.12 # 下载python 源码wget https://www.python.org/ftp/python/3.12.9/Python-3.12.9.tg…...
python求π近似值
【问题描述】用公式π/4≈1-1/31/5-1/7..1/(2*N-1).求圆周率PI的近似值。 从键盘输入一个整数N值,利用上述公式计算出π的近似值,然后输出π值,保留小数后8位。 【样例输入】1000 【样例输出】3.14059265 def countpi(N):p0040nowid0for i i…...
基于 Spring Boot + Vue 的 [业务场景] 管理系统设计与实现
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...
如何查看自己抖音的IP属地?详细教程+常见问题解答
在当今互联网时代,IP属地信息已成为各大社交平台(如抖音、微博、快手等)展示用户真实网络位置的重要功能。无论是出于隐私保护、账号安全,还是单纯好奇自己的IP归属地,了解如何查看抖音IP属地都很有必要。 本文将详细介…...
⑪数据中心网络M-LAG实战
一、DeviceA-M-LAG-Mater配置 1、M-LAG 系统配置。 # m-lag mad exclude interface GigabitEthernet1/0/7 m-lag mad exclude interface Vlan-interface100 m-lag mad exclude interface Vlan-interface101 m-lag system-mac 0002-0002-0002 m-lag system-number 1 m-la…...
化工企业数字化转型:从数据贯通到生态重构的实践路径
一、战略定位:破解行业核心痛点 化工行业面临生产安全风险高(全国危化品企业事故率年增5%)、能耗与排放压力大(占工业总能耗12%)、供应链协同低效(库存周转率低于制造业均值30%)三大挑战。《石…...
JAVA——初识JAVA
文章目录 如何在cmd上编译、运行代码解析String[] args中放的是什么Java结构编译运行可能遇到的错误Java中的注释Java的三种注释编码不一致的问题 IDEA常用基础开发快捷键补齐快捷键注释快捷键 IDEA的基础调式方法标识符 如何在cmd上编译、运行 在没有集成开发环境下ÿ…...
Shell脚本的学习
编写脚本文件 定义以开头:#!/bin/bash #!用来声明脚本由什么shell解释,否则使用默认shel 第一步:编写脚本文件 #!/bin/bash #注释 echo "这是输出" 第二步:加上执行权限:chmod x 脚本文件名.sh 第三步&…...
专题十四:动态路由——OSPF
一、OSPF简介 开放式最短路径优先OSPF(Open Shortest Path First)是IETF组织开发的一个基于链路状态的内部网关协议(Interior Gateway Protocol),采用DIjkstra算法,协议号是89。用于自治系统(A…...
聊聊Spring AI的Multimodality
序 本文主要研究一下Spring AI的Multimodality 示例 chatModel示例 var imageResource new ClassPathResource("/multimodal.test.png");var userMessage new UserMessage("Explain what do you see in this picture?", // contentnew Media(MimeTy…...
区块链点燃游戏行业新未来——技术变革与实践指南
区块链点燃游戏行业新未来——技术变革与实践指南 在数字时代,游戏行业无疑是创新的热土。从简单像素风的街机游戏到沉浸式的虚拟现实,我们见证了技术如何一步步塑造游戏的样貌。然而,在传统游戏模式中,玩家权益往往无法得到保障…...
Cocos Creator Shader入门实战(八):Shader实现圆形、椭圆、菱形等头像
引擎:3.8.5 您好,我是鹤九日! 回顾 Shader的学习是一条漫长的道路。 理论知识的枯燥无味,让很多人选择了放弃。然而不得不说:任何新知识、新领域的学习,本身面临的都是问题! 互联网和AI给了我…...
大模型SFT用chat版还是base版 SFT后灾难性遗忘怎么办
大模型SFT用chat版还是base版 进行 SFT 时,基座模型选用 Chat 还是 Base 模型? 选 Base 还是 Chat 模型,首先先熟悉 Base 和 Chat 是两种不同的大模型,它们在训练数据、应用场景和模型特性上有所区别。 在训练数据方面…...
【AI论文】VCR-Bench:视频链式思考推理的综合评估框架
摘要:思想链(CoT)推理的进步显著增强了大型语言模型(LLMs)和大型视觉语言模型(LVLMs)的能力。 然而,目前仍然缺乏一个严格的视频CoT推理评估框架。 目前的视频基准测试无法充分评估推…...
数据中台、BI业务访谈(二):组织架构梳理的坑
这是数据中台、BI业务访谈系列的第二篇文章,在上一篇文章中,我重点介绍了在给企业的业务部门、高层管理做业务访谈之前我们要做好行业、业务知识的功课。做好这些功课之后,就到了实际的访谈环节了。 业务访谈关键点 那么在具体业务访谈的时…...
【零基础实战】Ubuntu搭建DVWA漏洞靶场全流程详解(附渗透测试示例)
【零基础实战】Ubuntu搭建DVWA漏洞靶场全流程详解(附渗透测试示例) (声明:实际操作请遵守网络安全法,仅在授权环境进行测试,仅供个人研究) 一、DVWA靶场简介 DVWA(Damn Vulnerable Web Application)是专为网络安全学习者设计的漏洞演练平台,包含SQL注入、XSS、文件…...
库学习04——numpy
一、基本属性 二、 创建数组 (一)arange a np.arange(10,20,2) # [10,12,14,16,18] 只有一个参数n的话,默认是从0到n-1的一维数组。 (二)自定义reshape a np.arange(12).reshape((3,4)) [[ 0 1 2 3][ 4 5 …...
