2024-02-20|RateLimitAspect请求限流、调整spring-cloud-examples项目结构

今天做了什么: ChatGPT 编写一个 RateLimitAspect 类,实现基于用户的 get 查询请求的限流功能 @Aspect @Component public class RateLimitAspect { private final RedisTemplate<String, Object> redisTemplate; private final Logger logger = LoggerFactory.getLogger(RateLimitAspect.class); private final int maxRequests; // Maximum number of requests private final int timeWindow; // Time window in seconds @Autowired public RateLimitAspect(RedisTemplate<String, Object> redisTemplate) { this.redisTemplate = redisTemplate; this.maxRequests = 100; // Default maximum number of requests is 100 this.timeWindow = 60; // Default time window is 60 seconds } @Before("@annotation(getMapping)") public void applyRateLimit(JoinPoint joinPoint, GetMapping getMapping) { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); if (request != null && HttpMethod.GET.matches(request.getMethod())) { String username = request.getUserPrincipal().getName(); // Get the username if (username !...

2024-02-19|foodie-cloud集成Sharding Sphere实现读写分离

今天做了什么: 重构 foodie-cloud 项目 基于 docker 实现数据库配置主从复制,集成 Sharding Sphere 实现读写分离

2024-02-18|NewRelice应用性能监控、6个Diagrams工具、foodie-food测试

今天做了什么: NewRelice:应用性能监控 https://www.cnblogs.com/caoweixiong/p/14798449.html Top 6 Tools to Turn Code into Beautiful Diagrams : Diagrams Go Diagrams Mermaid PlantUML ASCII diagrams,asciiflow & monodraw Markmap foodie-cloud 项目 测试 resilience4j 使用 bash 测试接口:test-em-all.sh 使用 docker 部署项目

2024-02-05|Spring Cloud Config快速入门

今天做了什么: 创建项目 spring-cloud-examples,测试 Spring Cloud Config 使用本地文件和 git 仓库作为配置中心 Spring Cloud Config 是一个基于http协议的远程配置实现方式。通过统一的配置管理服务器进行配置管理,客户端通过http协议主动的拉取服务的的配置信息,完成配置获取。 Spring Cloud Config 支持以下几种存储方式: Git 仓库 本地文件 Vault JDBC 数据库 本文主要分享 Spring Cloud Config 使用本地文件和Git 仓库存储配置文件、配置文件加解密、集成 Spring Cloud Bus 等内容,源码在 github:spring-cloud-examples。 本地文件 服务端应用 1. 创建项目 首先,创建一个目录 mkdir spring-cloud-examples cd spring-cloud-examples 然后,创建 config 目录,并使用 spring cli 创建一个 maven 项目,项目名称 config-server-file mkdir config cd config spring init \ --boot-version=3.2.2 \ --type=maven-project \ --java-version=8 \ --name=config-server-file \ --package-name=com.chensoul.springcloud \ --groupId=com.chensoul.springcloud \ --dependencies=cloud-config-server,actuator \ config-server-file ​ 项目创建成功之后,将 spring-boot-starter-parent 版本改为 2.7.18,对应的将 spring-cloud.version 改为 2021.0.9。 2. 添加 @EnableConfigServer 注解 @EnableConfigServer @SpringBootApplication public class ConfigServerFileApplication { public static void main(final String[] args) { SpringApplication.run(ConfigServerFileApplication.class, args); } } 3....

2024-02-04|foodie-cloud集成Resilience4j

今天做了什么: 重构 foodie-cloud 项目 集成 Resilience4j 修改 README.md 文档 阅读博客 https://blog.csdn.net/weixin_42189048 Enum + Validation 的个人最佳实践 demo 分享

2024-02-02|foodie-cloud集成Spring Cloud Config和SpringDoc

今天做了什么: 参考 《Microservices with Spring Boot 3 and Spring Cloud》,重构 foodie-cloud 项目 集成 Spring Cloud Config 使用文件保存配置文件 集成 SpringDoc OpenAPI 基于 Javadoc 生成 API 文档 todo: 集成 Resilience4j 集成 Zipkin 部署到 Kubernetes 集成 EFK 集成 Spring Cloud Bus

2024-02-01|使用 Spring Initializr 创建项目

今天做了什么: 重构 foodie-cloud 项目,部署到 docker 容器 使用 Spring Initializr 创建项目 使用 Spring Initializr 创建项目 安装 spring cli 使用 brew 安装的 spring cli 版本是 3.x 版本 brew tap pivotal/tap brew install springboot 使用 sdkman 安装: sdk install springboot 3.2.2 查看版本: $ spring version Spring CLI v3.2.2 查看 spring cli 支持的命令 spring help 查看 init 命令说明: spring help init 参考 spring init 命令: spring init --list 可以看到支持的依赖 activemq actuator amqp artemis azure-active-directory azure-cosmos-db azure-keyvault azure-storage azure-support batch cache camel cloud-bus cloud-config-client cloud-config-server cloud-contract-stub-runner cloud-contract-verifier cloud-eureka cloud-eureka-server cloud-feign cloud-function cloud-gateway cloud-gateway-reactive cloud-gcp cloud-gcp-pubsub cloud-gcp-storage cloud-loadbalancer cloud-resilience4j cloud-starter cloud-starter-consul-config cloud-starter-consul-discovery cloud-starter-vault-config cloud-starter-zookeeper-config cloud-starter-zookeeper-discovery cloud-stream cloud-task codecentric-spring-boot-admin-client codecentric-spring-boot-admin-server configuration-processor data-cassandra data-cassandra-reactive data-couchbase data-couchbase-reactive data-elasticsearch data-jdbc data-jpa data-ldap data-mongodb data-mongodb-reactive data-neo4j data-r2dbc data-redis data-redis-reactive data-rest data-rest-explorer datadog db2 derby devtools dgs-codegen distributed-tracing docker-compose dynatrace flyway freemarker graphite graphql groovy-templates h2 hateoas hilla hsql influx integration jdbc jersey jooq kafka kafka-streams liquibase lombok mail mariadb modulith mustache mybatis mysql native new-relic oauth2-authorization-server oauth2-client oauth2-resource-server okta oracle picocli postgresql prometheus pulsar pulsar-reactive quartz restdocs rsocket scs-config-client scs-service-registry security sentry session solace spring-shell sqlserver testcontainers thymeleaf timefold-solver unboundid-ldap vaadin validation wavefront web web-services webflux websocket zipkin 支持的构建系统有:...

2024-01-31|Redis事务

今天做了什么: 下载 《Microservices with Spring Boot 3 and Spring Cloud》,源码在 github Redis 事务 Redis事务 原理 Redis 是一个内存数据库,它支持事务操作。Redis 事务是一系列的命令操作,这些命令会被一起执行,要么全部成功,要么全部失败。在事务执行期间,其他客户端提交的命令不会被插入到事务中,确保事务的原子性。 Redis 事务使用以下命令进行管理: MULTI:标记事务的开始。 EXEC:执行事务中的所有命令。 DISCARD:取消事务,放弃之前的所有命令。 WATCH:监视一个或多个键,如果在事务执行之前有其他客户端对这些键进行了修改,则事务会被中止。 UNWATCH:取消对所有键的监视。 在执行事务之前,先使用 MULTI 命令标记事务的开始,然后按顺序执行多个命令。在所有命令都被添加到事务队列之后,使用 EXEC 命令来执行事务中的所有命令。如果执行成功,事务中的所有命令会被一起执行,然后返回结果。如果在执行事务期间发生错误,事务会被中止,所有的修改都会被回滚。 示例 以下是一个使用 Redis 事务的示例: #开启事务 MULTI SET key1 "value1" SET key2 "value2" GET key1 GET key2 #执行事务 EXEC # 取消事务 discard 上述事务包含了两个 SET 命令和两个 GET 命令。在 EXEC 命令执行之后,将会依次执行这些命令,并返回相应的结果。 需要注意的是,Redis 的事务是乐观锁,并不会在执行期间对键进行加锁。因此,在使用事务时要注意并发操作可能引发的竞态条件。 Redis对于命令执行错误处理,有两种解决方式: 语法错误(编译) 执行错误(运行) 语法错误:执行命令的语法不正确。 #开启事务 multi #命令 set name zhangsan set age seterror sex male #执行事务 exec #获取正确指令数据 get name 此时整个事务队列中,存在一条正确指令,两条语法错误指令, 当执行exec后,会直接返回错误,正确的命令也不会执行。 执行错误:命令在运行过程中出现错误。 #开启事务 multi #命令 set lesson java rpush lesson eureka feign nacos set lesson redis #执行事务 exec #获取数据 get lesson 通过上面事务执行可以看到,语法本身是没有问题的,所以运行之前redis无法发现错误,但是在执行时出现了错误,因此只会错误的命令不执行, 而正确的命令仍然能够正常执行。...

2024-01-30|Mybatis plus和Jackson配置

今天做了什么: 重构 foodie-cloud 项目 参考 DDD 组织包结构 Mybatis plus 配置主键生成策略和数据审计功能 Jackson 配置日期序列化 重构 foodie-cloud 项目 Mybatis plus 配置主键生成策略 实体类中可以不用添加@TableId,减少实体类对 mybatis-plus-annotation的依赖 public class BaseEntity implements Serializable { private Long id; private LocalDateTime createTime; private LocalDateTime updateTime; } 改为使用配置: mybatis-plus: global-config: db-config: id-type: ASSIGN_ID Mybatis plus 配置数据审计功能 添加下面的类 @Component @Slf4j public class CustomMetaObjecthandler implements MetaObjectHandler { protected static void fillValIfNullByName( final String fieldName,final Object fieldVal, final MetaObject metaObject,final boolean isCover) { // 1. 没有 set 方法 if (!metaObject.hasSetter(fieldName)) { return; } // 2. 如果用户有手动设置的值 if (metaObject.getValue(fieldName) != null && !isCover) { return; } // 3. field 类型相同时设置 final Class<?> getterType = metaObject.getGetterType(fieldName); if (ClassUtils....

2024-01-29|C4架构模型

今天做了什么: 重构 foodie-cloud 项目 C4 架构模型 C4架构模型 C4 架构模型是一种简洁且易于理解的软件架构描述方法,由 Simon Brown 提出。C4 表示 Context, Containers, Components, and Code,这四个层级帮助我们组织和描述软件系统的不同抽象层次。 以下是 C4 架构模型的四个层级: Context(上下文):这是最高级别的层级,用于描述系统的整体环境和目标。在这个层级,我们关注系统与外部实体(如用户、其他系统、硬件设备等)的交互。可以使用上下文图(Context Diagram)来展示系统和相关实体之间的关系。 Containers(容器):这个层级用于描述系统内部的主要逻辑组件,通常是一个独立的运行时进程或线程。容器可以是 Web 服务器、数据库、消息队列、桌面应用等,它们在系统中承担着不同的角色和责任。通过容器图(Container Diagram),我们可以展示系统中的容器及其之间的关系。 Components(组件):这个层级用于进一步划分容器,描述容器内部的组织结构和组件之间的关系。组件是系统的构建块,代表了较细粒度的功能单元或模块。可以使用组件图(Component Diagram)来展示组件及其之间的关系。 Code(代码):这个层级用于描述组件内部的代码结构和实现细节。在这个层级,我们可以使用类图、包图等来展示代码级别的结构和关系。 C4 架构模型通过层级化的方式,帮助我们从高级别到低级别逐步展示和描述软件系统的不同抽象层次,使得架构描述更加清晰和易于理解。它适用于不同规模和复杂度的软件系统,并且可以方便地与其他架构描述方法(如 UML)结合使用。 参考资料: 用于软件架构的C4模型 C4 模型- 可视化架构设计- lex-wu https://c4model.com/

2024-01-29 1 min