Staffjoy代码解析 01

发布时间 2024-01-08 09:02:53作者: ukyo--BlackJesus

Staffjoy是来自架构师波波的k8s系列课程里的课程用代码,这里稍做记录来记录一些之前未见过的编程方式、
所体现出来的编程思想、为什么可以用这套代码来配合k8s等等问题、理解.

首先这个没看过,是在Springboot中@RequestBody @Validated 去验证一个post传送请求体验证时的一个注解:

package xyz.staffjoy.common.validation;

public interface Group1 {
}

那这个接口Group1很奇怪,我原本以为是对群组的抽象层,用于接收子类参数,但实际不是:

package xyz.staffjoy.company.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import xyz.staffjoy.common.validation.DayOfWeek;
import xyz.staffjoy.common.validation.Group1;
import xyz.staffjoy.common.validation.Group2;
import xyz.staffjoy.common.validation.Timezone;

import javax.validation.constraints.NotBlank;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class CompanyDto {
    @NotBlank(groups = {Group1.class})
    private String id;
    @NotBlank(groups = {Group1.class, Group2.class})
    private String name;
    private boolean archived;
    @Timezone(groups = {Group1.class, Group2.class})
    @NotBlank(groups = {Group1.class, Group2.class})
    private String defaultTimezone;
    @DayOfWeek(groups = {Group1.class, Group2.class})
    @NotBlank(groups = {Group1.class, Group2.class})
    private String defaultDayWeekStarts;
}

看上面的DTO,发现groups其实在@NotBlank等相关注解中作为子参数可配置,最终了解到这个其实是可以作为
验证激活选项的:

    @PostMapping(path = "/create")
    GenericCompanyResponse createCompany(@RequestHeader(AuthConstant.AUTHORIZATION_HEADER) String authz,
                                         @RequestBody @Validated({Group2.class}) CompanyDto companyDto);

也就是这样的话,其激活验证的只有分组2(Group2)的相关字段,上例中,可以看到只有:

name, defaultTimezone, defaultDayWeekStarts.

很明显也可以得出,如果defaultTimezone的@NotBlank的groups只有Group1.class配置时,对于上述接口,其验证非空字符串的验证也是不进行验证的,而只进行@Timezone的验证.


昨天把K8s的特点大概整理了下:

K8s (Kubernetes) 是一个开源的容器编排平台、用于自动化应用程序容器的部署、扩展和管理.它旨在提供更好的方式来部署、扩展和管理容器化应用程序、同时确保应用程序能够在分布式环境中得到高效运行.

Kubernetes的主要特点包括:

1.自动化部署: K8s能够确保容器化应用程序的部署满足您的要求、并提供一个一致的环境,从而简化应用的发布过程.
2.自动扩展: K8s可以根据实际负载自动调整容器数量,以确保应用程序能够在高峰期得到高效运行.
3.自我修复: K8s能够检测并替换失败的容器,确保应用程序始终正常运行.
4.负载均衡: K8s可以自动分配网络流量到不同的容器,以便在多个容器间分摊负载,提高应用的可用性.
5.服务发现: K8s内置了服务发现功能,使得容器可以根据服务名称自动发现并与其他容器通信.
6.存储编排: K8s可以自动挂载您所选的存储系统,例如本地存储、公共云提供商等.
7.安全和合规性: K8s可以确保应用程序和相关的数据在容器之间得到隔离,并提供许多安全特性,如网络策略、角色访问控制等.
8.高度可扩展: K8s的设计使其能够在大规模集群中高效运行,同时支持多租户和多集群管理.
9.社区支持: K8s拥有一个活跃的社区,不断为其发展提供新的功能和优化.
10.企业支持: 许多公司提供K8s的商业支持,包括谷歌、Red Hat、IBM等.

总之,K8s是一个强大的容器编排平台,可以帮助您更轻松地管理容器化应用程序,并确保其在分布式环境中的高效运行.


接下来是另一个验证注解类:

    @NotBlank
    @PhoneNumber
    private String phoneNumber;

这个注解类明显的作用就是验证字段是否符合手机号,但是实际没有拦截器来进行字段判定,而是直接通过第7行代码来通过validatedBy进行了电话号码验证:

package xyz.staffjoy.common.validation;

import javax.validation.Constraint;
import java.lang.annotation.*;

@Documented
@Constraint(validatedBy = PhoneNumberValidator.class)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface PhoneNumber {
    String message() default "Invalid phone number";
    Class[] groups() default {};
    Class[] payload() default {};
}

PhoneNumberValidator:

package xyz.staffjoy.common.validation;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class PhoneNumberValidator implements ConstraintValidator<PhoneNumber, String> {

    @Override
    public boolean isValid(String phoneField, ConstraintValidatorContext context) {
        if (phoneField == null) return true; // can be null
        return phoneField != null && phoneField.matches("[0-9]+")
                && (phoneField.length() > 8) && (phoneField.length() < 14);
    }
}

虽然这个类中验证手机号并不完全尊循11位电话的原则,但是实际上我们只通过其实现来看验证即可,其实现了javax.validation.ConstraintValidator,将验证注解和字段类型放入范型,然后重写

isValid(T field,ConstraintValidatorContext context)

方法即可.