全部后端前端产品运维设计开发者客栈测试
最新 最热 官方 加精

Qbian | 2022-11-09 | 开发者客栈

TODO(待办)新功能上线啦 !!! 🎉🎉🎉

地址:[https://www.developers.pub/todo/doing](https://www.developers.pub/todo/doing) 使用场景 生活中 帮忙取快递提醒:下班路过小区快递点,帮家人取个快递,家人可以分配个任务给你,在你快到家的时间定时提醒不要忘记; 重要日期提醒:生活中重要的时刻(生日、纪念日等),可以提前创建好任务,做好定时提醒别错过; 待办事项提醒:生活中看到的一些好看的电影,记录下来周末找个完整的时间刷一刷; 记录想法:生活中随时冒出来的一些奇思妙想,可能过会就会忘掉,可以快速记录下来,事后回顾; 工作中 自动生成日报并推送:工作中每天都需要写日报,可以把当天的工作罗列出来,当天工作内容更明确,效率更高,下班点还会自动生成并推送日报; 自动生成周报并推送:工作中每周都需要写周报,本周完成的工作,在本周结束后,自动生成周报并推送,高效快捷,还不会遗忘; 工作内容定期回顾总结:自定义时间范围,项目标签等统计任务,做工作复盘总结,不断反思进步; 功能列表 个人使

 2342 |  9 |  29 开发者客栈

思危则安 | 23分钟前 | 后端相关Java

高级Java开发升级

高级Java开发升级👍 架构师之路

 3 |  0 |  0 后端相关Java

前端小二 | 23小时前 | 后端相关

分布式事务的理解和常见解决方案汇总

分布式事务的理解和常见解决方案汇总 分布式事务的理解 分布式事务简介 在互联网系统里面,一般都是牺牲强一致性换取系统的高性能和高可用,只需要保证数据的最终一致性,只不过达到最终一致性所需要的时间需要在用户和产品层面是可以接受的。而金融系统则不同,金融系统一般都需要保持强一致性。 那么,在我们互联网场景中,怎么保证我们的数据最终一致性呢?一般来说,我们会采用分布式事务、分布式锁等,分布式事务与数据库事务一样,同样需要具有事务最基本的 ACID(原子性、一致性、隔离性、持久性)四个属性,事务的 ACID 特性,实现的是系统状态的一致性。一般在支付,或其他需要原子操作的场景下比较常用。 我们怎么理解分布式事务呢?我们知道,现在的系统,一般都是微服务架构,即便不是微服务架构,那么一个系统也会有多个服务来组成。那么业务上的一个完整流程,很有可能就需要分别调用散落在各个节点的各个不同服务上的接口,这个时候,如果我们想要保证这个完整流程的数据一致性,那么就需要保证请求在各个节点的各个服务中的请求,要么都成功,要么都失败。如果采用强一致性方案,基本上就靠“两阶段提交”这样...

 18 |  0 |  0 后端相关

前端小二 | 23小时前 | 打包工具

解读SourceMap

SourceMap的用途 前端工程打包后代码会与源码产生不一致,当代码运行出错时控制台会定位出错代码的位置。SourceMap的用途是可以将转换后的代码映射回源码,如果你部署了js文件对应的map文件资源,那么在控制台里调试时可以直接定位到源码的位置。 SourceMap的格式 我们可以生成一个SouceMap文件看看里面的字段分别都对应什么意思,这里使用webpack打包举例。 源码: //src/index.js function a() {   for (let i = 0; i < 3; i ) {     console.log('s');   } } a(); 打包后的代码: //dist/main-145900df.js !function(){for(let o=0;o<3;o )console.log("s")}(); //  sourceMappingURL=main-145900df.js.map .map文件: //dist/main-145900df.js.map {   "version"

 13 |  0 |  0 打包工具

OOM | 23小时前 | Dubbo

Dubbo服务提供者如何优雅升级?

1 当我们使用dubbo作为服务间通信的组件时,在后期的系统维护中可能会因为业务需要,服务提供者某些接口需要升级,对应的服务消费者配合作相应的修改,测试通过后一起发版上线即可。但是在这个过程中,有很多需要注意的点,不妨来梳理一下以作记录,希望对此不清楚的开发者有所帮助。 再次申明一下我们的需求吧。假设服务A提供了一个服务IHelloService,其中有一个方法sayHello,服务B、C、D...都对此有依赖,假设服务A提供的该接口已上线且被服务B、C、D正常消费,线上运行稳定。 先将服务提供者和服务消费者分别启动,此时消费方正常消费服务。 api: public interface IHelloService { Result sayHello(ModelParent param); } 服务提供者: @Component public class HelloServiceImpl imple

 13 |  0 |  0 Dubbo

女王范 | 23小时前 | 后端相关

大数据上云存算分离演进思考与实践

存算分离、数据湖、在离线混部,这些名词越来越多的出现在各行各业数字化转型的关键活动中。本文仅从大数据产品商业化从业者的视角来探讨与分析大数据领域的存算分离演进过程,核心价值,与相关所产生的蓬勃技术生态。内容来自阿里云计算平台大数据技术商业化思考与实践,与大家共同探讨。 01起源:存算分离不是新架构 数据架构起源: 以上三张图分别代表过去三十年大规模数据架构演进过程。 第一张图是最早的Shared-Disk架构主要是通过独立定制网络NAS于存储架构来实现第一代的存算分离架构,性能好但成本较高, 可扩展性较差(ScaleUp)。其中StorageAreaNetwork作为网络存储体系结构,采用网状通道(Fibre Channel ,简称FC,区别与Fiber Channel光纤通道)技术,通过FC交换机连接存储阵列和服务器主机,建立专用于数据存储的区域网络。 第二张图是过去十几年Shared-Nothi...

 11 |  0 |  0 后端相关

念旧。 | 1天前 | Spring 全家桶

Spring Boot 开发环境热部署方案 !

前言 Spring Boot 提出了多项开箱即用的功能特性,但归根到底还是围绕简化应用的创建、开发、运行。开发环境下我们经常对项目代码进行变动,如果每次都重新启动应用会浪费我们大量时间,为此就产生了多种进行热部署的方案,可以在不重启的情况下使用新的代码。 热部署常用实现方案 然而,在 Java 中实现热部署并不是一件容易的事情。 1. ClassLoader 重新加载 Java 作为一种静态语言,类一经加载到 JVM 中,便无法修改,而且同一个类加载器对于同一个类只能加载一次,因此热部署常用的一种解决方案是创建新的 ClassLoader 加载新的 class 文件,然后替换之前创建的对象。 2. Java Agent 另一种解决方案是使用 Java Agent , Java Agent 可以理解为 JVM 层面的 AOP,可以在类加载时将 class 文件的内容修改为自定义的内容,并且支持修改已加载到 JVM 的 class,不过对于已加载到 JVM 的 class 只能修改方法体,因此具有一定的局限性。 ...

 24 |  0 |  0 Spring 全家桶

奈我何 | 1天前 | Java

消灭空指针,这才是Java 8的最优解?

前言 在平时的业务开发中,空指针是我们经常遇到的问题, 他可能会导致我们的流程无法正常进行或者一些意外情况的发生。 这就是我们需要避免空指针的原因,那我们有哪些方式去解决这个问题呢? 空指针场景 1. 包装类型字段,因为自动拆箱出现空指针; 2. A对象包含B对象,通过A对象获取B对象字段时,没有判断就直接去调用B对象中的方法出现空指针; 3. 字符串比较,null.equal("字符串")出现空指针 4. 远程返回的List不是空数组而是null,对其进行操作出现空指针。 线上空指针问题如何排查 日常的开发过程中,一般情况下我们都是通过查看日志来排查空指针的问题,如果日志没有做到位的情况下,我们只能通过NullPointerException抛出的位置去跟踪代码。 这就要求我们,在写代码的时候做好日志的打印 1. 调用方法的入口进行入参的打印,方法返回的结果进行出参打印 如果没有提前做好日志打印,那我们可以考虑利用阿里的Java诊断工具Arthas来处理 1. Arthas启动后,获取来了JVM进程 2. 通过watch指令来...

 40 |  0 |  0 Java

流苏 | 1天前 | NodeJs

Node.js 是如何跑起来的

一个 TCP 连接的案例 TCP 服务端 const net = require('net'); const server = new net.Server(); server.listen(9999, '127.0.0.1', () =  {    console.log( server is listening on ${server.address().address}:${server.address().port} ); }); server.on('connection', (socket) =  {    server.getConnections((err, connections) =  {     console.log('current clients is: ', connections);    });     socket.on('data', (data) =  {         console.log( received data: ${data.toString()} );     }); }); TCP

 18 |  0 |  0 NodeJs

柚香 | 1天前 | 数据库

了解那些“奇葩”SQL写法,快速写出高效率SQL

导语:本文主要讲解常见的SQL开发场景、‘奇葩’SQL写法并深入执行计划,带你了解如何快速写出高效率SQL。 背景 关于sql调参数、数据倾斜可以搜到很多文章,本文主要讲解常见的SQL开发场景、‘奇葩’SQL写法并深入执行计划,带你了解如何快速写出高效率SQL。 高效写法 union直接使用效率低吗? 场景介绍 在一些业务场景中,需要将多份数据合并在一起,比如要取客户信息,客户信息存在两张表中有交叉(假设两张表中交叉的客户信息是一致的),需先将两份数据合并在一起。 写法&执行计划探查 因为两张表中数据有交叉,所以需要会先将数据去重,然后再去join。去重方式常见于: SELECT cst_id,cst_info FROM ( SELECT cst_id,cst_info FROM @cst_info_a WHERE dt = '${bizdate}' UNION SELECT cst_id,cst_info FROM

 17 |  0 |  0 数据库

iron Man | 2天前 | 前端相关

ECMAScript 2023 有哪些更新?

ECMAScript 规范每年都会更新一次,ECMAScript 2023 预计将于 6 月左右获得批准,这将是 ECMAScript 的第 14 版。下面是 ECMAScript 提案中已完成并预计在 ECMAScript 2023 发布的功能! 已完成的提案 :https://github.com/tc39/proposals/blob/main/finished-proposals.md 下面就来看看这些功能都有什么用! 从尾到头搜索数组 (1)概述 在 JavaScript 中,通过 find() 和 findIndex() 查找数组中的值是一种常见做法。不过,这些方法从数组的开始进行遍历: const array = [{v: 1}, {v: 2}, {v: 3}, {v: 4}, {v: 5}]; array.find(elem =  elem.v   3); // {v: 4

 57 |  2 |  0 前端相关

花小染 | 2天前 | 后端相关

关于 TCP/IP,必知必会的十个问题

本文整理了一些TCP/IP协议簇中需要必知必会的十大问题,既是面试高频问题,又是程序员必备基础素养。 一、TCP/IP模型 TCP/IP协议模型(Transmission Control Protocol/Internet Protocol),包含了一系列构成互联网基础的网络协议,是Internet的核心协议。 基于TCP/IP的参考模型将协议分成四个层次,它们分别是链路层、网络层、传输层和应用层。下图表示TCP/IP模型与OSI模型各层的对照关系。 TCP/IP协议族按照层次由上到下,层层包装。最上面的是应用层,这里面有http,ftp,等等我们熟悉的协议。而第二层则是传输层,著名的TCP和UDP协议就在这个层次。第三层是网络层,IP协议就在这里,它负责对数据加上IP地址和其他的数据以确定...

 59 |  1 |  0 后端相关

后端小二 | 2天前 | JavaScript

探索在 JS 中,为什么要在函数前面加!

简介 我们基本都知道,函数的声明方式有这两种 function msg(){alert('msg');}//声明式定义函数 var msg = function(){alert('msg');}//函数赋值表达式定义函数 但其实还有第三种声明方式,Function构造函数 var msg = new function(msg) {   alert('msg') } 等同于 function msg(msg) { alert('msg') } 函数的调用方式通常是 方法名() 但是,如果我们尝试为一个“定义函数”末尾加上 () ,解析器是无法理解的。 function msg(){ alert('message'); }();//解析器是无法理解的 定义函数的调用方式应该是 print() ; 那为什么将函数体部分用 () 包裹起来就可以了呢? 原来, 使用括号包裹定义函数体,解析器将会以函数表达式的方式去调用定义函数。 也就是说,任何能将函数变成一个函数表达式

 24 |  0 |  0 JavaScript

观云 | 2天前 | 后端相关

HashMap 为什么不能一边遍历一遍删除

前段时间,同事在代码中 KW 扫描的时候出现这样一条: 上面出现这样的原因是在使用 foreach 对 HashMap 进行遍历时,同时进行 put 赋值操作会有问题,异常 ConcurrentModificationException。 于是帮同简单的看了一下,印象中集合类在进行遍历时同时进行删除或者添加操作时需要谨慎,一般使用迭代器进行操作。 于是告诉同事,应该使用迭代器 Iterator 来对集合元素进行操作。同事问我为什么?这一下子把我问蒙了?对啊,只是记得这样用不可以,但是好像自己从来没有细究过为什么? 于是今天决定把这个 HashMap 遍历操作好好地研究一番,防止采坑! foreach 循环? Java foreach 语法是在 JDK 1.5 时加入的新特性,主要是当作 for 语法的一个增强,那么它的底层到底是怎么实现的呢?下面我们来好好研究一下: foreach 语法内部,对 collect...

 44 |  0 |  0 后端相关

大牛猫 | 4天前 | 后端相关

一台服务器最大能支持多少条 TCP 连接

一、一台服务器最大能打开的文件数 1、限制参数 我们知道在Linux中一切皆文件,那么一台服务器最大能打开多少个文件呢?Linux上能打开的最大文件数量受三个参数影响,分别是: fs.file-max (系统级别参数):该参数描述了整个系统可以打开的最大文件数量。但是root用户不会受该参数限制(比如:现在整个系统打开的文件描述符数量已达到fs.file-max ,此时root用户仍然可以使用ps、kill等命令或打开其他文件描述符) soft nofile(进程级别参数):限制单个进程上可以打开的最大文件数。只能在Linux上配置一次,不能针对不同用户配置不同的值 fs.nr_open(进程级别参数):限制单个进程上可以打开的最大文件数。可以针对不同用户配置不同的值 这三个参数之间还有耦合关系,所以配置值的时候还需要注意以下三点: 1. 如果想加大soft nofile,那么hard nofile参数值也需要一起调整。如果因为hard nofile参数值设置的低,那么soft nofile参数的值设置的再高也没有用,实际生效的值会按照二者最低的来...

 26 |  0 |  0 后端相关

蔡文姬 | 4天前 | 后端相关

技术方案(开源方案)选型的考量和方法论

技术方案(开源方案)选型的考量和方法论 我的观点:每个公司的情况不一样,开发人员的能力和语言也不一样,因此方案选型需要根据自身情况而定,没有最好,只有最合适!但是,可以有相关的方法论去帮助我们更好的选择合适的方案! 首要一定要了解清楚背景 首要一定要了解清楚背景,只有背景了解清楚了,大家才能在同一个起点上做相关的决策和讨论,技术方案一定是某个背景下产生的,如果脱离实际业务背景,那么技术方案也无法选择最优的。 这个背景包括的点会比较多,比如当前业务状况、未来发展情况、当然人力情况、现有技术方案等等所有相关的。 技术方案的选择需要团队内部的人员相匹配 技术方案的实现是需要团队内部的开发人员来具体实施的,因此一定要考虑团队内的人员具体情况,并且所选择的技术方案需要和团队内部的人员相匹配。比如编程语言、团队规模、公司业务、公司体量。比如当前这个方案技术人员是否接触过、编程语言是否熟悉、技术人员是否能够完全掌握这个方案等。 但是注意,这里不是说选择完全熟悉的领域或者方案,但是一定是考虑的因素,因为,如果你团队技术人员完全不懂这个技术、语言也不熟悉,选择这个...

 48 |  0 |  0 后端相关

布朗熊 | 4天前 | 数据库

为什么建议主键整型自增?

看到一个MySQL数据库设计原则: 强烈建议表的主键使用整型自增主键 。为啥呢? 要弄明白这个问题首先需要了解MySQL是如何维护数据的,你需要知道以下几点: MySQL的InnoDB存储引擎是在B+树上维护表数据的 B+树是一种平衡树 在这棵树上,每个节点在计算机中叫做数据页,默认16k 树的叶子节点是完整的行数据,非叶子节点是主键 叶子节点中的行数据按id从小到大的顺序排列 PS:MySQL索引底层数据结构详细分析过程参考这篇[深入分析MySQL索引底层原理](http://mp.weixin.qq.com/s?__biz=MzUxNTQyOTIxNA &mid=2247485207&idx=2&sn=2390977fea77021ee02485e80a5a2fcd&chksm=f9b78126cec00830e5bc54e1149be59dd1f303aff40c4a8adcc6e2ed800fa63196dce81e93e8&scene=21 wechat_redirect) 查询过程 明白了MySQL维护数据的方式,下面我们

 29 |  0 |  0 数据库

雨馨 | 5天前 | 后端相关

API开放平台网关需要做什么?

API的全称是应用编程接口(Application Programming Interface),这并不是一个新概念,在计算机操作系统出现的早期就已经存在了。在互联网时代,把网站的服务封装成一系列计算机易识别的数据接口开放出去,供第三方开发者使用,这种行为就叫做开放网站的API,与之对应的,所开放的API就被称作openAPI。 如果要将API开放出去提供给外部第三方调用,需要考虑些什么?如何搭建这样的系统呢?今天就来分析一下吧。 既然是开放平台,那么接口也就是开放给所有人。这里的 所有人 并不是谁都可以来调,至少需要在开放平台注册,是平台合法用户,然后注册应用,平台给你颁发一套appId和appSecert,请求时用来认证是不是合法用户。这是最基本的。 开放平台API处理流程为:安全校验、身份认证、鉴权、流控、加解密、基本参数检验,调用业务服务接口,结果包装,异常码转换,返回数据。 安全校验包括什么 ? 请求防重放 ...

 43 |  0 |  0 后端相关

一纸荒年 | 5天前 | 后端相关

面向对象分析与设计的底层逻辑

在面向对象出现之前,已有面向过程的分析方法,那为什么面向对象被提出了呢?究其本质,人们发现面向过程并非按照人正常认识事物的方式去分析软件。面向过程是一种归纳的分析方法,由外到内的过程;面向对象是一种演绎的分析方法,由内到外的过程。本文将为大家分享面向对象分析与设计的底层逻辑。 01面向对象是符合人认识事物的基本方法 1.1 人是怎么认识事物的 在面向对象出现之前,已有面向过程的分析方法,为什么面向对象被提出了呢?究其本质原因,人们发现面向过程并不是按照人正常认识事物的方式去分析软件,那么人究竟是怎么认识事物的呢,Yourdon 在《面向对象的分析》一书中提到,人类认识事物是遵循分类学的原理,分类学主要包含三点:区分对象及其属性; 区分整体对象及其组成部分;不同对象类的形成及区分。 我们现在可以回想下我们认识事物的过程,是不是和分类学所提到的 3 个要点很相似,看到一个事物,大概会感知到它的组成结构是怎样的,形状是怎样的,属于什么分类。所以,人认识事物是以对象的视角切入的,然后赋于对象具体的概念,比如苹果、梨子、汽车等等概念名称。 ![图片](ht...

 65 |  0 |  0 后端相关

雪千寻 | 5天前 | 后端相关

软件工程中建模的底层逻辑

本文将为大家分享建模的底层逻辑和建模的方法,并通过一些大家通识的技术案例讲述建模的过程。 建模对于大家来讲并不陌生,而且建模的方法也有很多,如用例建模、四色建模、事件风暴等,但在日常工作中,大家又觉得建模挺虚的:怎么把建模落到实际开发工作中。个人认为建模是分两部分:第一部分是业务概念建模,对现实业务抽取核心概念构建出模型(知识层);第二部分是系统建模,系统建模是源于业务概念模型,遵循某些原则最终形成开发可落地的模型(操作层)。在本文中,给出建模的底层逻辑: 用图形逻辑地表达现实业务的抽象 ,通过一些大家通识的技术案例讲述建模的过程。 01建模的底层逻辑 建模的作用不言而喻,它可以极大简化大家对复杂事物的认识,让人能在短时间内有全局视野看清楚业务,而且建模是用面向对象的思维分析事物,也容易转化成类图。用一个公式表达建模的底层逻辑: 建模 = 图形 + 逻辑 + 现实的抽象 ,用一句概括即是 用图形逻辑地表达现实业务的抽象 ,接下面主要讲述图形、逻辑、现实的抽象这三部分的内容。 1.1 图形 图形即为UML图形,下面是6种对象间的关联图...

 13 |  0 |  0 后端相关