一文快速掌握zipkin+sleuth、completableFuture、手机号邮箱号登录

zipkin的使用

下载zipkin(https://labilibili.com/package/zipkin.jar)

进入zipkin的jar包解压后的路径,本机启动zipkin


服务中使用slueth传递请求信息

zipkin是将请求链路以可视化的形式展示出来,而slueth则是将请求相关信息发送给zipkin

引入依赖

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency> 依赖版本号在项目父pom.xml文件中查看,后续同理

编写配置

spring:
zipkin:
base-url: http://localhost:9411 zipkin服务地址
sender:
type: web 使用http请求发送,值为rabbit和Kafka则是用消息队列发送请求数据
sleuth:
sampler:
probability: 1 sleuth 日志记录采样率,1为100%,默认为0.1即10%

发送请求后在浏览器地址栏中输入localhost:9411查看控制台

单服务调用

跨服务调用

completableFuture的使用

completableFuture是一种便捷、功能相当强大的异步任务框架,接下来举例最常用的几种功能

单个执行异步任务

CompletableFuture.runAsync(()->{
log.info("");
log.info("");
});
若需要执行的只有一句可以简化为Lambda形式
CompletableFuture.runAsync(()-> log.info(""));

异步任务的回调

CompletableFuture.runAsync(() -> minioService.uploadImgFile(coverFileName, coverMultipartFile.getInputStream(), imgContentType)).handle((result, ex) -> {
if (ex != null) { 异步任务出现异常后可以进行相应处理
log.error("uploadimgfail");
}
return null;
});

顺序执行异步任务

这种情况下就需要声明执行异步任务的对象来传递后续顺序执行异步任务时的参数,只单个执行异步任务可以不用声明该对象
CompletableFuture<Void> uploadVideoFuture = CompletableFuture.runAsync(() -> {
log.info("111");
log.info("222");
});
在上一个异步任务对象的任务执行完后才启动
CompletableFuture thenRunFuture = uploadVideoFuture.thenRun(() ->
client.sendUploadNotice(new UploadVideo().setVideoId(video.getId()).setVideoName(video.getName()).setUrl(url).setHasCover(false)));

同时等待多个异步任务执行完成再开启新异步任务、获取异步任务返回值、阻塞主线程

创建第一个异步任务
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1000); 模拟耗时操作
} catch (InterruptedException e) {
e.printStackTrace();
}
return "结果1";
});

创建第二个异步任务
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(2000); 模拟耗时操作
} catch (InterruptedException e) {
e.printStackTrace();
}
return "结果2";
});

创建第三个异步任务
CompletableFuture<String> future3 = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "结果3";
});

合并所有异步任务,并等待它们全部完成
CompletableFuture<Void> allOf = CompletableFuture.allOf(future1, future2, future3);
等待所有任务完成,并处理结果
allOf.thenRun(() -> {
try {
获取每个任务的结果
String result1 = future1.get();
String result2 = future2.get();
String result3 = future3.get();
输出结果
log.info("所有任务完成");
log.info("结果1: " + result1);
log.info("结果2: " + result2);
log.info("结果3: " + result3);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}).join(); 阻塞主线程直到所有任务完成(tips:该特性在gateway中有新起效,gateway默认是异步非阻塞的,若在该服务中远程调用其他服务接口会报错,但使用CompletableFuture又可能有需求需要阻塞主线程的情况,此时可以用该功能)

log.info("主线程结束");
}

手机号登录

引入依赖

<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
</dependency>

核心工具类

可自助调整超时时间
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");

用阿里云中短信模版中的参数初始化acsClient
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);

组装请求对象
SendSmsRequest request = new SendSmsRequest();
必填:待发送手机号
request.setPhoneNumbers(phone);
必填:短信签名-可在短信控制台中找到
request.setSignName("labilibili");
必填:短信模板-可在短信控制台中找到
request.setTemplateCode("SMS_295400185");
可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
request.setTemplateParam("{\"code\":\"" + code + "\"}");
选填-上行短信扩展码(无特殊需求请忽略此字段)
request.setSmsUpExtendCode("90997");
可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
request.setOutId("yourOutId");
此处可能会抛出异常,注意catch
SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
return sendSmsResponse;
}

发送邮箱验证码

引入依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>

配置参数

spring:
mail:
host: smtp.qq.com
default-encoding: UTF-8
username: 10086@qq.com
password: dawasd 这个密码需要去qq邮箱中获取授权码
properties:
mail:
smtp:
auth: true
starttls:
enable: true
required: true
socketFactory:
port: 465 这个配置是因为在线上环境下原默认端口会被阿里云判定为不安全,因此需要
class: javax.net.ssl.SSLSocketFactory 换端口
fallback: false

