自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(126)
  • 问答 (2)
  • 收藏
  • 关注

原创 使用 OpenTelemetry 管理观测类数据

使用 OpenTelemetry 管理观测类数据

2022-09-16 11:18:27 584 1

原创 使用 Delve 调试远程 Go 应用

使用 Delve 调试远程 Go 应用Delve 是 Go 语言的一个调试器。其目标是为 Go 语言提供一个易用,拥有完整功能的调试工具。安装可以参考这里。用 dlv version 命令验证是否安装成功:$ dlv versionDelve DebuggerVersion: 1.7.1Build: $Id: 3bde2354aafb5a4043fd59838842c4cd4a8b6f0b $构建应用在实际项目中 Delve 可以方便我们在本地调试部署在远程的 Go 应用,但为了使 De

2021-09-06 16:15:38 703 1

原创 减少方法的副作用(Side Effects)

方法的本质是接收一些数据作为输入,进行处理然后产生输出,如果方法内部不会对任何外部状态进行改变(例如改变了某个全局变量的值,数据库数据,或是文件内容等),那么这个方法可以称之为纯净的方法(Pure function)。go 基础库中有许多这样的纯净方法:math/pow.gofunc Pow(x, y float64) float64strings/strings.gofunc Replace(s, old, new string, n int) string下面示例中 generateKe

2021-08-18 12:57:27 523

原创 消息队列 - 使用场景,RabbitMQ、RocketMQ 和 Kafka 异同

