接口调用、客户端lb、嵌套JSON解析、慎用 foreach、新建类封装

news2024/10/6 10:32:54

文章目录

  • 接口调用出错
  • 推荐客户端负载均衡
  • 多层JSON嵌套
  • 大数据量 插入慎用foreach
  • 使用Api时新建一个类封装、方便维护

接口调用出错

  1. 故障转移:重试选择其他可用节点,做好幂等性可用!!!
  2. 快速失败

推荐客户端负载均衡

服务端 负载均衡
在这里插入图片描述

客户端 负载均衡
在这里插入图片描述
抽象为现在 的微服务架构
在这里插入图片描述

多层JSON嵌套

根据 不同的情况,数据的结构会发生变化,定义各种各样的实体类不太好!!因为实体类太多不方便维护

<dependency>
    <groupId>ognl</groupId>
    <artifactId>ognl</artifactId>
    <version>3.1.1</version>
</dependency>

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.2</version>
</dependency>

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.10</version>
</dependency>

JsonUtils 工具类

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import ognl.Ognl;
import ognl.OgnlContext;

import java.util.Map;

public class JsonUtils {
    /**
     * 将指定JSON转为Map对象,Key固定为String,对应JSONkey
     * Value分情况:
     * 1. Value是字符串,自动转为字符串,例如:{"a","b"}
     * 2. Value是其他JSON对象,自动转为Map,例如:{"a":{"b":"2"}}}
     * 3. Value是数组,自动转为List<Map>,例如:{"a":[{"b":"2"},"c":"3"]}
     *
     * @param json 输入的JSON对象
     * @return 动态的Map集合
     */
    public static Map<String, Object> transferToMap(String json) {
        Gson gson = new Gson ();
        Map<String, Object> map = gson.fromJson (json,
                new TypeToken<Map<String, Object>> () {
                }.getType ());
        return map;
    }

    /**
     * 简化方法
     *
     * @param json  原始的JSON数据
     * @param path  OGNL规则表达式
     * @param clazz Value对应的目标类
     * @return clazz对应数据
     */
    public static <T> T getValue(String json, String path, Class<T> clazz) {
        try {
            Map<String, Object> map = transferToMap (json);
            OgnlContext context = new OgnlContext ();
            context.setRoot (map);
            T value = (T) Ognl.getValue (path, context, context.getRoot ());
            return value;
        } catch (Exception e) {
            throw new RuntimeException (e);
        }
    }

}

测试


import org.junit.Test;

import java.util.List;
import java.util.Map;

public class JsonCase {
    /**
     * 超多层级JSON嵌套的快速提取
     */

    @Test

    public void case0() {
        //language=JSON,获取 嵌套json中 e的值
        String text = "{\n" +
                "  \"a\": {\n" +
                "    \"b\": {\n" +
                "      \"c\": {\n" +
                "        \"d\": {\n" +
                "          \"e\": \"nothing\"\n" +
                "        }\n" +
                "      }\n" +
                "    }\n" +
                "  }\n" +
                "}";
        Map<String, Object> jsonMap = JsonUtils.transferToMap (json);

        String e = JsonUtils.getValue (text, "a.b.c.d.e", String.class);
        System.out.println (e);

    }


    //language=JSON
    private String json = "{\n" +
            "  \"showapi_res_error\": \"无\",\n" +
            "  \"showapi_res_id\": \"628cc9850de3769f06edbb49\",\n" +
            "  \"showapi_res_code\": 0,\n" +
            "  \"showapi_fee_num\": 1,\n" +
            "  \"showapi_res_body\": {\n" +
            "    \"ret_code\": 0,\n" +
            "    \"area\": \"南安\",\n" +
            "    \"areaid\": \"101230506\",\n" +
            "    \"areaCode\": \"350583\",\n" +
            "    \"hourList\": [\n" +
            "      {\n" +
            "        \"weather_code\": \"06\",\n" +
            "        \"time\": \"202205242000\",\n" +
            "        \"area\": \"南安\",\n" +
            "        \"wind_direction\": \"东南 风\",\n" +
            "        \" wind_power\": \"0-3级 微风<5.4m/s\",\n" +
            "        \" weather\": \" 小 雨\",\n" +
            "        \" areaid\": \"101230506\",\n" +
            "        \" temperature\": \"20\"\n" +
            "      },\n" +
            "      {\n" +
            "        \"weather_code\": \"07\",\n" +
            "        \"time\": \"202205242100\",\n" +
            "        \"area\": \"南安\",\n" +
            "        \"wind_direction\": \"东 风\",\n" +
            "        \" wind_power\": \"0-3级 微风<5.4m/s\",\n" +
            "        \" weather\": \" 小 雨\",\n" +
            "        \" areaid\": \"101230506\",\n" +
            "        \" temperature\": \"20\"\n" +
            "      }\n" +
            "    ]\n" +
            "  }\n" +
            "}";

