Java阶段五Day16

这篇具有很好参考价值的文章主要介绍了Java阶段五Day16。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Java阶段五Day16

问题解析

启动servlet冲突问题

Java阶段五Day16,培训之旅,java,大数据,dubbo,spring cloud

解决方法:启动项目main 将传递过来servlet-api依赖去除

nacos注册中心

  • 依赖
  • yaml配置

用户信息验证失败

Java阶段五Day16,培训之旅,java,大数据,dubbo,spring cloud

断点查看源代码 LoginUserFilter(在处理网关解析后的jwt数据 userJson字符串)

如果过滤器不生效,就会导致解析userJson没执行,后端代码获取LongUser对象是空

Java阶段五Day16,培训之旅,java,大数据,dubbo,spring cloud

LongUserFilterAutoConfiguration 需要满足条件才会帮助项目程序创建过滤器

Java阶段五Day16,培训之旅,java,大数据,dubbo,spring cloud

所以根据源码分析,第一个条件没满足,导致当前LoginUserFilter没有自动配置.,无法生效

Java阶段五Day16,培训之旅,java,大数据,dubbo,spring cloud

Java阶段五Day16,培训之旅,java,大数据,dubbo,spring cloud

passport-sdk包中提供了一个FastJsonAutoConfiguration

FastJson实现的自动配置

Java阶段五Day16,培训之旅,java,大数据,dubbo,spring cloud

  1. 要解析用户userJson,要经过过滤器LoginUserFilter
  2. 过滤器生效(bean对象),自动配置类条件要满足(容器具备一个Json实现bean对象)
  3. 所以要求FastJsonAutoConfiguration要满足条件,json.provider=fastjson
  4. 当前系统不满足这个条件

根据上述分析,在yaml文件中

提供属性

json:
	provider: fastjson

前端效果不对

当前worker-server端:师傅入驻

  • nacos
  • passport
  • attach
  • gateway
  • worker-server

正常执行了入驻功能,但是前端没有反馈成功,因为响应没有做处理,直接返回的是controller的方法返回值,需要返回Result的对象

{
    "code":200,
    "message":"成功"
    "data":{},
	"success":true
}

源代码中每个 main 模块中有非常多配置类

Java阶段五Day16,培训之旅,java,大数据,dubbo,spring cloud

  1. 第一个是全局异常捕获
  2. 接口文档插件配置
  3. 配置springmvc cors(当前没有) 防止 knife4j 接口文件响应异常
  4. WebResponseHander 将响应做统一处理输出

Java阶段五Day16,培训之旅,java,大数据,dubbo,spring cloud

这个方法执行位置在controller返回数据之后,响应返回前端之前

controller返回值如果不满足要求,就会统一封装成Result对象

body就是controller返回数据

前端请求到后台服务的流转过程

  • http://localhost:8989/api/worker/create 发给前端代理(vue.config.js
  • http://localhost:8097/worker/create 进入网关
  • lb://luban-worker-server/worker/create 找到路由断言匹配,负载均衡服务
  • http://localhost:9001/worker/create 进入controller逻辑

远程dubbo调用

业务需求

当前worker入驻,要调用attach-server服务,实现图片数据更新

Java阶段五Day16,培训之旅,java,大数据,dubbo,spring cloud

缺少的功能是师傅入驻,远程调用attach将图片数据库数据 businessType=77(worker业务) businessId=(生成的师傅id)

dubbo配置

  • 依赖
  • yaml(自动配置中属性,目的就是给配置类用的)
  • 注解

这种自动配置的使用方式,不符合分层开发目的,避免业务侵入性

Java阶段五Day16,培训之旅,java,大数据,dubbo,spring cloud

xml配置

  • 依赖 dubbo
<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.7.8</version>
</dependency>
  • xml配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://dubbo.apache.org/schema/dubbo
    http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
    <!--配置dubbo 原来在yaml自动配属性中看到 xml中也有-->
    <!--dubbo应用-->
    <dubbo:application name="${spring.application.name}">
        <!--关闭qos-->
        <dubbo:parameter key="qos.enable" value="false"/>
    </dubbo:application>
    <!--protocol dubbo -1-->
    <dubbo:protocol name="dubbo" port="-1"/>
    <!--注册中心-->
    <dubbo:registry
            id="dubboNacos"
            protocol="nacos"
            address="localhost:8848"
            use-as-config-center="false"
            use-as-metadata-center="false"/>
    <!--消费者配置接口-->
    <dubbo:reference id="attachApi" interface="com.tarena.tp.attach.server.client.AttachApi"
                 check="fasle" registry="dubboNacos"/>   
