{"id":15044625,"url":"https://github.com/zhangbinhub/acp","last_synced_at":"2025-04-10T00:43:15.660Z","repository":{"id":43286372,"uuid":"279298314","full_name":"zhangbinhub/acp","owner":"zhangbinhub","description":"Application Construction Platform 应用构建平台。该项目是用Kotlin和Java语言混编封装的脚手架。本人会密切关注业界最新动态，并使用最新技术持续更新优化。使用该脚手架可快速搭建基于Kotlin或Java语言的普通应用、SpringBoot应用和SpringCloud应用。","archived":false,"fork":false,"pushed_at":"2022-03-12T13:12:10.000Z","size":2197,"stargazers_count":8,"open_issues_count":0,"forks_count":4,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-10T00:43:09.827Z","etag":null,"topics":["java11","kotlin","spring-boot","spring-cloud","spring-cloud-alibaba"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zhangbinhub.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-07-13T12:36:44.000Z","updated_at":"2022-07-30T16:33:39.000Z","dependencies_parsed_at":"2022-08-23T15:21:53.708Z","dependency_job_id":null,"html_url":"https://github.com/zhangbinhub/acp","commit_stats":null,"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhangbinhub%2Facp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhangbinhub%2Facp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhangbinhub%2Facp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhangbinhub%2Facp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zhangbinhub","download_url":"https://codeload.github.com/zhangbinhub/acp/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248137998,"owners_count":21053775,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["java11","kotlin","spring-boot","spring-cloud","spring-cloud-alibaba"],"created_at":"2024-09-24T20:50:49.148Z","updated_at":"2025-04-10T00:43:15.642Z","avatar_url":"https://github.com/zhangbinhub.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Application Construction Platform (acp)\n\n**此项目已不再更新，由于某些不可抗因素，已转移至https://gitee.com/zhangbinhub/acp**\n\n[![Maven central](https://maven-badges.herokuapp.com/maven-central/io.github.zhangbinhub.acp.dependency/acp-dependency/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.github.zhangbinhub.acp.dependency/acp-dependency)\n[![Spring Boot](https://img.shields.io/badge/SpringBoot-2.6.x-brightgreen)](https://projects.spring.io/spring-boot)\n[![Spring Cloud](https://img.shields.io/badge/SpringCloud-2021.0.1-brightgreen)](https://projects.spring.io/spring-cloud)\n[![Spring Cloud Alibaba](https://img.shields.io/badge/SpringCloudAlibaba-2021.0.1.0-brightgreen)](https://github.com/alibaba/spring-cloud-alibaba)\n[![Kotlin](https://img.shields.io/badge/Kotlin-\u003e1.5-blue)](https://kotlinlang.org/)\n[![Jvm](https://img.shields.io/badge/Jvm-\u003e=1.8-blue)](http://hg.openjdk.java.net/)\n[![Gradle](https://img.shields.io/badge/Gradle-\u003e6.5-blue)](https://gradle.org/)\n[![License](http://img.shields.io/badge/license-Apache%202-brightgreen)](http://www.apache.org/licenses/LICENSE-2.0.html)\n\n###### v2021.0.2 [版本更新日志](doc/version_history.md)\n\n- Application Construction Platform 应用构建平台\n- 该项目是用Kotlin和Java语言混编封装的脚手架。本人会密切关注业界最新动态，并使用最新技术持续更新优化。\n- 使用该脚手架可快速搭建基于Kotlin或Java语言的普通应用、SpringBoot应用和SpringCloud应用。\n- 从v2021.0.0开始，版本号命名规范改变，前两位大版本号与所使用的SpringCloud版本号一致，第三位小版本号迭代更新，同时将发布至Maven Central\n- 正式版发布前，Maven Central仅提供java 11版本，可自行在[project.properties](project.properties)中修改编译时的`javaVersion`\n- 正式版发布后，默认是java 11版本，同时还会提供java 1.8版本，版本号带后缀`-jdk8`\n\n## 相关组件版本及官方文档\n\n- [Spring Boot 2.6.x](https://projects.spring.io/spring-boot)\n- [Spring Cloud 2021.0.1](http://projects.spring.io/spring-cloud)\n- [Spring Cloud Alibaba 2021.0.1.0](https://github.com/alibaba/spring-cloud-alibaba)\n\n## 技术栈\n\n- joda-time\n- okhttp\n- netty\n- xstream\n- hibernate\n- jackson\n- poi\n- freemarker\n- flying-saucer-pdf-itext5\n- knife4j (使用时，参考[启动异常解决方案](https://gitee.com/xiaoym/knife4j/issues/I4NAV8))\n- junit5\n- nacos\n- sentinel\n- spring-cloud-alibaba\n- spring-cloud\n    - spring-boot\n        - spring-aop\n        - spring-data-jpa\n        - spring-security\n        - spring-security-oauth2\n        - spring-data-redis\n        - spring-boot-actuator\n    - spring-data-redis-reactive\n    - spring-boot-admin-server\n    - spring-cloud-gateway\n    - spring-cloud-stream-binder-kafka\n    - spring-cloud-openfeign\n    - spring-cloud-bus-kafka\n\n## 一、环境要求及开发语言\n\n- java 1.8+\n- gradle 6.5+\n- kotlin 1.5+\n\n## 二、gradle 脚本配置及使用\n\n### （一）配置文件\n\n##### 1.[gradle/dependencies.gradle](gradle/dependencies.gradle)\n\n定义外部依赖版本号\n\n##### 2.[settings.gradle](settings.gradle)\n\n定义项目/模块结构\n\n##### 3.[project.properties](project.properties)\n\ngradle全局参数：\n\n- gradleVersion：gradle版本号\n- group：对应打包时的最外层groupid，最终的groupid还会加上模块路径，例如`groupid.acp.core`\n- version：版本号\n- encoding：编译字符集\n- mavenCentralUrl：maven中央仓库地址\n- javaVersion：jdk版本号\n\n##### 4.[build.gradle](build.gradle)\n\n公共构建脚本\n\n##### 5.模块根路径/build.gradle\n\n单个模块特有的构建脚本\n\n### （二）自定义任务（在公共构建脚本中定义）\n\n- clearPj 清理所有输出文件\n- release 编译、打包并输出\n    - 如需编译打包对应环境，命令中使用参数 active，例如\n  ```\n  gradlew project:release -Pactive=test\n  ```\n\n### （三）发布至maven仓库\n\n##### 1、发布至本地仓库\n\n- 执行 publishToMavenLocal 任务\n\n##### 2、发布至私服\n\n- 项目根路径下创建 gradle.properties 并添加如下参数（参数值根据实际情况修改）\n\n```\nmavenUploadUrlRelease=https://maven.com/repositories/releases/\nmavenUploadUrlSnapshot=https://maven.com/repositories/snapshot/\nmavenUserName=username\nmavenPassword=password\n```\n\n- 执行 publish 任务\n\n##### 3、发布至中央仓库\n\n- 项目根路径下创建 gradle.properties 并添加如下参数（参数值根据实际情况修改）\n\n```\nmavenUploadUrlRelease=https://maven.com/repositories/releases/\nmavenUploadUrlSnapshot=https://maven.com/repositories/snapshot/\nmavenUserName=username\nmavenPassword=password\nsigning.keyId=shortId\nsigning.password=keyPassword\nsigning.secretKeyRingFile=keyFile\n```\n\n- 执行 publish 任务\n\n### （四）升级命令\n\n``\ngradlew wrapper --gradle-version=7.4 --distribution-type=all\n``\n\n## 三、工程说明\n\n- doc目录下的files文件夹，当需要用到时放到打包后的jar同目录下即可\n- 工程全局默认使用 UTF-8 字符集\n- dependency 目录下为 acp-dependency 依赖管理组件\n- core 目录下为核心组件模块\n- boot 目录下为基于 Spring Boot 的自动配置组件模块\n- cloud 目录下为基于 Spring Cloud 的自动配置组件模块\n- gradle 目录下为相关配置文件\n- test 目录下为测试工程\n- api document url : /doc.html\n\n## 四、开发 SpringBoot 应用\n\n引入 acp 下相应模块包，使用 acp-dependency 进行版本管理，例如：\n\n```groovy\ndependencyManagement {\n  imports {\n    mavenBom(\"io.github.zhangbinhub.acp.dependency:acp-dependency:2021.0.2\")\n  }\n}\n```\n\n### （一）模块说明，具体API文档请查看各模块 javadoc\n\n##### 1. acp:acp-core\n\n- 核心包\n- 封装了常用工具类，包括jdbc、配置文件解析（xml、properties）、加解密算法、线程池、定时任务、四则运算、json处理、字符串处理\n\n##### 2. acp:acp-packet\n\n- 通讯打解包组件\n- 依赖 acp-core\n- 封装了http数据包、iso8583报文、xml报文的打解包操作\n\n##### 3. acp:acp-client\n\n- 客户端组件包\n- 依赖 acp-packet\n- 封装了http、https、tcp、udp的客户端\n\n##### 4. acp:acp-ftp\n\n- 应用扩展组件\n- 依赖 acp-core\n- 封装支持 ftp/sftp 服务端及客户端\n\n##### 5. acp:acp-file\n\n- 文件处理组件包\n- 依赖 acp-core\n- 封装了excel、pdf、word、html、freemarker模板文件的读写转换等操作\n\n##### 6. acp:acp-message\n\n- 消息处理组件包\n- 依赖 acp-core\n- 封装了发送email\n\n##### 7. boot:acp-spring-boot-starter\n\n- springboot 应用扩展组件\n- 依赖 acp-client\n- 在 springboot 基础上整合大量底层功能，扩展支持 tcp、udp 等协议服务端配置；同时封装定时任务\n- 提供一个 Spring Boot 的```InfoContributor```，例如：\n  ```curl http://localhost:8080/actuator/info```\n\n  ```json\n  {\n    \"acp\": {\n      \"version\": \"2021.0.2\"\n    }\n  }\n  ```\n\n##### 8. boot:acp-spring-boot-starter-ftp\n\n- springboot 应用扩展组件\n- 依赖 acp-spring-boot-starter\n- 扩展支持 ftp、sftp 等协议服务端自动配置\n\n### （二）快速开发 springboot 应用\n\n##### 全局说明\n\n- 统一注入 io.github.zhangbinhub.acp.boot.interfaces.LogAdapter 进行日志记录\n\n##### 1. 开发说明\n\n- （1）参考 test:testspringboot\n- （2）依赖 boot:acp-spring-boot-starter\n- （3）src/main/java/resources 中增加配置文件（测试配置文件在 src/test/resources）config 下的文件和 acp.properties 为选用\n- （4）yml配置文件中增加数据源配置（单数据源或多数据源），数据库操作遵循 spring-data-jpa 标准，使用 hibernate 进行实例化\n- （5）单数据源应用的话无需增加额外配置类，正常编写domain、repo、entity即可\n- （6）多数据源应用需要增加对应每个数据源的 Jpa 配置类，并创建对应数据源的 repo、entity 包，之后再在对应包中编写 repo 和 entity\n- （7）定时任务参考 test:testspringboot 模块 io.github.zhangbinhub.acp.test.application.task.Task1，继承\n  io.github.zhangbinhub.acp.boot.base.BaseSpringBootScheduledTask 类，并在 yml 配置文件中增加对应执行规则\n- （8）自定义系统初始化任务，新增任务类，继承 io.github.zhangbinhub.acp.boot.base.BaseInitialization 类\n- （9）自定义可控制监听器，新增监听器类，实现 io.github.zhangbinhub.acp.boot.interfaces.Listener 接口\n- （10）参考 test:testspringboot 模块,io.github.zhangbinhub.acp.test.application.test 包中有 tcp、udp 服务端开发demo，并在\n  application-dev.xml 中增加相应配置\n- （11）如有需要，可选择引入 acp-file、acp-message、acp-spring-boot-starter-ftp 等包\n\n##### 2. 配置说明\n\n- 定制开发的 api 接口，开启 swagger 文档\n\n```yaml\nacp:\n  swagger:\n    enabled: true\n```\n\n- 配置定时任务\n\n```yaml\nacp:\n  schedule:\n    cron:\n      task1: 0 0/1 * * * ?\n```\n\nkey-value 形式（可配置多个），其中 task1 为任务的 beanName；0 0/1 * * * ? 为定时执行规则cron表达式。\n\n- 输出 controller 日志\n\n```yaml\nacp:\n  controller-log:\n    enabled: true        #是否开启controller日志输出，默认true\n    no-log-uri-regular:\n      - /oauth/.*        #不进行日志输出的 url 正则表达式，可配置多个\n```\n\n- tcp 服务端\n\n```yaml\nacp:\n  tcp-server:\n    listeners:\n      - name: testSocket                                                     #监听服务名称\n        enabled: true                                                        #是否启用，默认false\n        keepAlive: false                                                     #是否为长连接，默认false；TCP服务有效\n        idletime: 10000                                                      #连接进入空闲状态的等待时间单位毫秒，默认10000；TCP服务有效\n        messageDecoder: \"\"                                                   #粘包拆包解码器 Bean 的类名，默认不设置；TCP服务有效\n        threadNumber: 100                                                    #接收报文处理的最大线程数，为0或不设置则使用系统默认线程数；TCP服务有效\n        hex: false                                                           #接收报文是否是十六进制机器码，默认false\n        port: 9999                                                           #监听端口号\n        handleBean: io.github.zhangbinhub.acp.test.application.test.TestTcpHandle             #报文接收处理 Bean 的类名\n        responsable: true                                                    #报文是否需要进行原路响应，默认true\n        charset: gbk                                                         #服务使用字符集，为空或不设置则系统默认字符集\n```\n\n- udp 服务端\n\n```yaml\nacp:\n  udp-server:\n    listeners:\n      - name: testSocket                                                     #监听服务名称\n        enabled: true                                                        #是否启用，默认false\n        hex: false                                                           #接收报文是否是十六进制机器码，默认false\n        port: 9999                                                           #监听端口号\n        handleBean: io.github.zhangbinhub.acp.test.application.test.TestTcpHandle             #报文接收处理 Bean 的类名\n        responsable: true                                                    #报文是否需要进行原路响应，默认true\n        charset: gbk\n```\n\n- ftp 服务端\n\n```yaml\nacp:\n  ftp-server:\n    listeners:\n      - name: \"测试ftp服务器\"                                                 #服务名车鞥\n        enabled: true                                                        #可空，是否启用，默认false\n        port: 221                                                            #服务端口号\n        pwd-encrypt-mode: MD5                                                #可空，用户密码加密方式（支持MD5、SHA1、SHA256），默认MD5\n        login-failure-delay: 30                                              #可空，默认30\n        max-login-failures: 20                                               #可空，默认20\n        max-logins: 10                                                       #可空，默认10\n        max-anonymous-logins: 20                                             #可空，默认20\n        max-threads: 10                                                      #可空，默认10\n        default-home-directory: \"abs:D:\\\\个人\\\\测试ftp\"                       #默认根路径\n        anonymous-login-enabled: false                                       #可空，是否允许匿名用户登录，默认false\n        anonymous-write-permission: false                                    #可空，是否允许匿名用户写操作，默认false\n        user-factory-class: io.github.zhangbinhub.acp.test.application.test.TestUserFactory   #用户工厂类\n```\n\n- sftp 服务端\n\n```yaml\nacp:\n  sftp-server:\n    listeners:\n      - name: \"测试sftp服务器\"                                                #服务名称\n        enabled: true                                                        #可空，是否启用，默认false\n        port: 4221                                                           #服务端口号\n        host-key-path: \"files/resource/key/hostkey\"                          #服务器密钥文件路径\n        password-auth: true                                                  #可空，是否进行密码登录，默认true\n        public-key-auth: false                                               #可空，是否进行证书登录（开启后仅支持证书验证），用户证书只支持openssh生成的密钥，默认false\n        key-auth-type: pem                                                   #可空，证书类型（der/pem/ssh），默认pem\n        key-auth-mode: RSA                                                   #可空，证书验证模式（RSA/DSA），默认RSA\n        default-home-directory: \"abs:D:\\\\个人\\\\测试ftp\"                       #默认根路径\n        user-factory-class: io.github.zhangbinhub.acp.test.application.test.TestUserFactory   #用户工厂类\n```\n\n### （三）启停 springboot 应用\n\n- [jvm 参考参数](doc/jvm-params.txt)\n- [启停脚本(Linux) server.sh](doc/script/server.sh)，根据实际情况修改第2行 APP_NAME 和第3行 JVM_PARAM 的值即可，和 SpringBoot 应用的 .jar 放在同一路径下\n- [启停脚本(windows) server.bat](doc/script/server.bat)，根据实际情况修改第1行末尾需要执行的 jar 名称，和SpringBoot应用的 .jar 放在同一路径下\n- Linux 命令：\n\n| 命令                  | 描述       |\n|---------------------|----------|\n| ./server.sh         | 查看可用参数   |\n| ./server.sh status  | 查看系统运行状态 |\n| ./server.sh start   | 启动应用     |\n| ./server.sh stop    | 停止应用     |\n| ./server.sh restart | 重启应用     |\n\n## 五、开发 SpringCloud 应用\n\n引入 cloud 下相应模块包，demo 位于 cloud 下，使用 acp-dependency 进行版本管理，例如：\n\n```groovy\ndependencyManagement {\n    imports {\n        mavenBom(\"io.github.zhangbinhub.acp.dependency:acp-dependency:2021.0.0-M4\")\n    }\n}\n```\n\n### （一）模块说明\n\n##### 1. cloud:acp-spring-cloud-starter\n\n原子服务公共模块：\n\n- （1）自定义程序入口注解\n- （2）oauth2.0 资源服务配置、客户端服务配置及远程单点认证机制\n- （3）自定义 feign 并发策略、自定义 feign 请求拦截\n- （4）封装日志服务客户端，发送日志消息至 kafka\n\n##### 2. test:cloud:admin-server\n\n监控界面\n\n##### 3. test:cloud:gateway-server\n\n网关服务\n\n##### 4. test:cloud:oauth-server\n\n统一认证服务：token 存储于 Redis，user 及 client 信息可扩展配置\n\n| url                   | 描述                                                   |\n|-----------------------|------------------------------------------------------|\n| /oauth/authorize      | 申请授权，basic认证保护                                       |\n| /oauth/token          | 获取token的服务，url中没有client_id和client_secret的，走basic认证保护 |\n| /oauth/check_token    | 资源服务器用来校验token，basic认证保护                             |\n| /oauth/confirm_access | 授权确认，basic认证保护                                       |\n| /oauth/error          | 认证失败，无认证保护                                           |\n\n[查看认证过程](doc/oauth2.0认证.md)\n\ntest:cloud:oauth-server 中增加 authorization_code 方式配置，详见\nio.github.zhangbinhub.acp.cloud.oauth.conf.WebSecurityConfiguration 注释\n\n注：使用 authorization_code 方式时，认证请求时需要直接访问 oauth-server 不能通过 gateway\n\n##### 5. test:cloud:log-server\n\n日志服务，使用 kafka 作为日志消息队列\n\n##### 6. test:cloud:helloworld\n\n原子服务，分别调用 hello 和 world\n\n##### 7. test:cloud:hello\n\n原子服务\n\n##### 8. test:cloud:world\n\n原子服务\n\n### （二）基础中间件环境搭建\n\n基础中间件包括：redis、zookeeper、kafka、kafka-manager、elasticsearch、kibana、logstash、zoonavigator-api、zoonavigator-web、prometheus、grafana、setup_grafana_datasource\n\n- 启动服务\n\n命令模式进入dockerfile目录，执行启动命令\n\n```bash\ndocker-compose -f docker-compose-base.yaml up -d\n```\n\n- 停止服务\n\n命令模式进入dockerfile目录，执行启动命令\n\n```bash\ndocker-compose -f docker-compose-base.yaml stop\n```\n\n- 停止并删除容器实例\n\n命令模式进入dockerfile目录，执行启动命令\n\n```bash\ndocker-compose -f docker-compose-base.yaml down\n```\n\n- docker-compose 文件：cloud/dockerfile/docker-compose-base.yaml\n\n##### 1. kafka-manager\n\nhttp://127.0.0.1:9000\n![Architecture diagram](doc/images/kafka-manager.png)\n\n##### 2. zoonavigator\n\nhttp://127.0.0.1:8004\n![Architecture diagram](doc/images/zoonavigator.png)\n\n##### 3. prometheus\n\nhttp://127.0.0.1:9090\n![Architecture diagram](doc/images/prometheus.png)\n\n##### 4. kibana\n\nhttp://127.0.0.1:5601\n![Architecture diagram](doc/images/kibana.png)\n\n### （三）组件开发\n\n##### 全局说明\n\n- 统一注入 io.github.zhangbinhub.acp.boot.interfaces.LogAdapter 进行日志记录\n\n##### 1. 可视化监控\n\n- test:cloud:admin-server\n- （1）无需改动代码\n- （2）修改 yml 配置即可\n  ![Architecture diagram](doc/images/admin-server.png)\n\n##### 2. 网关服务\n\n- test:cloud:gateway-server\n- （1）需自定义限流策略（需依赖 Redis）\n- （2）修改 yml 进行路由配置；若没有 Redis 请不要配置限流策略\n\n##### 3. 认证服务\n\n- test:cloud:oauth-server\n- （1）依赖 cloud:acp-spring-cloud-starter，按需依赖 org.springframework.boot:spring-boot-starter-data-redis\n- （2）入口类增加注解 @AcpCloudOauthServerApplication\n- （3）配置中增加\n  ```yaml\n  acp:\n    cloud:\n      oauth:\n        oauth-server: true\n  ```\n- （3）需定制 UserPasswordEncoder 用户密码编码器，配置进 WebSecurityConfiguration\n- （4）需定制用户（信息、角色、权限）初始化和查询方式 SecurityUserDetailsService，配置进 AuthorizationServerConfiguration\n- （5）需定制客户端（信息）初始化和查询方式 SecurityClientDetailsService，配置进 AuthorizationServerConfiguration\n- （6）token 持久化方式为 Redis，配置在 AuthorizationServerConfiguration；若没有 Redis 可根据注释持久化到内存，也可自行开发其他持久化方式\n\n##### 4. 日志服务（依赖 kafka）\n\n- （1）依赖 cloud:acp-spring-cloud-starter\n- （2）入口类增加注解 @AcpCloudAtomApplication\n- （3）如需自定义日志消息处理，新增Bean实现 io.github.zhangbinhub.acp.cloud.log.consumer.LogProcess 接口，并且增加 @Primary 注解\n- （4）根据各服务配置的日志类型（默认为\"ALL\"），在 logback-spring.xml 中参照 ALL 和 ALL-LOGSTASH 进行配置\n-     a. 配置两个 appender（一个输出到本地文件，一个输出到logstash；单独配置的目的是为了将不同类型的日志写入不同名称的文件并在elasticsearch中创建不同的索引）\n-     b. 之后再配置一个 logger （name属性为某个日志类型）,包含之前配置的两个 appender\n-     c. 强烈建议 logback-spring.xml 中配置的本地日志文件路径需与 yml 中的 logging.file.path 一致，方便统一管理\n- （5）增加配置\n  ```yaml\n  acp:\n    cloud:\n      log-server:\n        enabled: true #是否开启日志服务\n  ```\n\n##### 5. 原子服务\n\n- （1）依赖 cloud:acp-spring-cloud-starter\n- （2）参考 四、开发 SpringBoot 应用\n- （3）原子服务即 SpringBoot 应用，引入额外的 spring-cloud 包，并在 yml 中增加相应配置\n- （4）参考 test:cloud:hello、test:cloud:world、test:cloud:helloworld，入口类增加注解 @AcpCloudAtomApplication\n- （5）如果存在日志服务，则需进行配置\n   ```yaml\n   acp:\n     cloud:\n       log-server:\n         client:\n           enabled: true #是否启用日志服务\n           log-type: ALL #当前服务的日志类型，默认ALL，也自定义；自定义的类型需要在日志服务中参照ALL配置appender和logger\n   ```\n- （6）如果不存在日志服务，需要排除依赖\n   ```groovy\n   exclude group: 'org.springframework.cloud', module: 'spring-cloud-starter-stream-kafka'\n   ```\n- （7）可自定义token验证异常（新建 Bean 实现 org.springframework.security.web.AuthenticationEntryPoint 接口）和权限异常（新建 Bean 实现\n  org.springframework.security.web.access.AccessDeniedHandler）返回信息，若有多个实现接口的 Bean，则需要通过如下配置显示指定\n   ```yaml    \n  acp:\n    cloud:\n      oauth:\n        auth-exception-entry-point: AuthExceptionEntryPoint         #自定义 token 异常 bean 名称\n        access-denied-handler: CustomAccessDeniedHandler            #自定义权限异常 bean 名称\n   ```\n- （8）如有特殊需要不进行认证的url（例如\"/customer\"），则增加resource-server-permit-all-path配置；如有需要进行认证的url（例如\"/customer2\"\n  ），则增加resource-server-security-path配置\n   ```yaml    \n  acp:\n    cloud:\n      oauth:\n        resource-server-permit-all-path: \n          - /customer\n        resource-server-security-path:\n          - /customer2\n   ```\n- （9）如果原子服务不需要加入统一认证体系中，即不需要进行访问权限验证，则增加配置\n   ```yaml    \n  acp:\n    cloud:\n      oauth:\n        resource-server: false #是否是资源服务器\n   ```\n- （10）特别需要注意： 即使不需要加入统一认证体系中，如果请求的 header 中包含 Authorization， oauth2 还是会进行身份认证！ 所以仍然需要正确进行如下配置，否则 oauth2 进行身份认证时将会抛出异常\n  com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server\n  或调用端身份认证失败：status 401\n   ```yaml    \n  security:\n    oauth2:\n      resource:\n        token-info-uri: http://server-oauth2/open/inner/check-token\n   ```\n\n## 六、打包为 docker 镜像\n\n自行编写 Dockerfile，使用命令单独执行或使用 docker-compose 批量执行，请自行百度\n\n## 七、[Sentinel 动态数据源配置](doc/sentinel.md)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzhangbinhub%2Facp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzhangbinhub%2Facp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzhangbinhub%2Facp/lists"}