一文快速掌握链路追踪、异步任务、手机号邮箱号登录、大模型调用

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: **********
    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点个小星星♪(・ω・)ノ

#秋招##美团##字节跳动##阿里巴巴##腾讯#

该专栏存放前后端分离仿b站微服务项目相关教程与简历话术

全部评论
为啥我的登陆成功后页面没有自动跳转啊,数据库里也已经有用户信息了,token也刷新了
点赞 回复 分享
发布于 03-02 12:47 山东
大佬,解压的图里面没有你的图上的文件啊,我直接java -jar也会报错
点赞 回复 分享
发布于 2024-10-24 15:20 江西

相关推荐

秋招不是要开始了吗,我都打算润了,看大家还在找不敢润了
一条从:因为不是人人都像佬一样有实习像我们这种二本仔秋招没有实习也是白忙活
点赞 评论 收藏
分享
避坑恶心到我了大家好,今天我想跟大家聊聊我在成都千子成智能科技有限公司(以下简称千子成)的求职经历,希望能给大家一些参考。千子成的母公司是“同创主悦”,主要经营各种产品,比如菜刀、POS机、电话卡等等。听起来是不是有点像地推销售公司?没错,就是那种类型的公司。我当时刚毕业,急需一份临时工作,所以在BOSS上看到了千子成的招聘信息。他们承诺无责底薪5000元,还包住宿,这吸引了我。面试的时候,HR也说了同样的话,感觉挺靠谱的。于是,我满怀期待地等待结果。结果出来后,我通过了面试,第二天就收到了试岗通知。试岗的内容就是地推销售,公司划定一个区域,然后你就得见人就问,问店铺、问路人,一直问到他们有意向为止。如果他们有兴趣,你就得摇同事帮忙推动,促进成交。说说一天的工作安排吧。工作时间是从早上8:30到晚上18:30。早上7点有人叫你起床,收拾后去公司,然后唱歌跳舞(销售公司都这样),7:55早课(类似宣誓),8:05同事间联系销售话术,8:15分享销售技巧,8:30经理训话。9:20左右从公司下市场,公交、地铁、自行车自费。到了市场大概10点左右,开始地推工作。中午吃饭时间大约是12:00,公司附近的路边盖饭面馆店自费AA,吃饭时间大约40分钟左右。吃完饭后继续地推工作,没有所谓的固定中午午休时间。下午6点下班后返回公司,不能直接下班,需要与同事交流话术,经理讲话洗脑。正常情况下9点下班。整个上班的一天中,早上到公司就是站着的,到晚上下班前都是站着。每天步数2万步以上。公司员工没有自己的工位,百来号人挤在一个20平方米的空间里听经理洗脑。白天就在市场上奔波,公司的投入成本几乎只有租金和工资,没有中央空调。早上2小时,晚上加班2小时,纯蒸桑拿。没有任何福利,节假日也没有3倍工资之类的。偶尔会有冲的酸梅汤和西瓜什么的。公司的晋升路径也很有意思:新人—组长—领队—主管—副经理—经理。要求是业绩和团队人数,类似传销模式,把人留下来。新人不能加微信、不能吐槽公司、不能有负面情绪、不能谈恋爱、不能说累。在公司没有任何坐的地方,不能依墙而坐。早上吃早饭在公司外面的安全通道,未到上班时间还会让你吃快些不能磨蹭。总之就是想榨干你。复试的时候,带你的师傅会给你营造一个钱多事少离家近的工作氛围,吹嘘工资有多高、还能吹自己毕业于好大学。然后让你早点来公司、无偿加班、抓住你可能不会走的心思进一步压榨你。总之,大家在找工作的时候一定要擦亮眼睛,避免踩坑!———来自网友
qq乃乃好喝到咩噗茶:不要做没有专业门槛的工作
点赞 评论 收藏
分享
05-01 22:41
中南大学 Java
点赞 评论 收藏
分享
评论
4
5
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务