</beans>
  • 依赖provider接口 添加到调用模块domain
<!--远程调用attach-->
<dependency>
    <groupId>com.tarena.tp.attach</groupId>
    <version>1.0.0-SNAPSHOT</version>
    <artifactId>luban-attach-server-client-api</artifactId>
</dependency>
  • 导入到当前启动worker-server进程中@ImportResource

domain层代码 补充远程调用

saveWorker方法中远程调用

import com.tarena.luban.worker.server.repository.WorkerAreaRepository;
import com.tarena.luban.worker.server.repository.WorkerCategoryRepsoitory;
import com.tarena.luban.worker.server.repository.WorkerRepository;
import com.tarena.passport.protocol.LoginUser;
import com.tarena.passport.sdk.context.SecurityContext;
import com.tarena.tp.attach.server.client.AttachApi;
import com.tarena.tp.attach.server.param.AttachUpdateParam;
import com.tarena.tp.luban.worker.server.common.enums.ResultEnum;
import com.tarena.tp.luban.worker.server.dto.param.IdCardParam;
import com.tarena.tp.luban.worker.server.dto.param.WorkerAreaParam;
import com.tarena.tp.luban.worker.server.dto.param.WorkerCategoryParam;
import com.tarena.tp.luban.worker.server.dto.param.WorkerCreateParam;
import com.tedu.inn.commons.utils.Asserts;
import com.tedu.inn.protocol.exception.BusinessException;
import lombok.extern.slf4j.Slf4j;
import org.checkerframework.checker.units.qual.A;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * @author java@tedu.cn
 * @version 1.0
 */
@Service
@Slf4j
public class WorkerServerService {
    @Autowired
    private WorkerRepository workerRepository;
    @Autowired
    private WorkerAreaRepository workerAreaRepository;
    @Autowired
    private WorkerCategoryRepsoitory workerCategoryRepsoitory;
    //domain不关心实现,没有实现,报错
    @Autowired
    private AttachApi attachApi;
    /**
     * 1. 补充userId
     * 2. 检查 手机号
     * 3. 检查 身份证 和真实名称是否匹配 TODO
     * 4. 存储 worker workerCategory workerArea
     * 使用定义好的repository接口
     * @param workerCreateParam
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    public Long create(WorkerCreateParam workerCreateParam) throws BusinessException {
        //获取userId
        Long userId=getUserIdByToken();
        //检查 手机号 身份证 UNDO
        checkPhoneAndIdCard(workerCreateParam);
        //挨个存储对应数据到持久层
        workerCreateParam.setUserId(userId);
        Long id=saveWorker(workerCreateParam);
        saveWorkerArea(workerCreateParam);
        saveWorkerCategory(workerCreateParam);
        return id;
    }

    /**
     * 先删除,后新增
     * @param workerCreateParam
     */
    private void saveWorkerCategory(WorkerCreateParam workerCreateParam) {
        workerCategoryRepsoitory.deleteByUserId(workerCreateParam.getUserId());
        List<WorkerCategoryParam> workerCategoryParams = workerCreateParam.getWorkerCategoryParams();
        if (!CollectionUtils.isEmpty(workerCreateParam.getWorkerCategoryParams())){
            //循环
            workerCategoryParams.forEach(param -> {
                param.setUserId(workerCreateParam.getUserId());
                workerCategoryRepsoitory.save(param);
            });
        }
    }

    /**
     * 先删除,后新增
     * @param workerCreateParam
     */
    private void saveWorkerArea(WorkerCreateParam workerCreateParam) {
        workerAreaRepository.deleteByUserId(workerCreateParam.getUserId());
        //循环存储 <foreach>
        //TODO 批量存
        List<WorkerAreaParam> workerAreaParams
                = workerCreateParam.getWorkerAreaParams();
        for (WorkerAreaParam workerAreaParam : workerAreaParams) {
            //提交的参数 workerCategoryParam中和workerParam类似的,也没有userId;
            workerAreaParam.setUserId(workerCreateParam.getUserId());
            //insert into worker_area
            workerAreaRepository.save(workerAreaParam);
        }
    }

