进入新公司接触到了源码项目:pig4cloud,目前已经到了v3版本,趁参与项目中记录一下
源码下载:https://gitee.com/log4j/pig
项目组件:nacos(服务注册与发现,配置中心)、gateway (业务网关)、loadBalancer(负载均衡)、Sentinel (限流、降级和熔断)、openfeign(服务调用)
项目分了多个服务,其中固定四个服务分别是:
pig-register,pig-gateway,pig-auth,pig-upms ,pig-common
这也是项目启动顺序
本次将针对四个服务做说明,了解背景框架的可参考:https://www.yuque.com/pig4cloud/pig/shb0ye
一、pig-register
此服务主要是模块启动配置类,以及nacos服务相关接口。
Nacos 承担整个 Spring Cloud 的服务发现、配置管理部分的实现。 是整个开发过程中强依赖,启动微服务业务要去检查 Nacos Server 是否已经启动,解压安装的方式变的非常不便
1、启动类
/**
* @author nacos
*
* nacos console 源码运行,方便开发 生产从官网下载zip最新版集群配置运行
*/
@Slf4j
@EnableScheduling
@SpringBootApplication
public class PigNacosApplication {
public static void main(String[] args) {
if (initEnv()) {
SpringApplication.run(PigNacosApplication.class, args);
}
}
/**
* 初始化运行环境
*/
private static boolean initEnv() {
System.setProperty(ConfigConstants.STANDALONE_MODE, "true");
System.setProperty(ConfigConstants.AUTH_ENABLED, "false");
System.setProperty(ConfigConstants.LOG_BASEDIR, "logs");
System.setProperty(ConfigConstants.LOG_ENABLED, "false");
System.setProperty("server.port","9527");
return true;
}
}
看此启动类运行即可启动,并且会初始化运行环境,包括
String AUTH_ENABLED = “nacos.core.auth.enabled” //是否开启认证
String LOG_BASEDIR = “server.tomcat.basedir” //日志目录
String LOG_ENABLED = “server.tomcat.accesslog.enabled” //access_log日志开关
2、配置类ConsoleConfig
这个配置类在程序启动的时候,会把naming、console(自身)和config下server包的 相关接口 都缓存到了“ControllerMethodsCache”的一个map中。
二、pig-gateway
微服务架构存在多个服务项目,在项目开发中不可能让前端不停置换调用服务和接口,所以和出现了网关组件,保证前端直接调用网关可以分配到对应的服务接口。
网关不止提供对外统一接口,而且还可以做统一流量控制、熔断降级等处理,通过路由和过滤器配置作用所有的微服务。
网关三大核心:路由、断言和过滤
cloud:
gateway:
locator:
enabled: true
routes:
# 认证中心
- id: pig-auth
uri: lb://pig-auth
predicates:
- Path=/auth/**
filters:
# 验证码处理
- ValidateCodeGatewayFilter
# 前端密码解密
- PasswordDecoderFilter
#UPMS 模块
- id: pig-upms-biz
uri: lb://pig-upms-biz
predicates:
- Path=/admin/**
filters:
# 限流配置
- name: RequestRateLimiter
args:
key-resolver: '#{@remoteAddrKeyResolver}' //使用SpEL按名称引用bean
redis-rate-limiter.replenishRate: 100 //允许用户每秒处理多少个请求
redis-rate-limiter.burstCapacity: 200 //令牌桶的容量,允许在一秒钟内完成的最大请求数
三、pig-auth
主要用来处理授权服务,用户前后端分离,实现用户登陆,获取token,用户授权配置。
用户登陆成功和失败会做对应的处理,发送日志
public class PigAuthenticationSuccessEventHandler extends AbstractAuthenticationSuccessEventHandler {
/**
* 处理登录成功方法
*
* 获取到登录的authentication 对象
* @param authentication 登录对象
*/
@Override
public void handle(Authentication authentication) {
log.info("用户:{} 登录成功", authentication.getPrincipal());
SecurityContextHolder.getContext().setAuthentication(authentication);
SysLog logVo = SysLogUtils.getSysLog();
logVo.setTitle("登录成功");
// 发送异步日志事件
Long startTime = System.currentTimeMillis();
Long endTime = System.currentTimeMillis();
logVo.setTime(endTime - startTime);
logVo.setCreateBy(authentication.getName());
logVo.setUpdateBy(authentication.getName());
SpringContextHolder.publishEvent(new SysLogEvent(logVo));
}
public class PigAuthenticationFailureEventHandler extends AbstractAuthenticationFailureEventHandler {
/**
* 处理登录失败方法
*
* @param authenticationException 登录的authentication 对象
* @param authentication 登录的authenticationException 对象
*/
@Override
public void handle(AuthenticationException authenticationException, Authentication authentication) {
log.info("用户:{} 登录失败,异常:{}", authentication.getPrincipal(), authenticationException.getLocalizedMessage());
SecurityContextHolder.getContext().setAuthentication(authentication);
SysLog logVo = SysLogUtils.getSysLog();
logVo.setTitle("登录失败");
logVo.setType(LogTypeEnum.ERROR.getType());
logVo.setException(authenticationException.getMessage());
// 发送异步日志事件
Long startTime = System.currentTimeMillis();
Long endTime = System.currentTimeMillis();
logVo.setTime(endTime - startTime);
logVo.setCreateBy(authentication.getName());
logVo.setUpdateBy(authentication.getName());
SpringContextHolder.publishEvent(new SysLogEvent(logVo));
}
四、pig-upms
用户登陆后,用户、菜单和角色权限管理,实现用户模块的开发服务
用户还可以进入开发平台模块直接生成controller,service代码和mybatisPlus xml
五、pig-common:
系统共用模块,里面包含了 公共工具类核心包core、数据源datasource、feign调用、定时任务job、日志服务log、mybaticsPlus、安全工具类security、swagger使用
以上就为此次源码最重要的几个模块,框架复杂度主要在启动上,每次都要依次把pig-register,pig-gateway,pig-auth,pig-upms 服务的application启动起来。
但是项目的代码封装都很好用,满足大部门的需求,而且测试工具swagger也很好用,可直接找到接口做联调。
代码中最常用到的就是查询LambdaQueryWrapper,可直接做in,notIn,like,和orderBY等操作的数据,例如:
LambdaQueryWrapper<Guest> guestWrapper=Wrappers.lambdaQuery();
if(StringUtils.isNotBlank(name)){
guestWrapper.like(Guest::getName,name);
}
if(StringUtils.isNotBlank(phone)){
guestWrapper.eq(Guest::getPhone,phone);
}
guestWrapper.in(Guest::getId,Arrays.asList(111,222));
guestWrapper.orderByDesc(Guest::getSort);
aaService.list(guestWrapper);
因为封装方法默认做了为空不做处理的操作,所以对于编辑数据为空的操作可以使用 UpdateWrapper,如下:
UpdateWrapper<Station> stationWrapper=new UpdateWrapper<>();
stationWrapper.lambda().eq(Station::getId,id);
stationWrapper.set("place",place);
stationWrapper.set("number",null);
boolean flag=stationService.update(pickRecordWrapper);