发送验证码

@Resource
注入发送邮箱的bean
public JavaMailSender mailSender;
SimpleMailMessage message = new SimpleMailMessage();
Random random=new Random();
填写要接收验证码的邮箱
message.setTo(mailNumber);
邮箱主题
message.setSubject("验证码");
String captcha=""+random.nextInt(10)+random.nextInt(10)+random.nextInt(10)+random.nextInt(10)+random.nextInt(10)+random.nextInt(10);
redisTemplate.opsForValue().set(mailNumber,captcha);
存储验证码到内容中
message.setText("labilibilibili验证码:"+captcha);
填装发送者
message.setFrom(from);
log.info("send");
log.info(from);
mailSender.send(message);

最后,宣传一下自己的仿b站前后端分离微服务项目,依赖版本号也在该项目的父pom.xml

实现了以下功能:

视频的上传、查看与上传时获取封面

视频的点赞、评论、可同时新增和删除多个收藏记录的收藏、多功能的弹幕

用户的个人信息查看编辑、用户之间的关注

用户的个人主页权限修改、查看、由个人主页权限动态决定的用户个人主页内容的获取

手机号、邮箱、图形验证码的多种方式登录

支持临时会话的服务器为代理的一对一实时私聊

基于讯飞星火的文生文、文生图、(全网首发)智能PPT

关注up动态视频、评论、点赞、私聊消息的生成与推送

基于es实现的视频和用户的聚合搜索、推荐视频

网关的路由和统一鉴权与授权

基于双token的七天内无感刷新token

防csrf、xss、抓包、恶意上传脚本攻击

统一处理异常和泛型封装响应体、自定义修改响应序列化值

简易的仿redis缓存读取与数据过期剔除实现

xxl-job+ redis+ rocketmq+ es+ 布隆过滤器的自定义es与mysql数据同步

slueth+zipkin的多服务间请求链路追踪

集中多服务日志到一个文件目录下与按需添加特定内容入日志

多服务的详细接口文档

