基于Spring Cloud微服务化开发平台Cloud-Platform完整解析

Cloud-Platform 开源项目环境搭建及运行 一项目位置 Cloud-Platform: ????????????国内首个Spring Cloud微服务RBAC的管理平台,核心采用Spring Boot 2.4、Spring Cloud 2020.0.0 & Alibaba,前端采用d2-admin中台框架。 ???? ???? 记得上边点个star 关注更新https://gitee.com/geek_qi/cloud-platform 版本:v2.7 二项目资料 dev-doc.md · 江离/Cloud-Platform - G 阅读详情
小Hub领读:

讲解视频也同步发布啦,记得去看哈,一键三连哇。

视频讲解:https://www.bilibili.com/video/bv1SD4y1o7cN

这系统,一定要学会用户-服务认证,服务-服务鉴权的那一套,这才算学会。


简介

Cloud-Platform是国内首个基于Spring Cloud微服务化开发平台,具有统一授权、认证后台管理系统,其中包含具备用户管理、资源权限管理、网关API 管理等多个模块,支持多业务系统并行开发,可以作为后端服务的开发脚手架。代码简洁,架构清晰,适合学习和直接项目中使用。核心技术采用Spring Boot 2.1.2以及Spring Cloud (Greenwich.RELEASE) 相关核心组件,采用Nacos注册和配置中心,集成流量卫兵Sentinel,前端采用vue-element-admin组件,Elastic Search自行集成。

B站视频讲解:https://www.bilibili.com/video/BV1SD4y1o7cN/

ps:注意本文讲解是基于Cloud-Platform v2.5版本,不是最新版本!

技术选型

前端:vue-element-admin

后端:springcloud(eureka、gateway、admin、sidecar、Hystrix、feign、ribbon、zipkin)、tk+mybatis、lucene、jwt、rest

项目结构

ace-security
  ace-modules--------------公共服务模块(基础系统、搜索、OSS)
  ace-auth-----------------服务鉴权中心
  ace-gate-----------------网关负载中心
  ace-common---------------通用脚手架
  ace-control--------------运维中心(监控、链路)
  ace-sidebar--------------调用第三方语言服务

项目启动

须知: 因为Cloud-Platform是一个前后端分离的项目,所以后端的服务必须先启动,在后端服务启动完成后,再启动前端的工程。

环境

  • mysql,redis,maven

  • jdk1.8

  • IDE插件一个,lombok插件,具体百度即可

  • node

前端

git链接:https://gitee.com/geek_qi/cloud-platform-ui

  • 先clone到本地,并进入cloud-platform-ui目录打开命令行窗口(cmd)

  • 因为涉及node.js,所以需要安装npm,node等环境

node.js安装教程:http://nodejs.cn/download/下载msi版本安装。

安装之后,命令行窗口,表示安装成功。

给项目打包依赖

# 1、安装淘宝镜像依赖
npm install -g cnpm --registry=https://registry.npm.taobao.org
# 2、安装项目依赖
cnpm install
# 启动服务
npm run dev

启动成功后会自动打开链接:http://localhost:9527/

后端

首先clone项目下来(v2.5版本):https://gitee.com/geek_qi/cloud-platform/tree/v2.5/

导入到idea中,然后导入数据库sql:

修改数据库的账号密码(直接ctrl+shirt+r,搜索datasource:,可以很方便修改):

接下来启动redis,然后安装顺序启动我们的服务

# 启动顺序
CenterBootstrap -> AuthBootstrap -> AdminBootstrap -> GatewayServerBootstrap

其他监控或服务可以先不启动。

服务说明

ace-auth-server