    /**
     * 1. 当前用户有可能已经是师傅了.
     * 1.1 先查讯数据库是否有当前用户.师傅信息 有就报错 没有 就新增
     * 1.2 不管有没有 如果有就删除.重新新增
     * @param workerCreateParam
     * @return
     */
    private Long saveWorker(WorkerCreateParam workerCreateParam) throws BusinessException {
        //如果当前用户在数据库中有师傅信息,就删除 重新入驻师傅信息
        workerRepository.delete(workerCreateParam.getUserId());
        Long id=workerRepository.save(workerCreateParam);
        //rpc 调用 将身份信息,worker-id,和当前图片传递给attach系统,做更新
        //远程调用
        try{
            //远程调用,更新已经上传的图片,绑定到当前worker
            createAttach(id,workerCreateParam.getAttachList());
        }catch (Exception e){
            //远程调用失败
            throw new BusinessException(ResultEnum.ATTACH_FAILED);
        }
        return id;
    }
    //人为定义的类型.
    private static final Integer bizType=100;
    private void createAttach(Long businessId, List<IdCardParam> attachList) {
        //要将attachList 图片(attach服务 没有绑定业务)
        //封装远程调用参数 attach执行一个简单update attach set bysiness_id=#{参数} business_id=#{师傅id}
        //where id=#{当前图片id}
        List<AttachUpdateParam> attachUpdateParams=new ArrayList<>();
        //封装
        for (IdCardParam idCardParam : attachList) {
            //参数元素
            AttachUpdateParam attachUpdateParam=new AttachUpdateParam();
            attachUpdateParam.setIsCover(idCardParam.getType());
            // 图片id bizId bizType 主要数据
            attachUpdateParam.setId(idCardParam.getId());
            attachUpdateParam.setBusinessType(bizType);
            attachUpdateParam.setBusinessId(businessId.intValue());
            //添加到list
            attachUpdateParams.add(attachUpdateParam);
        }
        //调用远程
        attachApi.batchUpdateAttachByIdList(attachUpdateParams);
    }

    private void checkPhoneAndIdCard(WorkerCreateParam workerCreateParam) {
        //UNDO
        log.info("check phone and idCard,now passed");
    }

    private Long getUserIdByToken() throws BusinessException {
        LoginUser loginToken = SecurityContext.getLoginToken();
        //判断 user登录还是没登录 如果loginUser是空的,说明没登录
        Asserts.isTrue(loginToken==null,
                new BusinessException(ResultEnum.USER_TOKEN_VERIFY_FAILED));
        return loginToken.getUserId();
    }
}

师傅详情

接口抽象

要素 备注
请求地址 /worker/detail
请求方式 GET
请求参数 解析userId
返回值 WorkerVO

返回值说明WorderVO

AccountVO: 远程调用account服务 查询已经审核通过的师傅绑定的账号

List<WorkerAreaVO>: 师傅绑定区域.

List<WokrderCategoryVO>: 师傅绑定的服务种类.

List<AttachVO>: 师傅绑定的身份证图片

开发

WorkderServerController
WorkerServerService
WorkerRepository
WorkerDao
WorkerMapper.xml

问题

完成所有查询,封装好数据,到页面检测功能

Java阶段五Day16,培训之旅,java,大数据,dubbo,spring cloud

Java阶段五Day16,培训之旅,java,大数据,dubbo,spring cloud

思路: 通过检查对应代码位置,发现AccountBO暂时没有查询,会导致转化异常,所以在业务层返回添加一个假数据

展示师傅信息

当前已经注册成为师傅,但是前端没有消除成为师傅的按钮

审核数据 0 1 2(未注册) 3(已注册未审核)

准备好后续开发的环境

worker-admin删除保留开发框架

删除代码原则:

不删 / 保留

  • 数据封装对象: BO VO DTO PO PAGEQUERY

  • 转化的类:**Converter \*\*Asemble

  • 接口一律不删:

  • XML不删: 明白sql语句 增删拆改,条件作用

日志框架

当前luban-project使用日志框架

error debug info分到不同文件了

Java阶段五Day16,培训之旅,java,大数据,dubbo,spring cloud文章来源地址https://www.toymoban.com/news/detail-625408.html