    //将JSON转为标准Map结构
    @Test
    public void case1() {
        Map<String, Object> jsonMap = JsonUtils.transferToMap (json);
        System.out.println (jsonMap);
    }

    /**
     * OGNL直接提取数据,Value为子JSON对象的情况
     */
    @Test
    public void case2() {
        Map<String, Object> jsonMap = JsonUtils.transferToMap (json);
        Map resBody = JsonUtils.getValue (json, "showapi_res_body", Map.class);
        System.out.println (resBody);
    }

    /**
     * OGNL直接提取数据,Value为标准字符串的情况
     */
    @Test
    public void case3() {
        String value = JsonUtils.getValue (json, "showapi_res_body.area", String.class);
        System.out.println (value);
    }

    /**
     * OGNL直接提取数据,Value为标准字符串的情况,Value为数组的情况
     */
    @Test
    public void case4() {
        List<Map> hourList = JsonUtils.getValue (json, "showapi_res_body.hourList",
                List.class);


        // 每一个集合对象都是List,遍历这个集合
        for (Map hour : hourList) {
            System.out.println (hour);
        }
    }

    /**
     * 利用List语法获取第1个时点天气预报
     */
    @Test
    public void case5() {
        String area = JsonUtils.getValue (json,
                "showapi_res_body.hourList[0].weather_code", String.class);

        System.out.println (area);
    }
}

大数据量 插入慎用foreach

@Resource
private UserService userService;

// saveBatch 批量插入
userService.saveBatch (null);