关键类:

  • AuthController

    • /jwt开头的控制器,登录、刷新、校验jwt

    • 网关不拦截这个链接的请求

  • ClientController

    • 对外暴露的接口,可通过客户端的id和密钥获取到对应的授权相关资源

  • ServiceController

    • 后台管理系统服务管理模块接口

  • ClientTokenInterceptor

    • 拦截feign接口发起的请求,并自动添加请求头token

  • ServiceAuthRestInterceptor

    • 拦截的url为/service/**(WebConfiguration)

    • 服务之间的调用鉴权

    • 一般feign、或者restTemplate方式调用

  • UserAuthRestInterceptor

    • 拦截的url为/service/**(WebConfiguration)

    • 获取用户的token并解析,为会话上下文添加用户信息(ThreadLocal)

  • OkHttpTokenInterceptor

    • 拦截所有的feign请求,OkHttp重写请求

    • OkHttp3一个强有力的机制,能够监控,重写以及重试(请求的)调用

模块分析

用户授权

首先我们来弄清楚一下登录的流程,登录中和之后发生了什么事,那么我们打开前段登录页面,按下F12,然后点击登录,可以查看到以下几个动作:

  • 点击登录,提交表单:http://localhost:9527/api/auth/jwt/token

#返回值
{"status":200,"data":"eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsInVzZXJJZCI6IjEiLCJuYW1lIjoiTXIuQUciLCJleHAiOjE1NjE0NDEyNTZ9.tXNw8nhAFmI4QIQDpKy4DzWtJSTpfwD4685JqbA2pGScdyfXt_5DDs_r1gVZA4CwQC4oZxBsmLKZGclTLGc4HKeXlP2PiVoHZfSWymFRLNfvFqOzKUETJ6WpyDqK55yjf1wddTBD3VzSFvY49uunvozEcb2oFjOs3M_I2sgxAAU","rel":false}

可以看到登录成功之后返回的是一个jwt的token值,应该就是标识用户身份用的token。

  • ajax发起请求获取用户信息以及菜单列表等:http://localhost:9527/api/admin/user/front/info?token=eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsInVzZXJJZCI6IjEiLCJuYW1lIjoiTXIuQUciLCJleHAiOjE1NjE0NDEyNTZ9.tXNw8nhAFmI4QIQDpKy4DzWtJSTpfwD4685JqbA2pGScdyfXt_5DDs_r1gVZA4CwQC4oZxBsmLKZGclTLGc4HKeXlP2PiVoHZfSWymFRLNfvFqOzKUETJ6WpyDqK55yjf1wddTBD3VzSFvY49uunvozEcb2oFjOs3M_I2sgxAAU

# 返回值
{"id":"1","username":"admin","name":"Mr.AG","description":"","menus":[{"code":"userManager","type":"menu","uri":"/admin/user","method":"GET","name":"访问","menu":"用户管理"},{"code":"baseManager","type":"menu","uri":"/admin","method":"GET","name":"访问","menu":"基础配置管理"},
.....(此次删除了部分),{"code":"serviceManager:btn_clientManager","type":"button","uri":"/auth/service/{*}/client","method":"POST","name":"服务授权","menu":"服务管理"}]}

同时注意请求头的信息:带有刚才登录后的jwt token,名称叫Authorization,以后的所有请求都会带上这个Authorization用于标识用户身份。 

接下来我们来走下这个过程:

  • 客户端点击按钮发起登录请求http://localhost:9527/api/auth/jwt/token

    • 获取请求uri,method

    • 判断是否是不拦截地址

    • 刚好我们发现不拦截地址中有这个配置:gate: ignore: startWith: /auth/jwt

    • 所以网关过滤器直接将请求代理到ace-auth服务

    • 到达网关gate首先经过我们的过滤器AccessGatewayFilter

  • 网关ace-gateway-v2的代理以及过滤配置

 # 网关代理规则
 spring:
   cloud:
      gateway:
        locator:
          enabled: true
        routes:
        # =====================================
        - id: ace-auth
          uri: lb://ace-auth
          order: 8000
          predicates:
          - Path=/api/auth/**
          filters:
          - StripPrefix=2
        - id: ace-admin
          uri: lb://ace-admin
          order: 8001
          predicates:
          - Path=/api/admin/**
          filters:
          - StripPrefix=2
gate:
  ignore:
    startWith: /auth/jwt

那么我们进入ace-auth中找到对应controller 可以找到这里:

@RestController
@RequestMapping("jwt")
@Slf4j
public class AuthController {    @RequestMapping(value = "token", method = RequestMethod.POST)
    public ObjectRestResponse<String> createAuthenticationToken(
            @RequestBody JwtAuthenticationRequest authenticationRequest) throws Exception {
        log.info(authenticationRequest.getUsername()+" require logging...");
        final String token = authService.login(authenticationRequest);
        return new ObjectRestResponse<>().data(token);
    }
}

这个方法里面只有一个方法就是authService.login,点这个方法进去发现里面又有个方法是userService.validate,这是一个feign接口

@FeignClient(value = "ace-admin",configuration = FeignConfiguration.class)
public interface IUserService {  @RequestMapping(value = "/api/user/validate", method = RequestMethod.POST)
  public UserInfo validate(@RequestBody JwtAuthenticationRequest authenticationRequest);

}可以看到这是远程调用,那么接下来,我们看看远程调用的过程,这设计到服务间的相互鉴权

服务间鉴权

上面的userService.validate,类上有这样的注解

@FeignClient(value = "ace-admin",configuration = FeignConfiguration.class)
表示声明式调用ace-admin服务,接下来我们解析一下这个过程发生了什么事情,我们可以看到有个configuration = FeignConfiguration.class,我们打开FeignConfiguration
@Configuration
public class FeignConfiguration {
    @Bean
    ClientTokenInterceptor getClientTokenInterceptor(){
        return new ClientTokenInterceptor();
    }
}

再打开ClientTokenInterceptor :

public class ClientTokenInterceptor implements RequestInterceptor {
    private Logger logger = LoggerFactory.getLogger(ClientTokenInterceptor.class);
    @Autowired
    private ClientConfiguration clientConfiguration;
    @Autowired
    private AuthClientService authClientService;    @Override
    public void apply(RequestTemplate requestTemplate) {
        logger.info("----> 为feign调用添加token头");
        try {
            requestTemplate.header(clientConfiguration.getClientTokenHeader(), authClientService.apply(clientConfiguration.getClientId(), clientConfiguration.getClientSecret()));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
从上面的配置我们知道,RequestInterceptor 是feign接口下的包装拦截器,从代码里面看到,其实意思就是在feign发起远程调用时候往请求里添加请求头信息(clientToken),所以发起的请求头中就有了当前服务的身份token,接受端的服务器就能根据token辨别来源服务器的身份。

接下来我们看看接收端怎么辨别的。ServiceAuthRestInterceptor

public class ServiceAuthRestInterceptor extends HandlerInterceptorAdapter {
    private Logger logger = LoggerFactory.getLogger(ServiceAuthRestInterceptor.class);    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {        logger.info("------>判断服务A是否有权限访问当前服务B ~");
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        // 配置该注解,说明不进行服务拦截
        IgnoreClientToken annotation = handlerMethod.getBeanType().getAnnotation(IgnoreClientToken.class);
        if (annotation == null) {
            annotation = handlerMethod.getMethodAnnotation(IgnoreClientToken.class);
        }
        if(annotation!=null) {
            return super.preHandle(request, response, handler);
        }        String token = request.getHeader(serviceAuthConfig.getTokenHeader());
        IJWTInfo infoFromToken = serviceAuthUtil.getInfoFromToken(token);
        String uniqueName = infoFromToken.getUniqueName();
        for(String client:serviceAuthUtil.getAllowedClient()){ //ace-auth、ace-gate
            if(client.equals(uniqueName)){
                return super.preHandle(request, response, handler);
            }
        }
        throw new ClientForbiddenException("Client is Forbidden!");
    }
}

从代码看到首先看下有没IgnoreClientToken的注解,有的话就跳过。没有的话继续获取调用端服务器的token,然后再去获取当前服务器允许访问的lient(serviceAuthUtil.getAllowedClient()),然后匹配调用端的名称是否在允许的客户端内,如果允许就继续,不允许就forbidden。所以挺清晰的。那这套客户端和允许的访问的客户端这套关系是哪里维护的呢,其实有两张表

  • auth_client :客户端的id和名称等

  • auth_client_service:服务端允许调用的客户端关联表

从这张表中,我们就可以得出哪些允许被访问,哪些不能被访问了

cloud-platform鉴权逻辑.png

服务间调用优化.png

总结

第一件事

  • 新建所有需要用到的模块,基本搭建好框架

  • 做好增删改查的封装、接口规范

  • 全局异常捕捉封装

  • 单元测试

  • 通用工具类

第二件事

  • 决定服务的授权模式(jwt、oauth2等)

第三件事

  • 服务内部鉴权

  • 权限控制

视频讲解:https://www.bilibili.com/video/bv1SD4y1o7cN


(完)

MarkerHub文章索引:

https://github.com/MarkerHub/JavaIndex
【推荐阅读】
开源即责任

总在说SpringBoot内置了tomcat启动,那它的原理你说的清楚吗?

谈谈在Java中如何优雅地判空

SpringBoot 整合 Quartz 实现 JAVA 定时任务的动态配置

骚操作:不重启 JVM,如何替换掉已经加载的类?

记一次订单号重复的事故,快看看你的 UUID 在并发下还正确吗?

Spring如何实现AOP,请不要再说cglib了!

懵!啥是Java软引用、弱引用、虚引用?


好文章!点个在看!

cloud-platform(ag-admin)环境搭建 自从ag-admin变成cloud-platform,后台框架的搭建就和以前的有很大的不同了,我就是按照以前的搭建方式来搭建的,但是失败了,好不容易搭好,所以记录一下,防止以后忘记。 首先第一步,先下载cloud-platformcloud-platform-ui,这是后台和前台,注意别下错了,我就是后台下的cloud-platform,然后前台还是使用ag-admin,前后端都搭好了,都运行起... 阅读详情

相关推荐

Spring CloudSpring Boot版本匹配关系解析

微服务架构中,Spring Cloud作为Spring Boot的增强套件,其版本兼容性直接影响系统稳定性。版本匹配遵循严格的地基与上层结构关系,如2023年推荐的Spring Cloud 2022.0.x与Spring Boot 3.0.x组合。理解版本号语义规则(主版本、次版本、修订号)及官方版本对照表是避免依赖冲突的关键。企业级项目中,通过Maven或Gradle的BOM(Bill of Materials)管理依赖版本,结合CI/CD管道中的版本校验脚本,可有效预防版本错配问题。本文以Spring

weixin_33721344的博客 560

对基于Spring Cloud微服务开发平台Cloud-Platform的大致理解

对基于Spring Cloud微服务开发平台Cloud-Platform的大致理解背景简介技术选型系统架构图项目结构后端工程启动前端服务说明ace-adminCloud - Platform执行过程 (后补)创建一个自定义列表新的甘特图功能,丰富你的文章UML 图表 背景 Spring Cloud因为在两年前在上一家公司有使用过,但是不是很深入。现在是自己第三家公司,又再一次和Spring Cloud结缘(坦诚的说,第二家公司技术确实也太老了,自己也太懒惰。所以,流行了这么久的Spring Cloud自己

caishancai的博客 4473

cloud-platform:MoJ云平台上的文档

司法部云平台主存储库 关于此存储库 这是MoJ Cloud Platform团队的存储库,用于存放面向公众的文档,功能工作,增强功能和问题。 ZenHub用户可以通过GitHub Issues或直接在我们的添加问题 最好在添加新问题之前先搜寻我们的董事会,以减少重复并鼓励在现有对话中进行活动。 链接 云平台回购清单 我们为我们的工作提供了一系列存储库,下面列出了这些存储库。 我们采用了以cloud-platform-开始每个仓库的命名约定。 在某些存储库具有相似目的的地方,我们尝试使用类似的名称(例如,terraform模块的cloud-platform-terraform-* )。 我们还尝试以便用户可以从名称中推断出给定事物的基本理解。 我们的核心仓库 名称 关联 描述 云平台 MoJ Cloud Platform团队的存储库,用于面向公众的文档,功能工作,增强功能和问题。 云平台

基于Spring Cloud微服务开发平台Cloud-Platform的前后端代码部署

基于Spring Cloud微服务开发平台Cloud-Platform前后端部署Cloud-Platform后端部署1.依赖环境安装1.1 mysql安装1.2 java安装1.3 maven安装1.4 redis安装1.5 nacos安装2.数据库配置3.代码配置文件配置yml文件4.启动后台Cloud-Admin前端部署1. 安装nodejs2. 安装依赖3. 测试后台 注:本文章开发环境是win7,开发工具选择IDEA。 Cloud-Platform后端部署 后端gitee地址:https://gi

yingningyu的博客 1386

国内首个Spring Cloud微服务开发平台:从入门到精通的完整指南

Spring Cloud Platform是国内首个基于Spring Cloud微服务开发平台,为开发者提供了一套完整微服务解决方案。这个开源项目采用最新的Spring Boot 2.4.1、Spring Cloud 2020.0.0以及Spring Cloud Alibaba 2.2.4技术栈,集成了Nacos注册中心、Sentinel流量卫兵等核心组件,为企业级应用开发提供了强大的技术支撑

gitblog_01009的博客 1147

Spring-Cloud-Platform完整指南:国内首个Spring Cloud微服务RBAC管理平台深度解析

Spring-Cloud-Platform是国内首个基于Spring Cloud微服务RBAC的管理平台,核心采用Spring Boot 2.4、Spring Cloud 2020.0.0 & Alibaba技术栈,前端采用d2-admin中台框架,为企业级应用提供了完整的权限管理解决方案。 ## 平台核心架构与技术栈 该平台采用微服务架构设计,主要包含以下核心模块: - **ace-ap

gitblog_00577的博客 797

微服务开发终极指南:Cloud-Platform 企业级解决方案深度解析

🔥 想要快速搭建企业级微服务架构吗?Cloud-Platform 作为国内首个基于 Spring Cloud 微服务开发平台,为你提供了一站式的解决方案!这个开源项目集成了统一授权、认证后台管理系统,包含用户管理、资源权限管理、网关API管理等多个核心模块,支持多业务系统并行开发,是后端服务开发的完美脚手架。 ## 🚀 为什么选择 Cloud-PlatformCloud-Platf

gitblog_00378的博客 715

Spring Cloud 优秀开源项目

一介绍 第一套:比较好的 Spring Cloud开源项目 1 PiggyMetrics 地址 https://github.com/sqshq/piggymetrics 2 分布式电商项目地址 https://github.com/SiGuiyang/spring-cloud-shop 3 轻松阅读微服务项目 api https://github.com/Zealon159/light-reading-cloud 4 SpringBlade 微服务开发平台地址SpringBlade: ..

实践求真知 2853

微服务测试终极指南:Spring Cloud Platform 三大测试策略完整解析

Spring Cloud Platform是国内首个基于Spring Cloud微服务RBAC的管理平台,核心采用Spring Boot 2.4、Spring Cloud 2020.0.0 & Alibaba技术栈,前端采用d2-admin中台框架。本文将为你详细解析该平台的三大测试策略,帮助你快速掌握微服务测试的关键方法。 ## 一、单元测试:微服务的基石 单元测试是微服务测试的基础,它可

gitblog_00740的博客 794

Spring-Cloud-Platform开发环境搭建与部署指南

本文详细介绍了Spring-Cloud-Platform微服务平台的完整开发环境搭建与部署指南。内容涵盖开发环境要求与依赖配置、数据库初始与数据脚本解析、服务启动顺序与配置要点,以及Docker容器部署实践四个核心部分。从基础的Java、MySQL、Redis环境配置,到Nacos注册中心、Sentinel流量控制等微服务基础设施的搭建,再到详细的数据库架构设计和初始脚本解析,最后通过Doc...

gitblog_00001的博客 1019

Spring-Cloud-Platform架构深度剖析:从单体到微服务的完美转型

Spring-Cloud-Platform是国内首个基于Spring Cloud微服务RBAC的管理平台,为开发者提供从单体架构向微服务架构转型的完整解决方案。本文将深入解析其架构设计、核心模块和应用实践,帮助你掌握微服务转型的关键技术。 ## 🚀 项目概述与核心价值 Spring-Cloud-Platform采用最新的Spring Boot 2.4和Spring Cloud 2020.0

gitblog_00734的博客 875

如何快速搭建企业级微服务管理平台:Spring-Cloud-Platform实战指南

Spring-Cloud-Platform是国内首个基于Spring Cloud微服务开发平台,提供统一授权、认证后台管理系统,包含用户管理、资源权限管理、网关API管理等多个模块,支持多业务系统并行开发,可直接作为后端服务的开发脚手架。核心技术采用Spring Boot 2.4、Spring Cloud 2020.0.0及Alibaba系列组件,适合企业级微服务项目快速落地。 ## 🌟

gitblog_00250的博客 744

深度解析Spring-Cloud-Platform数据库设计:多租户架构与动态数据源的终极指南

🔥Spring-Cloud-Platform作为国内首个基于Spring Cloud微服务的RBAC管理平台,其数据库设计采用了先进的多租户架构和动态数据源技术。本文将为你详细解析这个微服务平台的数据库架构设计,帮助你理解如何在大规模企业应用中实现数据隔离和灵活扩展。🚀 ## 什么是多租户架构与动态数据源? **多租户架构**是一种软件架构模式,允许单个应用程序实例为多个客户(租户)提供

gitblog_00083的博客 866

Spring-Cloud-Platform统一授权认证系统:JWT鉴权的终极实践

微服务架构日益普及的今天,如何构建一个安全、高效、可扩展的统一授权认证系统成为了每个技术团队必须面对的挑战。Spring-Cloud-Platform作为国内首个基于Spring Cloud微服务的RBAC管理平台,通过JWT(JSON Web Token)技术实现了分布式环境下的统一认证授权,为开发者提供了完整微服务安全解决方案。🔥 ## 🚀 JWT鉴权的核心优势 JWT鉴权在Sp

gitblog_00356的博客 1052

Spring-Cloud-Platform集成Elastic Search:全文搜索功能实现指南

Spring-Cloud-Platform作为国内首个基于Spring Cloud微服务RBAC管理平台,通过集成Elastic Search实现了强大的全文搜索功能,为开发者提供了完整的搜索解决方案。🚀 ## 为什么需要全文搜索功能? 在现代微服务架构中,数据量快速增长,传统的数据库查询方式已无法满足复杂的搜索需求。Spring-Cloud-Platform通过Lucene和Elast

gitblog_01108的博客 904

【序列晋升】22 Spring Cloud GCP 来自Google的极致简约版扩展框架

Spring Cloud GCP是Spring Boot的扩展框架,旨在简在Google Cloud Platform(GCP)上构建基于Spring Boot的应用程序。作为Spring Cloud生态的一部分,它通过提供自动配置和客户端库,让开发者能够轻松地将Spring应用与GCP服务集成,无需深入了解每个GCP API的细节。无论您是正在将现有Spring应用迁移到GCP,还是计划新建一个充分利用GCP功能的应用,Spring Cloud GCP都能帮助您快速实现这一目标。

愚者Turbo的博客 810

Spring-Cloud-Platform高可用架构:集群部署与容灾方案

Spring-Cloud-Platform作为国内首个基于Spring Cloud微服务RBAC管理平台,其高可用架构设计为企业级应用提供了稳定可靠的运行保障。本文将深入解析该平台的集群部署策略与容灾方案,帮助您构建坚如磐石的服务体系。🚀 ## 为什么需要高可用架构? 在现代企业应用中,服务中断可能造成巨大损失。Spring-Cloud-Platform通过**多级容错机制**、**负载

gitblog_00291的博客 677

Spring-Cloud-Platform故障排查:常见问题与解决方案大全

Spring-Cloud-Platform作为国内首个基于Spring Cloud微服务RBAC管理平台,在实际部署和使用过程中难免会遇到各种问题。本文将为您详细解析Spring-Cloud-Platform的常见故障现象及其解决方案,帮助您快速定位和解决问题。🔥 ## 🚨 服务注册与发现故障排查 ### Nacos服务注册失败问题 **症状表现:** 服务启动后无法在Nacos控制

gitblog_01075的博客 739
上一篇: 你的Redis为什么变慢了?
下一篇: 八年踩坑经验告诉你,搜索引擎哪家强!
MarkerHub
博客等级 码龄6年 342粉丝 77原创
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值