到了这里,关于Java阶段五Day16的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java阶段二Day04

    导入学子商城webapp资源后访问其首页,发现页面无法正常显示. 浏览器F12跟踪请求和响应的交互发现两个问题: 1:我们仅发送了两个响应头(Content-Length和Content-Type). 虽然目前仅需要这两个头,但是服务端实际可以根据处理情况设置需要发送其他响应头 2: Content-Type 的值是固定的

    2023年04月23日
    浏览(28)
  • Java阶段五Day08

    学习内容目的 springboot自动配置原理 实现自定义starter(未完善) 自动配置原理 核心注解: SpringBootApplication 组合3个注解: 扫描( ComponentScan ) 配置( SpringBootConfiguration ) 自动配置( EnableAutoConfiguration ) 自动配置注解的逻辑: 在启动类的基础上,导入了springboot的大量自动配

    2024年02月17日
    浏览(34)
  • Java阶段二Day12

    JDBC Java数据库连接 Java Database Connectivity ,是java官方提供的一套结构,用于连接DBMS并进行相关操作 核心接口 Connection: 表示数据库连接 Statement: 用来执行SQL语句的语句对象 PreparedStatement: 用来执行预编译SQL语句的语句对象用来表示查询结果集 ResultSet: 用来表示查询结构集

    2024年02月01日
    浏览(34)
  • Java阶段五Day18

    面试题整理 目标: 整理相关问题的话术,碰到问题 思路: 概念 是什么 原因 为什么 解决方案 如何解决 缓存雪崩 : 概念: 缓存在长期应用的系统中,存储了大量的高并发访问数据,一旦这些数据突然批量消失,访问吞吐的并发,到达数据库,导致数据库崩溃 原因: 大量

    2024年02月14日
    浏览(50)
  • Java阶段五Day20

    完成订单 通过分布式消息事务解决本地事务和发消息的一致性 OrderServerService MessageTransSenderRepository MessageTransRepoImpl LocalTransactionLisetner 结算订单 业务流程图 结算执行业务流程 在消费之前 添加分布式锁逻辑 远程调用 provider : account-server (暂时还没实现) consumer : settle-se

    2024年02月14日
    浏览(32)
  • Java阶段二Day11

    主键与外键 主键(PK):一张表中通常第一个字段为主键字段,用来唯一标识表中的一条记录.主键要求的条件是非空且唯一 外键(FK):一张表中一个字段保存了另一张表中主键字段的值,那么这个字段就是外键字段 在关联关系中,两张表通常就是使用主外键进行关联的,

    2024年02月01日
    浏览(43)
  • Java阶段四Day11

    AOP:面向切面编程 注意:AOP并不是Spring原创的技术,也不是Spring的独家技术,而是源自AspectJ,只是Spring很好的支持了AOP。 AOP技术主要解决了“横切关注”的相关问题,也就是“若干个不同的方法都需要执行相同的任务”的问题! 在许多框架中,都通过AOP技术实现了对应的功

    2024年02月13日
    浏览(30)
  • Java阶段二Day01

    StringBuilder是线程不安全的 StringBuffer是线程安全的,它的 append 方法有 synchronized 修饰 StringBuffer是1.0时候出现的,StringBuilder是1.5时候出现的 一般不再多线程情况下使用同一个字符串,所以对线程安全效率低的StringBuffer用的少,所以出现了StringBuilder,其线程虽不安全但是效率高

    2023年04月15日
    浏览(34)
  • Spring Cloud微服务架构组件【Java培训】

    SpringCloud是一系列框架的有序集合,为开发人员构建微服务架构提供了完整的解决方案。Spring Cloud根据分布式服务协调治理的需求成立了许多子项目,每个项目通过特定的组件去实现,下面我们讲解一下Spring Cloud 包含的常用组件以及模块。 (1)Spring Cloud Config:分布式配置中心

    2023年04月25日
    浏览(43)
  • java数组.day16(冒泡排序,稀疏数组)

    冒泡排序无疑是最为出名的排序算法之一,总共有八大排序! 冒泡的代码还是相当简单的,两层循环,外层冒泡轮数,里层依次比较,江湖中人人尽皆知。 我们看到嵌套循环,应该立马就可以得出这个算法的时间复杂度为O(n2)。 代码示例: 当一个数组中大部分元素为0,或者

    2024年04月11日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包