只有把rewriteBatchedStatements参数置为true,
驱动才会帮你批量执行SQL (jdbc:mysql://ip:port/db?rewriteBatchedStatements=true)

使用Api时新建一个类封装、方便维护

变化放在盒子里

也就是 使用一个类来 封装原有的方法,解耦!
起初:

String pass = "123456";
String md5 = DigestUtils.md5DigestAsHex (pass.getBytes ());

有 更好的方法时,不得不更新所有的api,麻烦

使用一个类封装 时:

import org.springframework.util.DigestUtils;

public class MyDigestUtils {

    public static String md5Digest(String source) {

        return DigestUtils.md5DigestAsHex (source.getBytes ());
    }
  
}

调用:

String pass = "123456";
String md5 = MyDigestUtils.md5Digest (pass);

发生变化时,直接修改MyDigestUtils下的md5Digest 方法即可!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/83344.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在 Java 中调用 MATLAB 代码

文章目录测评完整源代码运行环境&#xff1a; MATLAB R2022a Java 8&#xff08;1.8.0_311&#xff09; IntelliJ IDEA 2022.2.1 (Ultimate Edition) Maven 3.8.3 Windows 10 教育版 64位 使用混合编程通常都不是好主意&#xff0c;但是有时候会遇到极端的情况。Java 擅长…

git与github安装与配置

git与github安装与配置 最近总是害怕电脑和实验代码突然出事&#xff0c;想了想&#xff0c;拖了很久的git给搞好&#xff0c;所以花了几个小时&#xff0c;从入门到搭建好&#xff0c;这篇文章与其他文章来说&#xff0c;总体上是大同小异&#xff0c;算是前人的一个总结&…

【python基于mysql数据库实现无页面学生信息管理系统】

python基于mysql数据库实现无页面学生信息管理系统以及简单操作mysql前言一、分步讲解0.创建两张数据表1.大概思路2.首先连接数据库3.查看所有学生成绩信息4.查看所有学生个人信息5.查看指定学生成绩信息6.添加学生个人信息7.添加学生成绩信息8.修改学生个人信息9.修改学生成绩…

多模态融合技术

多模态融合的主要目标是缩小模态间的异质性差异&#xff0c;同时保持各模态特定语义的完整性&#xff0c;并在深度学习模型中取得较优的性能。 一、多模态融合架构 多模态融合架构分为&#xff1a;联合架构&#xff0c;协同架构和编解码器架构。联合架构是将单模态表示投影到…

数据库运维 | 携程分布式图数据库NebulaGraph运维治理实践

作者简介&#xff1a;Patrick Yu&#xff0c;携程云原生研发专家&#xff0c;关注非关系型分布式数据存储及相关技术。 背景 随着互联网世界产生的数据越来越多&#xff0c;数据之间的联系越来越复杂层次越来越深&#xff0c;人们希望从这些纷乱复杂的数据中探索各种关联的需求…

[附源码]Python计算机毕业设计大学生心理健康咨询系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

(免费分享)基于jsp,ssm酒店管理系统

开发工具&#xff1a;eclipse&#xff0c;mysql5.7 Tomcat8.0&#xff0c;jdk1.8 系统分用户前台和管理后台两部分 前台截图&#xff1a; 后台截图&#xff1a; package com.mypower.controller;import java.io.IOException; import java.io.OutputStream; import java.io.P…

行业如此内卷,品牌如何实现可持续招商增长?

文|螳螂观察&#xff08;TanglangFin&#xff09; 作者|陈小江 2019年&#xff0c;厦门的一位单亲妈妈&#xff0c;听了一堂课&#xff0c;驱车十几个小时抵达南京&#xff0c;就为找一个人。 找一个&#xff0c;能救企业的人。 由于股权融资对赌失败&#xff0c;这位原本坐…

【C初阶】第八篇——结构体

结构体的声明 什么是结构体 结构体的声明 结构成员的类型 结构体变量的定义和初始化 结构体成员的访问 结构体传参 结构体的声明 什么是结构体 结构体是一些值的集合,这些值称为成员变量.结构的每个成员可以是不同类型的变量. 结构体的声明 struct tag {member - list…

艾美捷人乳铁蛋白ELISA试剂盒预期用途注意事项

艾美捷Kamiya人乳铁蛋白ELISA试剂盒预期用途&#xff1a; 人乳铁蛋白ELISA是一种高度灵敏的双位点酶联免疫测定&#xff08;ELISA&#xff09;人类生物样品中乳铁蛋白的测定。仅供研究使用。不用于诊断程序。 引言 乳铁蛋白&#xff08;LF&#xff09;是一种具有抗菌活性的多…

Spring源码深度解析十六:@Aspect方式的AOP下篇 - createProxy

一、前言 文章目录&#xff1a;Spring源码深度解析&#xff1a;文章目录 我们上篇已经分析到了 Spring将已经找到所有适用于当前bean 的Advisor 集合。下面就要创建代理对象了&#xff0c;而代理对象的创建是从 AbstractAutoProxyCreator#createProxy()开始。下面我们就来看看…

微信小程序|基于小程序+C#制作一个聊天系统

此文主要基于小程序C#使用WebSocket制作一个聊天系统&#xff0c;基本实现小程序与服务端的聊天功能。用小程序自带的客服功能只能绑定微信且一对一沟通&#xff0c;接入市面上成熟的即时通讯预算又略显不足&#xff0c;干脆自己开发一个也能应对简单的业务场景。 实现流程1、服…

数据智仓功能介绍(二)

界面介绍 访问入口 具备权限的人员从系统管理后台进入界面&#xff0c;点击数据智仓&#xff0c;右侧是展示系统中已经配置的数据集。 数据集展示界面 如下图所示&#xff0c;系统中已经配置的数据集包含 数据集名称&#xff0c;修改人员&#xff0c;上次运行时间&#xff08…

matlab智能算法之遗传算法

智能算法之遗传算法智能算法之遗传算法1.背景2.算法3.案例3.1 案例求解二元函数的最大值智能算法之遗传算法 1.背景 2.算法 3.案例 3.1 案例求解二元函数的最大值 例1&#xff1a;计算二元函数f(x,y)20x2y2−10∗(cos(2πx)cos(2πy))f(x,y)20x^2y^2-10*(cos(2\pi x)cos(2…

[附源码]Node.js计算机毕业设计大学生健康系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

Qt扫盲-QToolButton 理论总结

QToolButton 理论总结1. 概述2. 使用场景3. 外观样式4. 菜单用途1. 概述 ToolButton 是一种特殊按钮&#xff0c;用于快速访问 特定命令或选项。与普通PushButton 按钮常用显示内容不同&#xff0c;ToolButton 通常不显示文本标签&#xff0c;而是显示图标。当然&#xff0c;也…

Windows与Linux利用系统自带实现共享文件夹的功能

这里需要两台机器在同一局域网或者可互相ping通。系统以Windows11和Windows Subsystem for Linux&#xff08;Ubuntu22.04.1&#xff09;或国产Linux发行版的统信UOS&#xff08;版本号20&#xff09;为例&#xff0c;其他的版本系统也类似&#xff0c;非Linux虚拟机也测试过&a…

蚁群算法详解-解决TSP问题

文章目录前言一、蚁群算法是什么&#xff1f;算法步骤二、基本原理三、数学模型1、算法中的参数设置2、构建路径轮盘赌例子3、更新信息素浓度代码终止四、代码展示五、参数实际设定1.参数设定的准则2.蚂蚁数量3.信息素因子4.启发函数因子5.信息素挥发因子6. 最大迭代次数7. 组合…

Android 实现相机(Camera)预览

CameraX 是一个 Jetpack 库&#xff0c;旨在帮助您更轻松地开发相机应用。 对于新应用&#xff0c;我们建议从 CameraX 开始。它提供一致且易于使用的 API&#xff0c;适用于绝大多数 Android 设备&#xff0c;并向后兼容 Android 5.0&#xff08;API 级别 21&#xff09;。 Ca…

Python基础篇学习

本篇博文目录:一.Python基础语法1.Python基础知识2.了解Python的基础语法结构3.python基础知识二.数据类型1.数字2.字符串3.布尔4.空值&#xff1a;None5.列表6.元祖7.字典8.Bytes9.集合(Set)三:程序三大结构( 顺序结构&#xff0c;分支结构&#xff0c;循环结构)1.顺序结构2.分…