# spring-go **Repository Path**: etxync/spring-go ## Basic Information - **Project Name**: spring-go - **Description**: 🔥🔥🔥Spring-GO是一款易用、高速、高效、功能丰富的开源 SpringCloud脚手架。 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2024-02-24 - **Last Updated**: 2024-02-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # spring-go #### 介绍 🔥🔥🔥Spring-GO是一款多租户、易用、高速、高效、功能丰富的开源 Spring-Cloud 脚手架。 收到许多朋友来信,希望能够在数据层面使用 MyBatis。 这里想说的是:技术要一直向前看,不要沉浸在过去的成就,这里是新世界的大门。 也不要质疑 SpringData,毕竟 Spring 在 java 世界有无可撼动的地位。 未来还会引入 [Reactive](https://spring.io/reactive/) 编程模型体系,以及 [Rsocket](https://rsocket.io/) 通讯框架, 极其优越的通讯协议 模块与模块之间不会有强耦合 #### 软件架构 SpringAuthorizationServer SpringOauth2ResourceServer SpringDataJpa SpringCloudConfig SpringCloudAlibabaNacos OAuth2.1 #### 安装教程 1. 新建模块 > 在 settings.gradle 引入模块名称,在与其同级 创建文件目录 ``` 如 include ':users' ``` 2. 复制 users 模块 build.gradle 到新目录中 3. gradle 构建 #### 使用说明 1. [前端地址](https://gitee.com/sdake/spring-go-admin) 2. authorization 是独立项目可以单独提取出来 [使用文档](https://gitee.com/sdake/spring-go/wikis/%E6%8E%88%E6%9D%83%E6%9C%8D%E5%8A%A1%E5%99%A8) 3. common 模块是公共模块,存放实体类对象等共用的工具类 4. SpringDataJpa > 数据层使用 SpringDataJpa。对于初接触Jpa人群来说并不适应,但是当你尝试了使用了Jpa,你会发现它的优势。 > 1. JPA可移植性好,支持Hibernate方言,包括国产数据库也会提供Hibernate方言包。自动创建数据库表结构,自动增加字段与索引,这不需要使用数据库版本框架 来做数据库的版本控制 > 2. 减少sql语句的编写,开发效率高。最简单的sql便是最高效的。 以往我们需要编写非常多的复杂的sql来完成业务,这对日后功能的新增与维护是非常不利的。 时间久了sql运行效率极大降低,也是因为sql语言的灵活性以至于初级程序员对编写sql细节做的不到位 > 3. 面向对象开发思想,对象化程度更高。 数据库是一个软件项目的根基,万丈高楼平地起。一个好的数据库设计理念往往能带给项目持久的生命力。 由于sql语言的灵活性也导致设计数据已面向过程编写,用到才给到。也忽视了数据库与软件层面的结合 5. SpringRestDocs 作为API文档框架 > 在Swagger中,我们必须使用注解使rest控制器的代码混乱,并降低了其可读性。此外,文档与代码紧密耦合,并将进入生产环境。 维护文档是这里的另一个挑战。如果SwaggerAPI中的某些内容发生了变化,程序员能总是记得更新相应的注解吗 > REST Docs 看起来既不像其他 UI 那样吸引人,也不能用于验收测试。 它已单元测试的编写形成 API 文档。 > 测试的成功完成不仅为我们提供了代码片段,而且还像任何其他单元测试一样验证了我们的 API。 > 这迫使我们进行与 API 修改相对应的文档更改。此外,文档代码与实现完全分开。 它还需要更多步骤来生成最终的 HTML文档 6. [多租户](https://baike.baidu.com/item/%E5%A4%9A%E7%A7%9F%E6%88%B7%E6%8A%80%E6%9C%AF) > 在某些情况下,您可能需要资源服务器接收访问这两种令牌。这两种令牌分别来自两个授权服务器(加密形式不一致)。 > 资源服务器可以支持多个租户签发的令牌 > 对于多租户,并非是在数据层面建立数据隔离,而是在认证层面。当然在数据层面建立数据隔离起名为多租户也无可厚非 ### SSO 单点登录示例 > 客户端1为 8001 端口,客户端2为 8002 端口,这2个客户端代表了不同的应用业务 > 在一个网站登录,在访问另一个另一个网站就自动登录了 1. 新增一个客户端 ```http request POST /client HTTP/1.1 Host: localhost:9000 Content-Type: application/json Authorization: Bearer eyJraWQiOiIyNmQyZjEwMS04NTVkLTRkMTMtYjg3NC00OTAxODQ4ODdhZTgiLCJhbGciOiJSUzI1NiJ9 { "clientName": "sdack321", "scopes": ["read"], "grantTypes":["refresh_token","device_code","client_credentials","jwt_bearer","sms_code"], "methods":["client_secret_post"], "redirectUris": ["https://www.baidu.com/","http://localhost:8002/authorized","http://localhost:8002/login/oauth2/code/client-oidc"], "issConsent":0, "issRefresh":1, "expRefresh":1440, "expAccess": 15 } ``` 需要注意的是 redirectUris 重定向连接不要写错了 2. 更改检查配置文件 application-two.yml ```yaml spring: thymeleaf: cache: false security: oauth2: client: registration: client-oidc: provider: sdack-cloud # 授权提供商,对应下面的 provider client-id: # 客户端ID client-secret: # 客户端 secret authorization-grant-type: authorization_code redirect-uri: "http://localhost:8002/login/oauth2/code/{registrationId}" scope: openid, profile client-name: client-oidc-two # 授权时展示的客户端名称 client-code: provider: sdack-cloud client-id: # 客户端ID client-secret: # 客户端 secret authorization-grant-type: authorization_code redirect-uri: "http://localhost:8002/authorized" # 重定向回客户端的地址 scope: openid, profile client-name: sdack-two provider: sdack-cloud: issuer-uri: http://localhost:9000 ``` 2. 启动客户端 ```shell java -jar client1-1.0.jar --spring.profiles.active=one java -jar client1-1.0.jar --spring.profiles.active=two ```