优惠券系统

开始愉快的项目复盘!

注解

  • @nullable:表示注入的元素可以为null值,不进行处理,当注入方法时候表示可能方法返回值为null
  • @RestControllerAdvice:是 Spring 框架中用于统一处理异常和全局响应的注解。
  • @NoArgsConstructor:注解的作用是生成一个无参构造函数。
  • @AllArgsConstructor:注解的作用是生成一个包含所有参数的构造函数。
  • @Slf4j:注解的作用是自动生成一个日志对象。
  • @target:这个注解用于指定被它修饰的注解可以应用在哪些地方。在这里,被修饰的注解可以应用在类或接口上(ElementType.TYPE),以及方法上(ElementType.METHOD)。
  • @Retention(RetentionPolicy.RUNTIME): 这个注解用于指定被它修饰的注解的生命周期。在这里,被修饰的注解会在运行时保留,这意味着可以通过反射来读取和使用这个注解。
  • @Documented: 这个注解用于指定被它修饰的注解会被 javadoc 工具包含在文档中。如果一个注解有 @Documented 注解,那么在生成 Java 文档时,该注解会被包含在文档中,以便开发者能够看到它们。
  • @PostMapping 注解用于将一个方法映射到处理 HTTP POST 请求的控制器方法上。当客户端向服务器发送 POST 请求时,Spring MVC 将根据请求的 URL 映射到带有 @PostMapping 注解的方法,并且该方法会被调用来处理该请求。
  • @GetMapping 注解用于将一个方法映射到处理 HTTP GET 请求的控制器方法上。当客户端向服务器发送 GET 请求时,Spring MVC 将根据请求的 URL 映射到带有 @GetMapping 注解的方法,并且该方法会被调用来处理该请求。
  • @Service 注解可以将一个类标记为服务类,使得 Spring 在进行组件扫描时能够将其识别为服务组件并进行相应的实例化和管理。
  • @Controller 注解用于标记一个类为控制器类
  • @ResponseBody 注解用于指示 Spring MVC 框架将方法返回的对象直接作为 HTTP 响应的主体内容发送给客户端
  • @Component注解通常作用于具体的类上,例如普通的Java类、服务类、DAO(数据访问对象)类等。当Spring Boot应用启动时,Spring容器会扫描指定包及其子包下所有被@Component注解标记的类,并将它们实例化为Spring Bean,使得它们可以被其他组件或类自动注入使用。
  • @Autowired 注解通常作用于类的属性上,例如JavaBean的属性、Service类或Controller类的参数等。当Spring容器扫描到被@Autowired注解标记的属性时,它会尝试自动注入该属性对应的Spring Bean。省流:从bean中拿过来使用

  • 统一响应:统一响应通常是指在开发中,为了方便处理不同接口返回的结果,将所有的响应结果进行统一封装,以便客户端能够更方便地处理这些响应。
  • 统一异常处理:统一异常处理是指在开发中,为了方便处理各种异常情况,将所有的异常情况进行统一封装,以便在整个系统中能够更方便地处理异常。
  • 异步如何实现,使用google包下面的stopwatch类进行计时,使用异步线程池进行处理

AccessLogFilter:

实现Filter接口,重写doFilter方法,在方法中获取请求的url,请求的ip,请求的参数,请求的响应

方法

*

思想

  • 统一响应: 按照一个固定的格式进行包装,判断是不是需要的格式,如果是需要的格式,就进行处理,如果不是需要的格式,就进行包装,总的来说,beforeBodyWrite是一个包装的过程
  • java开发中的分包规范(alibaba)

DO(Data Object):此对象与数据库表结构一一对应,通过 DAO层向上传输数据源对象。

DTO(Data Transfer Object):数据传输对象,Service 或Manager 向外传输的对象。

BO(Business Object):业务对象,可以由Service层输出的封装业务逻辑的对象。

Query:数据查询对象,各层接收上层的查询请求。注意超过2 个参数的查询封装,禁止使用 Map 类 来传输。