原文地址:[消息队列](https://www.yuque.com/docs/share/d79c9d70-28a2-411a-acaf-6d56f8241f61?# 《消息队列》)

2021-06-09 15:32:42 311

原创 map 原理

本文大部分内容摘抄自 Go Questions.在计算机科学里,被称为相关数组、map、符号表或者字典,是由一组 <key, value> 对组成的抽象数据结构,并且同一个 key 只会出现一次。有两个关键点:是由 key-value 对组成的;key 只会出现一次。哈希查找表用一个哈希函数将 key 分配到不同的桶(bucket,也就是数组的不同 index)。这样,开销主要在哈希函数的计算以及数组的常数访问时间。在很多场景下,哈希查找表的性能很高。哈希查找表一般会存在“碰撞”的问题,

2021-06-07 10:31:55 738

原创 使用 google/wire 对 Go 项目进行依赖注入

google/wire 是 Go 语言的编译时依赖注入框架,与 Spring IoC 一样,wire 的目的也是让开发者从对项目中大量依赖的创建和管理中解脱出来,但两者在实现方式上有着很大的不同。Go 中的依赖注入在 Go 中,我们通常采取在构造函数中传入依赖的方式创建对象:func main() { NewUserStore(conf.Load(),db.InitMySQL())}func NewUserStore(cfg *Config, db *mysql.DB) (*UserStore

2021-01-20 15:50:33 908

原创 性能分析工具 - Cloud Profiler

Cloud Profiler性能分析是动态代码分析的一种形式,在应用运行时捕获应用的特征,然后使用这些特征信息确定如何使应用更快、更高效。Cloud Profiler 是一个 CPU 和内存性能分析工具,是一种采样统计性能分析器,开销极低,适合生产环境。以 Go 应用为例,用如下的代码在应用中开启 Profiler 代理,Profiler 代理会运行在新的 goroutine 中。import "cloud.google.com/go/profiler"func main() { pro

2021-01-12 12:57:45 472

原创 使用 Goroutine 和 Chanel 快速实现并发和排队

问题:某线下营业厅有 10 个业务办理窗口,每个窗口同一时刻只能接待一位客人。用 Goroutine 模拟同时有 12 个客户需要办理业务的过程。思路是这样的:一个 Goroutine 负责将这些任务(也就是例子中的客户)分发到 jobChannel 中,另一个 Goroutine 读取 jobChannel,读到任务后检查是否还有执行器(抽象出来的概念,也就是例子中的业务办理窗口)可以执行该任务,有就创建 Goroutine 进行执行,否则等待,当有可用执行器时继续。这里**“检查是否还有可用执行器”

2021-01-04 17:36:13 319

原创 MyBatis 缓存 - 下:二级缓存

通过上篇文章我们已经知道,MyBatis 一级缓存的最大共享范围为 SqlSession,即一次会话中,而且有可能会因为缓存没更新而导致脏读问题。如果需要在多个 SqlSession 中共享缓存,那么就需要开启二级缓存。SqlSession 的创建会借助 SqlSessionFactory,而 DefaultSqlSession 可由 DefaultSqlSessionFactory#openS...

2020-12-22 13:30:07 319

原创 【制定一个计划】开发总结 - UI 设计和学习 Flutter

我个人比较偏好简洁的 UI 设计,可惜不是相关专业,刚开始时完全没有方向。像很多 UI 工程师一样(跟我司 UI 学的),我第一件做的事情就是上 dribbble 寻找灵感,看到合适的就收藏下来,好日后进行模仿。下面的截图这是当时收藏的一些 UI 设计。dribbble 上好看的设计实在太多,可是要把收集到的碎片重整为自己需要的样子就不太容易了。“灵感”收集得差不多了,接下来就自己摸索着在 Figma 画页面,同时也能把一些功能和交互确定下来。UI 设计上花了很长时间,但看看最终上线后实际的 UI

2020-12-15 15:30:24 331

原创 ios时间管理软件【制定一个计划】正式上线啦

在经过三个月的开发之后,终于把这款 App 开发好了,全靠着下班后和早上早起的时间完成了开发,今天终于上线了。简单介绍下这款 App 是干什么的应用名称为 制定一个计划,就像其名字所传达的,它是来帮助使用者制定计划的。通过最直接,最清晰的方式帮助你记录和追踪自己的计划,辅助你达成自己的目标。制定一个计划一般需要如下的几个步骤:首先把想法记录下来,目标是什么?需要在什么时间内完成?如何实现?将计划进行拆解,拆分成多个阶段为每个阶段分配需要完成的任务计划开始后严格遵循计划,完成任务,并根据情况

2020-12-01 15:31:08 254

原创 Shiro + Spring Boot 实现权限管理系统

最近在蓝桥(实验楼)发布了一门以 Shiro 为主,Spring Boot 为辅,实现一个简单权限管理系统的【课程】,对 Shiro 的核心理念和使用进行了总结。欢迎大家支持。如果你有兴趣购买,请使用这个优惠码: m4fx6AQ9,可获得一些优惠。课程主要包含下面的知识点:Shiro 身份认证理论和实践Shiro 授权理论和实践Shiro 会话管理Shiro 原生 API 的使用在 Spring Boot 项目中集成 Shiro使用 Shiro 实现登录和登出功能使用 Shiro 实现用户

2020-09-07 11:26:21 274

原创 基于权限的访问控制和基于资源(The New RBAC)的访问控制

传统的 RBAC 指的是基于角色的访问控制(Role-Based Access Control),在安全领域中是被广泛使用的一种访问控制机制。应用程序因为提供的一个或一组功能的目标用户不同而通过角色对用户进行区分,每个角色只允许操作被授权了的一组功能。新的 RBAC (The New RBAC)指的是基于资源的访问控制(Resource-Based Access Control),相比传统 RBAC,新 RBAC 有着诸多优点。传统意义上的 RBAC(基于角色的访问控制)角色是一个抽象概念,通常代表一

2020-09-02 09:25:14 750 2

翻译 一. Go 为什么快?(译: 五件事让Go变得如此之快)

原文地址: five things that make go fast.本文并非完整翻译,只对原文关键部分进行提取归纳。正文:当人们谈论到为什么做出学习Go的决定时,往往会有不同的回答,但总有三个原因是他们都会谈及的:并发性(Concurrency)易于部署(Ease to deployment)性能(Performance)人们选择Go的一个重要原因是因为它快。Go的众多特性中...

2020-04-28 15:42:12 897

原创 使用 ETag 以利用浏览器缓存,节省带宽

ETag 可以理解为服务端的一个资源标识,当两次请求相同的 URL,且 URL 对应的资源没有变化时 ETag 的值应该相同。合理使用 ETag 可以有效利用浏览器缓存,降低服务器的带宽压力。原理分析用户第一次通过 URL 请求资源时,服务器将为该资源生成 ETag(其值一般为MD5摘要),并通过响应头返回给浏览器,浏览器会将资源进行缓存。下次相同 URL 被请求时,浏览器将在请求中附加 If...

2020-04-24 15:16:54 1038

原创 GoMailer - 用 Go 开发的轻量电子邮件推送服务

GoMailer轻量电子邮件推送服务(A lightly email sending service for Go)通过form提交用户输入的数据,GoMailer会将这些数据填入预先定义好的邮件内容模板中,并帮你把内容投递到指定的邮箱。也可以选择把邮件暂存在GoMailer中,另外选择时间手动触发投递。额外的可选配置:支持开启reCaptcha验证,避免恶意投递配置请求成功或失败时...

2020-03-26 00:00:04 1628

原创 浏览器直接上传文件到 Cloud Storage,绕开 App Engine Request 最大 32M 限制

随着流量的增加,GCP App Engine 会自动为应用分配更多的资源,但自动分配资源仍然受到一些阀值的约束,其中一条便是:发送到应用的请求,请求体不能大于32M。而对于一些上传大文件的需求,这个限制使得那些将文件上传服务的 EndPoint 设置在 App Engine 上的应用无法正常处理请求。考虑到 App Engine 不允许应用操作本地存储,而且我们上传的文件一般也不会保存在本地,而...

2020-01-16 15:18:06 733

原创 Go 实现简单的请求路由和中间件框架

go 中区分函数和方法,方法依附于对象,需要先创建对象,才能调用对象的方法;而函数是包级的,只要是公开的,那么通过包就可以访问。go 中定义新的类型有两种方式,类型别名和结构体:// 类型别名type Integer inttype Integer1 = int// 结构体type User struct { Name string Age int}此外,类型别...

2020-01-06 14:55:44 791

原创 JetBrains 系列 IDE 快速部署项目到远程服务器

JetBrains 系列 IDE 一直是我开发的主力工具,在开发时往往选择在本机进行运行和调试。这样毫无疑问是很高效的开发方式,但有时我们希望在更接近于线上的环境中进行调试,那么如何使此次的修改快速见效(部署以及运行)是需要解决的关键问题之一。JetBrains GoLand、JetBrains WebStorm 和 IntelliJ IDEA 是我用得最多的 IDE,接下来以一个用 go 开发...

2019-12-12 11:07:14 1042

原创 grpc java client, go server 错误 io.grpc.StatusRuntimeException: UNAVAILABLE

java client 获取 channel 的代码如下: public ManagedChannel getChannel() { ManagedChannel channel = ManagedChannelBuilder.forAddress(config.getGrpc().getHost(), config.getGrpc().getPort()) ...

2019-11-14 15:30:19 9247

原创 地图应用如何优化 上: 数据请求和渲染方式

前端在基于 Google Map 的地图应用上渲染数据时一般以 tile 为单位请求数据。简单来说,屏幕上可见的地图区域是由多个 tile 拼接而成的,数据渲染以 tile 为单位,数据请求也以 tile 为单位。这样,前端只需要绘制可见的几个 tile ,以及预绘制边缘的几个 tile,而不是一次绘制,绘制一张大图,也就是整个世界地图。既然是基于地图的应用,那么应用数据往往与地理位置相关,G...

2019-10-28 15:23:26 1113

原创 Spring IOC 容器启动流程分析

Spring IOC 容器启动流程分析使用 Spring 时,XML 和注解是使用得最多的两种配置方式,虽然是两种完全不同的配置方式,但对于 IOC 容器来说,两种方式的不同主要是在 BeanDefinition 的解析上。而对于核心的容器启动流程,仍然是一致的。AbstractApplicationContext 的 refresh 方法实现了 IOC 容器启动...

2019-08-29 12:48:28 430

原创 for 循环中取地址引发的错误

在for a,b := range c 遍历中, a 和 b 在内存中只会存在一份,即之后每次循环时遍历到的数据都是以值覆盖的方式赋给 a 和 b,a,b 的内存地址始终不变。以下是错误代码示例: p := []s2.Rect{} var rs []*s2.Rect for _, r := range p.Rect { rs = append(rs, &r) }因为...

2019-07-30 17:32:05 581

原创 Google Cloud - 使用时值得注意的细节

在 instance 启动和停止时收到通知appengine 在进行自动扩缩时可能会频繁的停止或启动 instance,应用往往在启动时需要进行一些数据预热处理, appengine 提供了 /_ah/warmup 回调,在应用启动时得到通知,需要注意的是 /_ah/warmup 只有在自动扩缩(Automatic scaling)模式下生效。除了 warmup 回调外,/_ah/start ...

2019-07-19 16:33:27 1514

原创 Google Cloud - instance 间通信(pubsub + memcache 实现实例间通信和保证一致性)

GCP - appengine 通过 version 管理应用,你可以在 appengine 上部署多个 version(dev、qa等),而每个 version 可以有多个 instance,一个 instance 可简单理解为一个基于 Spring Boot 实现的微服务,当有请求到达时 appengine 会根据一定策略选择由哪一个 instance 处理该请求,如果现有的 instance...

2019-07-11 16:38:28 678

原创 词素+词

词素+词语言结构的层次性:语法层面:词素、词、词组、分句、句子;语篇层面:句子、语段、语篇;词素粘附词素-词缀前缀: postwar coexist后缀:movement careless carelessness前后缀:unlucky coexistence否定前缀:in-(inactive) im-(imperfect) il-(illogical) ir-(irresponsib...

2019-05-07 07:39:45 1442

原创 六. 语句与语法:函数 + 列表生成式

函数在Python中,定义一个函数要使用 def 语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用 return 语句返回。如果没有return语句,函数执行完毕后也会返回结果,只是结果为 None。return None可以简写为return。def square_of_sum(L): sum = 0 for item in L...

2018-12-14 16:00:39 265 2

原创 五. 语句与语法:语句

输入输出s = input() 接收输入,接收为str型input(‘提示’) 先输出提示信息print(‘=’ * 20) 输出20次 =print(n,b,v,sep=’ - ’) 用-分隔n,b,v并输出print(1, 2, 3, 4, sep=’\n’, end=’ end’) 用换行分隔,最后输出endprint(‘f={:08,.4f}’.format(math.pi *...

2018-12-14 15:57:12 241

原创 四. 数据类型:其它类型 + 文件

空对象 None布尔 bool:True、FalseTrue本质为 1(等且只等于),False本质为0(等且只等于)。True + 4 -&gt; 5False – 3 -&gt; -3注意:bool(3) -&gt; Truebool(-3) -&gt; Truebool(0) -&gt; Falsebool(‘s’) -&gt; Truebool([]) -&gt; Fa...

2018-12-14 15:52:45 748

原创 三. 数据类型:集合类型 + 映射类型

集合类型set 持有一系列元素,这一点和 list 很像,但是set的元素没有重复,而且是无序的,这点和 dict 的 key很像。set存储的元素和dict的key类似,必须是不变对象借助list创建set,重复元素会被合并。s = set([1,2,34,1]) -&gt; {1, 2, 34}s.add(11) -&gt; {1,2,34,11}s.add(1) -&gt; ...

2018-12-14 15:49:23 1094

原创 二. 数据类型:序列类型

分为可变和不可变序列。序列通用操作(以列表为例)生成序列list(‘abcd’) -&gt; [‘a’,’b’,’c’,’d’]list(range(5)) -&gt; [0,1,2,3,4]判断元素是否包含a = [1,2,3,4,’a’,’b’]1 in a -&gt; True2 not in a -&gt; False连接序列a = [1,2]b = [4,5]a ...

2018-12-14 15:45:12 1124

原创 一. 数据类型:基本数据类型

第一个 Python 程序解释器解释运行,源代码编译为pyc字节码,字节码会被缓存,提供下次运行速度,根据时间戳和版本判断是否需要重新编译。在PVM虚拟机中运行。Source(py) -&amp;gt; Byte code(pyc) -&amp;gt; Runtime(PVM)整数Python可以处理任意大小的整数,当然包括负整数,在Python程序中,整数的表示方法和数学上的写法一模一样,例如:1,1...

2018-12-14 15:31:11 254

原创 排序:六. 堆排序(利用堆结构(二叉完全树)的弹出/下沉操作排序)

平均情况、最好情况和最坏情况的时间复杂度都为O(nlog2n),即线性对数复杂度,不稳定的排序算法。堆结构在 数据结构:二叉完全树(堆) 一文中进行了分析,接下来用代码来实现其几个关键操作:弹出、插入、取顶、上浮、下沉堆操作实现这里的实现以小根堆为例:堆的基本操作接口定义:弹出方法弹出时将数组尾元素放到到数组首部,然后对数据首部(根节点)执行下沉操作即可。插入方法插入时将新元...

2018-12-14 11:05:14 565

转载 数据结构:二叉完全树(堆)

参考文章堆常用来实现优先队列。用数组保存数据,而不是链表。在队列中,操作系统调度程序反复提取队列中第一个作业并运行,因为实际情况中某些时间较短的任务将等待很长时间才能结束,或者某些不短小,但具有重要性的作业,同样应当具有优先权。堆即为解决此类问题设计的一种数据结构。堆的实现通过构造二叉堆(binary heap),实为二叉树的一种(完全二叉树)完全二叉树:若设二叉树的深度为h,除第 h ...

2018-12-14 10:54:56 499

原创 排序:四. 归并排序(合并两个已经排好序的数组)

是创建在归并操作上的一种有效的排序算法。平均、最好和最坏时间复杂度都为O(nlog2n)线性对数。是稳定的。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。归并操作(merge)也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并排序算法依赖归并操作。迭代法申请空间,使其大小为两个已经排序序列之和,该空间用来存...

2018-12-13 09:03:29 5133

原创 排序:三. 插入排序(将元素比较插入到前面的位置)

参考文章时间复杂度O(n2),最好情况O(n),最坏情况O(n2),稳定。(同冒泡)是一种简单直观的排序算法。适用于量级小于千,或者若已知输入元素大致上按照顺序排列。插入排序不适合对于数据量比较大的排序应用。工作原理:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。算法描述如下:从第一个元素开始,该元素可以认为已经被排序取出下一个元素(第二个元...

2018-12-13 08:58:58 493

原创 排序:二. 直接选择排序(选择剩下的元素里最大(小)放到最后(前))

时间复杂度O(n2),最好情况O(n2),最坏情况O(n2),不稳定。选择排序(Selection sort)是一种简单直观的排序算法。元素交换次数少,比较占多数。工作原理如下首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾以此类推,直到所有元素均排序完毕。选择排序的主要优点与数据移动有关。如果某个...

2018-12-13 08:54:55 978

原创 排序:一. 冒泡排序 (前往后所有未排序的元素相邻比较)

系列文章共实现了六种排序算法:冒泡排序直接选择排序插入排序归并排序快速排序堆排序定义了 Sortable 接口,每种排序方法实现该接口,在 sort 方法中实现排序。public interface Sortable&lt;T&gt; { /** * 将数组进行排序 * * @param sour 待排序的数组 * ...

2018-12-13 08:51:25 1015

原创 使用 zebra 对数据库表进行水平拆分

zebra 是美团点评开发的数据库访问层中间件,代码维护在 GitHub:Meituan-Dianping/ZebraZebra是一个基于JDBC API协议上开发出的高可用、高性能的数据库访问层解决方案,是美团点评内部使用的数据库访问层中间件。具有以下的功能点:配置集中管理,动态刷新支持读写分离、分库分表丰富的监控信息在CAT上展现异步化数据库请求,多数据源支持zebra 的...

2018-12-07 11:02:08 1930

原创 解析配置文件自动装配 DataSource + AbstractRoutingDataSource + AOP 实现动态数据源 - 补充:兼顾事务回滚以及分布式事务的情况

前两篇文章已经介绍了动态数据源的具体实现过程,在经过一段时间的使用后,发现了两个比较严重的问题,在这里进行补充说明。事务执行失败时没有切回默认数据源@Transactional 注解的方法意味着使用数据库事务执行方法中的 sql 操作,默认情况下当方法抛出不受检查异常时,事务会进行回滚,我所实现的动态数据源方案通过 AOP 和注解的方式切换数据源, @Transactional 方法执行前切换...

2018-11-28 17:55:17 429

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除