一 数据库设计
1 数据库
创建数据库:guli_statistics
2 数据表
DROP TABLE IF EXISTS `statistics_daily`;
CREATE TABLE `statistics_daily` (
`id` char(19) NOT NULL COMMENT '主键',
`date_calculated` varchar(20) NOT NULL COMMENT '统计日期',
`register_num` int(11) NOT NULL DEFAULT '0' COMMENT '注册人数',
`login_num` int(11) NOT NULL DEFAULT '0' COMMENT '登录人数',
`video_view_num` int(11) NOT NULL DEFAULT '0' COMMENT '每日播放视频数',
`course_num` int(11) NOT NULL DEFAULT '0' COMMENT '每日新增课程数',
`gmt_create` datetime NOT NULL COMMENT '创建时间',
`gmt_modified` datetime NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `statistics_day` (`date_calculated`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='网站统计日数据';
二 创建微服务
1 创建模块
service_statistics
2 配置 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>service</artifactId>
<groupId>com.atguigu</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>service_statistics</artifactId>
<dependencies>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
</dependency>
</dependencies>
<build>
<!-- 项目打包时会将java目录中的*.xml文件也进行打包 -->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
</project>
3 application.yml
resources目录下创建文件
server:
port: 8180 # 服务端口
spring:
profiles:
active: dev # 环境设置
application:
name: service-statistics # 服务名
cloud:
nacos:
discovery:
server-addr: localhost:8848 # nacos服务地址
sentinel:
transport:
port: 8081
dashboard: localhost:8080
datasource: # mysql数据库连接
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/guli_statistics?serverTimezone=GMT%2B8
username: root
password: 123456
#spring:
jackson: #返回json的全局时间格式
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #mybatis日志
mapper-locations: classpath:com/atguigu/guli/service/statistics/mapper/xml/*.xml
ribbon:
ConnectTimeout: 10000 #连接建立的超时时长,默认1秒
ReadTimeout: 10000 #处理请求的超时时间,默认为1秒
feign:
sentinel:
enabled: true
4 logback-spring.xml
修改日志路径为 guli_log/statistics
5 创建SpringBoot启动类
@SpringBootApplication
@ComponentScan({"com.atguigu.guli"})
@EnableDiscoveryClient
@EnableFeignClients
@EnableScheduling
public class ServiceStatisticsApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceStatisticsApplication.class, args);
}
}
三 调用用户注册统计
1 创建调用接口
@FeignClient(value = "service-ucenter", fallback = UcenterMemberServiceFallBack.class)
public interface UcenterMemberService {
@GetMapping("/admin/ucenter/member/count-register-num/{day}")
R countRegisterNum( @PathVariable("day") String day);
}
2 服务熔断
@Service
@Slf4j
public class UcenterMemberServiceFallBack implements UcenterMemberService {
@Override
public R countRegisterNum(String day) {
log.error("熔断被执行");
return R.ok().data("registerNum", 0);
}
}
3 Service层
接口
public interface DailyService extends IService<Daily> {
void createStatisticsByDay(String day);
}
实现
@Service
public class DailyServiceImpl extends ServiceImpl<DailyMapper, Daily> implements DailyService {
@Autowired
private UcenterMemberService ucenterMemberService;
@Transactional(rollbackFor = Exception.class)
@Override
public void createStatisticsByDay(String day) {
// 如果当日统计信息已存在,则删除记录
QueryWrapper<Daily> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("date_calculated", day);
baseMapper.delete(queryWrapper);
// 远程获取了注册用户数的统计结果
R r = ucenterMemberService.countRegisterNum(day);
Integer registerNum = (Integer)r.getData().get("registerNum");
int loginNum = RandomUtils.nextInt(100, 200);
int videoViewNum = RandomUtils.nextInt(100, 200);
int courseNum = RandomUtils.nextInt(100, 200);
// 创建统计数据对象
Daily daily = new Daily();
daily.setRegisterNum(registerNum);
daily.setLoginNum(loginNum);
daily.setVideoViewNum(videoViewNum);
daily.setCourseNum(courseNum);
daily.setDateCalculated(day);
baseMapper.insert(daily);
}
}
4 控制器
@Api(description = "统计分析管理")
@RestController
@RequestMapping("/admin/statistics/daily")
public class DailyController {
@Autowired
private DailyService dailyService;
@ApiOperation("生成统计记录")
@PostMapping("create/{day}")
public R createdStatisticsByDay(
@ApiParam("统计日期")
@PathVariable String day) {
dailyService.createStatisticsByDay(day);
return R.ok().message("统计数据生成成功");
}
}