VO(View Object):显示层对象,通常是 Web 向模板渲染引擎层传输的对象。

这里的vo(value object):应该是从DDD(领域驱动设计)中的概念,也是指方法间传的对象,具有以下的特点

  • 不可变性(Immutability):Value Object 的值在创建后不能被修改,任何修改都会导致创建一个新的对象。这种不可变性保证了对象的一致性和稳定性。

  • 等同性(Equality):Value Object 通常根据其属性值来判断是否相等,而不是根据对象的标识符。如果两个 Value Object 的属性值相同,那么它们就被认为是相等的。

  • 值语义(Value Semantics):Value Object 表示的是某个值或概念,而不是实体。它们的主要作用是为了表示某种特定的值,而不是为了标识某个独立的实体。
    PO(Persistent Object):持久层对象,由 DAO 层输出的对象。

区分一下vo包和constant包

constant 包通常用于存放项目中的常量,例如配置项、枚举值、错误码、状态码等。这些常量是固定不变的值,在程序中被多次引用。 将常量放置在一个独立的包中有助于代码的组织和管理,使得开发人员更容易找到和维护这些常量。此外,通过将常量放置在一个独立的包中,可以避免常量与其他类或模块的命名冲突,提高了代码的可读性和可维护性。

vo 包通常用于存放值对象(Value Object),即一些与业务相关的数据对象,这些对象通常用于数据的传输和封装,而不包含业务逻辑。 值对象通常包含了多个字段(Attributes),代表了一些实体或概念的属性集合。这些对象用于在不同的层(如控制器、服务、持久化层)之间传输数据,以实现业务功能的处理和交互。 将值对象放置在一个独立的包中有助于对数据模型进行组织和管理,使得数据结构更加清晰和易于理解。同时,通过使用值对象,可以将业务逻辑与数据传输逻辑分离开来,提高了代码的可维护性和可扩展性。

## 业务思想 ### 优惠券模板微服务 核心点有: * 优惠券模板的创建 * 生成对应数量的优惠券 * 最后用户才可以进行领取

优惠券模板创建的流程:

  1. 开启异步服务,进行生成模板,生成需要的数量优惠券,并且生成模板的优惠券码
  2. 根据优惠券码进行优惠券生成,并且将优惠券码进行保存

zuul网关的四个过滤器的核心功能

  • PRE(前置过滤器):在请求被路由到目标服务之前执行。这些过滤器可以用来执行认证、授权、日志记录、请求参数校验等操作。如果请求不符合预期,可以在这里进行拦截或修改。
  • ROUTE(路由过滤器):在请求被路由到目标服务时执行。这些过滤器通常用来将请求发送到目标服务,可以在发送请求之前或之后对请求进行修改或记录。
  • POST(后置过滤器):在目标服务处理完请求并生成响应之后执行。这些过滤器可以对响应进行修改、记录、过滤等操作。例如,添加响应头、统计响应时间等。
  • ERROR(错误过滤器):在处理请求过程中发生错误时执行。这些过滤器可以处理错误并提供友好的错误响应,或记录错误信息以便后续排查问题。

/?
你是如何保证优惠券码的唯一性的?你有没有考虑过分布式锁或者雪花算法等方案?
你是如何实现熔断兜底策略的?你有没有使用Hystrix或者Sentinel等框架?你是如何配置熔断的触发条件和恢复机制的?
你是如何测试和监控你的微服务的?你有没有使用JMeter或者Gatling等压力测试工具?你有没有使用Prometheus或者Grafana等监控工具?
你是如何保证你的微服务的高可用和负载均衡的?你有没有使用Ribbon或者Feign等客户端负载均衡工具?你有没有使用Nginx或者Traefik等服务端负载均衡工具?
你是如何管理你的微服务的配置信息的?你有没有使用Spring Cloud Config或者Apollo等分布式配置中心?你有没有使用Spring Cloud Bus或者Kafka等消息总线来实现配置的动态刷新?