项目地址LABiliBili,github地址GitHub - aigcbilibili/aigcbilibili: 仿bilibili前后端实现,演示地址https://labilibili.com/video/演示.mp4,如果大家觉得有帮助的话可以去github点个小星星♪(・ω・)ノ

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
骆驼菜菜
作者分享
宣传下自己的仿B站前后端分离微服务开源项目
6
好久没冒泡过了,宣传下开源项目 仿B站前后端分离微服务项目 实现了以下功能: 视频的上传、查看、点赞、评论、收藏、弹幕(有分片上传与断点续传实现) 用户的个人信息查看编辑、关注 用户个人主页权限查看修改、个人主页内容获取 图形码、手机号、邮箱登录注册 一对一实时私聊 大模型文生文、文生图、智能PPT 关注UP动态、评论点赞私聊消息的生成与推送 视频和用户的聚合搜索、关键字补全、关键字高亮 项目亮点: 技术栈相当丰富且贴近企业需求:使用了当下企业开发最常用的可以快速开发单体应用的SpringBoot,保证了下限的基础上引用了SpringCloud系列组件搭建微服务提高上限,并使用了流行中间件Redis、RocketMQ、ElasticSearch,完整覆盖所有公司对Java应届生的要求,技术栈达到要求则过筛选率大大提高,且按需引入技术如实时连接Websocket、转码Jave等,体现出相对于大部分Java人更强的解决需求能力,进一步提供过筛选率,同时更广的技术栈代表可供面试官提问的点更多,也是可以自己提前准备主动引导面试官的点更多 技术亮点多:一份好的简历需要有足够多能和面试官细聊的地方,本项目亮点相当多,像分片上传、断点续传、数据同步流程、一对一实时私聊、集成大模型功能及全网首发的给出主题生成ppt所有文案实现等都足够和面试官展示军火相当久且可以延伸出足够多八股,将一场面试节奏完全掌握在自己手中 有详细完整最快落地的教程:从部署环境到前后端运行到接口调通有相当完整详细的教程,完全无需会一点前端知识,不用配置特定环境或特定包目录运行前端和解决任何前端相关bug即可启动前端,且运行所需包都可直接从作者文件床中获取无需在官网中找省去麻烦从而最快本机跑通项目功能,并附带项目技术栈使用讲解更快理解项目 有配套简历话术:配合现成简历话术极快改进简历,省去大量的反复修改简历时间 有java基础的情况下按照教程操作最快不到一天就能把仿b站项目本机运行起来 项目地址:https://labilibili.com,github地址https://github.com/aigcbilibili/aigcbilibili,已有240star,欢迎访问项目,给GitHub点个小星星就更好啦
12
原创仿b站前后端分离微服务开源项目
7
仿b站项目最终版 实现了以下功能: 视频的上传、查看、点赞、评论、收藏、弹幕(有分片上传与断点续传实现) 用户的个人信息查看编辑、关注 用户个人主页权限查看修改、个人主页内容获取 图形码、手机号、邮箱登录注册 一对一实时私聊 文生文、文生图、智能PPT 关注UP动态、评论点赞私聊消息的生成与推送 视频和用户的聚合搜索、关键字补全、关键字高亮1 项目亮点 重复度极低,项目需求都是作者一比一复刻分析b站功能决定的,在企业招聘需求减少招聘要求提高的当下意味着在简历筛选会得到远高于常人的被感兴趣程度(绝大部分Java人都是做的黑马尚硅谷项目或其余较流行项目,项目上的千篇一律导致hr及面试官对简历感兴趣程度较低,相对不愿意细看简历,且由于这些项目网上资料过多过详细容易被面试官判定为难度较小的项目而不能确定Java人是否高水平,以及对使用这些项目的人简历要求提高甚至见到简历写这些项目就直接丢弃) 技术栈相当丰富且贴近企业需求:使用了当下企业开发最常用的可以快速开发单体应用的SpringBoot,保证了下限的基础上引用了SpringCloud系列组件搭建微服务提高上限,并使用了流行中间件Redis、RocketMQ、ElasticSearch,完整覆盖所有公司对Java应届生的要求,技术栈达到要求则过筛选率大大提高,且按需引入技术如实时连接Websocket、转码Jave等,体现出相对于大部分Java人更强的解决需求能力,进一步提供过筛选率,同时更广的技术栈代表可供面试官提问的点更多,也是可以自己提前准备主动引导面试官的点更多 技术亮点多:一份好的简历需要有足够多能和面试官细聊的地方,本项目亮点相当多,像分片上传、断点续传、数据同步流程、一对一实时私聊、集成大模型功能及全网首发的给出主题生成ppt所有文案实现等都足够和面试官展示军火相当久且可以延伸出足够多八股,将一场面试节奏完全掌握在自己手中 有详细完整最快落地的教程:从部署环境到前后端运行到接口调通有相当完整详细的教程,且运行所需包都可直接从作者文件床中获取无需在官网中找省去麻烦从而最快本机跑通项目功能,并附带项目技术栈使用讲解更快理解项目 有配套简历话术:配合现成简历话术极快改进简历,省去大量的反复修改简历时间 技术栈 springboot:快速开发Java应用程序 security:具备强大的鉴权授权 nacos:服务注册与发现 openfeign:远程调用服务 gateway:请求入口与路由网关 redis:跨服务缓存 elasticsearch:更快的查询与更高的查询匹配度 rocketmq:异步处理队列 minio:文件对象存储 mybatis-plus:便捷执行单表增删改查 mybatis-plus-join:业务层多表查询 druid:阿里数据库连接池 jwt:token实现形式 swagger:接口文档 gson:谷歌序列化转换 hutool:集成众多工具类省去手动实现工具类 websocket:实时长连接 讯飞星火api:集成大模型功能 jave:视频操作,转码、压缩、截图、去水印等 xxl-job:分布式可视化定时任务 zipkin:请求链路追踪信息可视化ui slueth:发送请求链路追踪信息 相关教程 本机运行环境部署https://articles.zsxq.com/id_hvd3tkx3pq6v.html 前后端运行https://articles.zsxq.com/id_o9k66ma79cu0.html 前后端接口调通https://articles.zsxq.com/id_zx28jqj1euco.html 需求分析与需求实现思路https://articles.zsxq.com/id_rft27b8wfv2i.html 简历写法https://articles.zsxq.com/id_0nnixwez6516.html redis、mybatis-plus、es、rocketmq使用https://articles.zsxq.com/id_8mx58r4c7dr2.html websocket、spring security、swagger knife4j、openfeign的使用https://articles.zsxq.com/id_8coisfuz2ts5.html minio、xxl-job、jave、mybatis-plus-join的使用https://articles.zsxq.com/id_1c7w2j0a5gld.html zipkin sleuth、completableFuture、手机号邮箱号登录https://articles.zsxq.com/id_0pvpjum0ms82.html 项目地址 线上地址:https://labilibili.com,演示地址:https://labilibili.com/video/演示.mp4,github地址https://github.com/aigcbilibili/aigcbilibili ,欢迎访问项目,给GitHub点个小星星就更好啦
8
仿b站前后端分离微服务项目简历写法
6
下载 APP