- 博客(72)
- 收藏
- 关注
原创 golang实现pdf中自动换行的表格
由于CellFormat方法不支持\n换行,会被变成乱码,MultiCell方法会自动将坐标定位到下一行。所以需要自己实现坐标的计算变换。通过Rect方法画出单元格,MultiCell方法在格内自动换行写字,在计算坐标重复写单元格,最终组成一行。加载字体时,会将前面New方法指定的目录和AddUTF8Font方法指定的目录文件拼在一起。
2024-01-30 15:45:34 781 2
原创 gin实现event stream
是属于http的一种通信方式,可以实现服务器主动推送。原理于客户端请求服务器之后一直保持链接,服务端持续返回结果给客户端。
2023-10-09 13:04:38 795
原创 golang协程模型——可扩展的go调度设计
译自:Scalable Go Scheduler Design Doc在GMP模型出现之前,golang的协程调度只有M(工作线程)和G(goroutine)。协程切换全部依赖于全局的runq,会产生一些问题:单一的全局锁和集中的状态:全局锁空值全部的协程相关操作,如协程的创建,结束和重新调度等。这会导致高并发场景下加锁解锁的消耗过高。协程的切换问题:M之间经常会切换可执行的G,这会导致额外的开销以及延迟的增加。每个M的内存缓存:当前的内存缓存和其他缓存(堆栈等)和所有的M都相关联。实际上只有正在
2022-04-24 16:33:22 396
原创 sync.Once——golang单例模式
之前写的一个java的单例模式在golang中我们期望一个方法只执行一次的时候,通常会使用实例化一个sync.Once结构体,然后使用once.Do方法来包装我们需要执行的方法f。在初始化各种连接的时候非常常用。代码示例import ( "sync")// 单例对象的结构体type Singleton struct { Age int Name string Addr string}var once sync.Once// 全局变量instancevar instan
2022-04-21 15:17:59 822
原创 golang sort.SearchInts查找算法
源码// SearchInts 在排序的整数切片中搜索 x 并返回 Search 指定的索引。 // 如果 x 不存在,则返回值是插入 x 的索引(它可能是 len(a))。 切片必须按升序排序。func SearchInts(a []int, x int) int { return Search(len(a), func(i int) bool { return a[i] >= x })}func Search(n int, f func(int) bool) int { // 定义
2022-03-29 17:42:58 3234
原创 windows平台使用docker安装es踩坑
1 wsl占用内存过高按下Windows + R 键,输入 %UserProfile% 并运行进入用户文件夹新建文件 .wslconfig设置资源限制[wsl2]memory=2GBswap=0localhostForwarding=true2 启动es报错内存不足[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]进入docker-deskto
2022-01-11 15:54:18 1406 1
原创 跟着官网学k8s-05运行应用程序的多个实例
一般情况下pod的数量不会是一个,多个pod可以让服务更加的可靠并且可以承受更大的流量。service的type类型可以为LoadBalancer即负载均衡。使用该类型service需要指定外部负载均衡器的ip以及nodeport和clusterip查看deployment和ReplicaSet,ReplicaSet的命名格式为【deployment】-【随机字符串】$ kubectl get deploymentsNAME READY UP-TO-DATE
2021-11-11 20:22:21 533
原创 跟着官网学k8s-04使用Service暴露您的应用
本节主要介绍sk8s中的serviceKubernetes 的 Service 是一个抽象层,它定义了一组 Pod 的逻辑集,并为这些 Pod 支持外部流量暴露、负载平衡和服务发现简单说,service就是负责为pod提供网络访问入口,也算是k8s实现微服务的核心机制。没有service的时候,请求可以通过pod的ip+port直接访问pod运行的服务。但是如果有pod有多个副本呢?pod的ip不是固定的呢?pod的副本数量动态变化呢?使用get services命令查看$ kubectl ge
2021-11-10 23:11:25 909
原创 跟着官网学k8s-03查看pod和工作节点
本章涉及到一些概念1.首先是Pod,Pod 是一组一个或多个应用程序容器(例如 Docker),包括共享存储(卷), IP 地址和有关如何运行它们的信息。我们在创建deployment的时候。k8s就为我们添加了一个Pod来托管我们的应用。Pod 中的容器共享 IP 地址和端口,始终位于同一位置并且共同调度,并在同一工作节点上的共享上下文中运行2.工作节点Node,一个 pod 总是运行在 工作节点。工作节点是 Kubernetes 中的参与计算的机器,可以是虚拟机或物理计算机,具体取决于集群。每个工
2021-11-09 23:15:28 3450
原创 跟着官网学k8s-02使用kubectl创建Deployment
先看说明一旦运行了 Kubernetes 集群,就可以在其上部署容器化应用程序。 为此,您需要创建 Kubernetes Deployment 配置。Deployment 指挥 Kubernetes 如何创建和更新应用程序的实例。创建 Deployment 后,Kubernetes master 将应用程序实例调度到集群中的各个节点上。创建应用程序实例后,Kubernetes Deployment 控制器会持续监视这些实例。 如果托管实例的节点关闭或被删除,则 Deployment 控制器会将该实例替
2021-11-09 13:49:44 2492
原创 跟着官网学K8S-01部署本地kubernetes
k8s交互式教程提供了预先安装好的minikube查看minikube版本minikube version启动minikube,下面的命令会启动minikube,minikube会启动一个虚拟机,并且在该虚拟机上运行一个k8s clusterminikube start查看kubectl版本,客户端版本就是kubectl版本,服务器版本就是kubernetes版本kubectl version查看cluster信息kubectl cluster-info查看cluster内
2021-11-08 23:49:07 119
原创 Go语言学习笔记(2)-------数据类型
go语言中的数据类型大体上分为基本数据类型和派生数据类型,其中基本数据类型主要有以下几种:布尔类型:true/false,与java一样数字类型:包括了整型的int(其中又包括有符号的int8,int16,int32,int64以及无符号的unit8,unit16,unit32,unit64)。还有浮点型的float和complex字符串类型:没错字符串在go中属于基本数据类型而派生类型主要包括了下面几种:指针类型数组类型结构化类型Channal类型函数类型切片类型接口类型Ma
2020-09-10 00:40:42 312
原创 Go语言学习笔记(1)-------Go环境安装以及Go的语法
首先安装与环境配置我就不贴了,与其他语言没有差别。下面是一个最简单的go程序,仅仅是输出了hello world两个单词package mainimport "fmt"func main() { fmt.Print("hello world")}输出结果虽然go语言是支持面向对象编程的,但是他并不是一个完全的面向对象语言,比如我们上面的程序就没有声明任何类相关的代码,仅仅是一个package包声明,一个impor,一个func就可以运行了。我们跑的这个文件是package main
2020-09-06 21:13:17 133
原创 500错误—No serializer found for class***/No converter found for return value of type ***
结论一般都是用于接收或者返回的javabean没有写getter、setter方法,导致无法完成json和javabean的互相转换。错误重现学习开源项目:mall的时候忘了写bean的getter和setter,同时由于自身ip未设置固定ip,访问阿里云上的redis时候导致入口规则与本机ip对不上,程序一直在警告redis连接不成功,没注意转换失败的警告。controller层。@RestController@RequestMapping("/home")@Api(tags = "Home
2020-08-13 21:01:54 529
原创 springboot项目打包成docker镜像
参考mall在Linux环境下的部署(基于Docker容器)首先我们的服务器要有docker私有仓库docker registry搭建下载镜像docker pull registry:2启动容器(随docker自启)docker run -d -p 5000:5000 --name registry2-noauth --restart=always -v /usr/local/docker/registry/auth/:/auth/ -v /usr/local/docker/regist
2020-07-30 20:48:15 358
原创 记录阿里云被挖矿程序入侵
起因今早阿里云提示我ECS服务器上有挖矿程序(c_sh),CPU使用率维持在99%。系统为centos8阿里云告警提示(我手动处理了的告警,初始界面没保留)处理top命令查看到31911端口的c_sh进程占用90%多的CPU使用率先是让阿里云自己处理(杀掉挖矿程序),但是top命令查看这个挖矿程序又换了32366端口启动原本挖矿程序的路径是/proc/31911/root/root/c_sh,杀掉c_sh进程之后再找/proc/31911/root/root/c_sh发现文件不存在。top命
2020-07-30 15:38:49 591
原创 docker启动elasticsearch时内存不足问题
问题docker安装并启动elasticsearch时内存不足系统centos8(阿里云ecs服务器)[root@iZ2zeczvvb79boy368xppwZ ~]# cat /etc/redhat-releaseCentOS Linux release 8.1.1911 (Core)安装过程docker pull elasticsearch:6.4.0修改虚拟机内存(貌似没有效果)sysctl -w vm.max_map_count=262144使用docker run命令跑容器
2020-07-29 10:34:35 1050
原创 设计模式之————代理模式(静态代理/动态代理)
Proxy:为其他对象提供一个代理以控制对这个对象的访问代理模式静态代理动态代理基于JDK实现基于cglib实现静态代理想象一下我们在演《无间道》。阿仁是一个卧底警察(Undercover),他是真正能够搜集情报(getInfo)的人,他的上司黄Sir(Sir)负责直接与阿仁交接情报,他们都是一线警察(FrontlinePolice)。我们的警局老大梁警官(BOSS)想要知道罪犯的情报,但是他不能联系阿仁,只能通过黄Sir拿到情报。同时梁警官想要拿到的情报可以直接作为证据来起诉犯罪集团,整理情报这.
2020-07-27 20:21:15 121
原创 深入理解Java虚拟机笔记(7)-------类加载器
类加载器和这个类本身一起共同确立其在Java虚拟机中的唯一性。即使这两个类来源于同一个Class文件,被同一个Java虚拟机加载,只要加载它们的类加载器不同,那这两个类就必定不相等文章目录启动类加载器(Bootstrap Class Loader)扩展类加载器(Extension Class Loader)应用程序类加载器/系统类加载器(Application Class Loader)双亲委派模型启动类加载器(Bootstrap Class Loader)这个类加载器负责加载存放在<JAV.
2020-07-24 21:10:38 83
原创 深入理解Java虚拟机笔记(6)-------类加载时机与类加载过程
类加载时机类从加载到卸载共有7个阶段,如下图加载、验证、准备、初始化和卸载这五个阶段的开始顺序是确定的,并不意味着完成的阶段也是这个顺序,因为某一个阶段可能会调用其他阶段。其中解析阶段有可能在初始化阶段之后执行。类加载阶段开始的时机会根据虚拟机而不同,但初始化阶段在在下面6中情况中必须立即开始:遇到new、getstatic、putstatic或invokestatic这四条字节码指令时:能够生成这4中指令的场景有:使用new关键字实例化对象;读取或者设置一个静态字段(被final修饰、已在编
2020-07-22 21:40:21 159
原创 深入理解Java虚拟机笔记(5)-------经典垃圾收集器
垃圾收集器Serial收集器ParNew收集器Parallel Scavenge收集器Serial Old收集器Parallel Old收集器CMS收集器G1收集器(Garbage First)1.Region2.TAMS指针3.原始快照(SATB)算法回收过程本文主要介绍CMS和G1首先看看HotSpot的各种垃圾收集器关系图图中互相连线的垃圾收集器之间可以组合使用,被JDK9断开连线的是在JDK9中废弃的组合。垃圾收集器所在那个区域代表这个垃圾收集器是作用于该分代的。老年代:CMS,Seria
2020-07-21 21:31:34 475
原创 深入理解Java虚拟机笔记(4)-------垃圾回收算法
分代收集理论的三条假说弱分代假说:绝大多数对象都是朝生夕灭的(大多数对象(大概98%)第一次垃圾回收时就被回收掉了)强分代假说:熬过越多次垃圾收集过程的对象就越难以消亡(eg:经过几次垃圾回收都没有被回收的对象,下一次回收很可能也不会回收它)跨代引用假说:跨代引用相对于同代引用来说仅占极少数(跨代引用就是新生代和老年代的对象之间有引用关系,有这种跨代引用的对象很少)接下来主要说三种垃圾收集算法: 标记-清除算法,标记-复制算法,标记-整理算法。1. 标记-清除算法:该算法分为标记和清除两.
2020-07-20 21:27:33 97
原创 深入理解Java虚拟机笔记(3)-------垃圾回收判断方法
1. 引用计数器法这是一种简单高效的判断对象是否可用的算法,简单来说就是在对象中添加一个引用计数器,当有引用指向它的时候计数器就+1,当它的一个引用不在指向它的时候计数器就-1;当计数器为0时就说明这个对是不再可用的。虽然这个方法思想很简单,但是要考虑到很多特殊情况的时候就要做很多额外工作才能让这个方法正常工作。最常见的一个问题就是互相引用,而外界不再有引用指向对象的情况。所以Java没有使用这种方法。public static void testGC() {A objA = new A();//A和
2020-07-18 11:23:38 95
原创 深入理解Java虚拟机笔记(2)-------对象创建、内存布局、访问定位
对象的创建:JVM在创建对象时会先检查这个对象的类是否已经被加载、解析、初始化过,如果没有则会进行类的加载,通过类加载检查后正式进行对象创建。进行对象内存分配将分配到的内存空间初始化为零值(对象头除外)设置对象头信息,如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码(实际上对象的哈希码会延后到真正调用Object::hashCode()方法时才计算)、对象的GC分代年龄等信息。这些信息存放在对象的对象头(Object Header)之中。根据虚拟机当前运行状态的不同,如是否启用偏向
2020-07-18 09:26:42 88
原创 深入理解Java虚拟机笔记(1)-------JVM内存模型
运行时数据区程序计数器:如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是本地(Native)方法,这个计数器值则应为空(Undefined)。此内存区域是唯一一个在《Java虚拟机规范》中没有规定任何OutOfMemoryError情况的区域。...
2020-07-15 22:09:18 97
原创 关于初始化指定大小的ArrayList,调用set方法报错下标越界java.lang.IndexOutOfBoundsException:
结论:初始定义的只是ArrayList的容量,而ArrayList的set方法中判断的是实际元素的个数,所以会报错过程:当我们定义一个初始化大小的ArrayList,直接调用set方法会报下标越界异常这是用暴力解法做一道算法题时写的代码 public static List<Integer> countSmaller(int[] nums){ int len = nums.length; List<Integer> counts = .
2020-07-11 21:45:42 2172
原创 CentOS_8系统上安装Docker
安装yum-utilsyum install -y yum-utils device-mapper-persistent-data lvm2添加docker仓库yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo安装dockeryum install docker-ce如果containerd.io的版本过低,需要安装低版本的docker或者安装高版本的cont.
2020-07-09 13:11:28 144
原创 Java多线程⑶-------线程池
为什么要用线程池一般来说,使用Thread手动创建线程有以下几个缺点。1.性能问题:每次一个请求进来都开启一个新线程,方法执行结束再销毁线程,势必要造成线程新建和销毁的资源开销。线程的存在也会占据内存空间,在线程过多的情况下线程间的切换会导致性能大打折扣,甚至过多的线程还会导致OOM问题。2.缺乏一个统一的管理容器。比如控制最大并发数,定时,线程间的分组隔离等。所以为了解决上述问题我们常常使用线程池来管理线程。JDK提供了5种默认线程池。但是内部实现都离不开ThreadPoolExecutor。.
2020-06-13 23:50:02 114
原创 Java多线程⑵-------线程的创建
线程的创建一般有4种形式,即:1.继承Thread类并重写run()方法2.实现Runnable接口并重写run()方法3.实现Callable接口并重写call()方法4.通过线程池创建本文主要回顾前三种创建方法,线程池的使用会单写一篇1.继承Thread类首先我们定义一个继承了Thread类的MyThreadclass MyThread extends Thread { private int value = 5; @Override public void
2020-06-12 01:35:56 113
原创 Java反射机制
Java的反射机制可以在程序运行的过程中获取对象的属性和方法先重温一下Class的概念我们都知道创建类的时候回用到class关键字,但是class也是属于类的一种对象(java.lang.Class)。一般我们可以通过3种方法获取到Class对象1.对象名.getClass() 如 test.getClass()2.Class.forName("包名.类名") 如 Class.forName("com.zh.Test")3.类名.class 如 Test.class在拿到了Class对象之.
2020-06-11 15:03:19 115
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人