通过istio学Service-Mesh
作者 青鸟
最近在读istio的代码,正好借此来水一篇总结,顺便通过istio来学一点关于Service Mesh的相关知识
什么是Service Mesh用官方的话来说Service Mesh(服务网格)是一种用于处理服务之间通信的架构模式。在微服务架构中,应用程序通常被拆分成多个小型的、相互独立的服务,每个服务负责执行特定的功能。这些服务需要相互通信以完成整体业务逻辑。Service Mesh 提供了一种在服务之间进行通信的统一、可靠和可观察的方式。
说简单点Service Mesh就是处理微服务之间的通讯,它的主要实现形式就是在应用程序同主机上部署一个代理程序,所有的进出流量都被这个Side Car代理,于是我们便可以在这个代理程序中以最小的成本实现细粒度化的控制,包括服务的限流、熔断、降级等策略
在这种形式下,RPC 客户端将数据包先发送给,与自身同主机部署的 Sidecar,在 Sidecar 中经过服务发现、负载均衡、服务路由、流量控制之后,再将数据发往指定服务节点的 Sidecar,在服务节点的 Sidecar 中,经过记录访问日志、记录分布式追踪日志、限流之后,再将数据 ...
Kubernetes架构原理
作者 青鸟学习了Docker后,顺带把k8s 也学了,原理就顺带水篇博客,之后可能会尝试使用minikube来试着部署微服务
Kubernetes(k8s)是一个用于容器编排和管理的开源平台,负责自动化运维管理多个容器化程序(比如 Docker)的集群,可以帮助开发人员和运维团队更轻松地部署、扩展和管理容器化应用程序,从而提高了应用程序的可用性和可伸缩性。是一个生态极其丰富的容器编排框架工具。
k8s提供了一种高度抽象化的方式来处理底层基础设施,使开发人员和运维团队能够专注于应用程序的开发和管理,而不必担心底层的复杂性。
一句话来说,k8s的作用是自动化运维管理Docker(容器化)程序
Kubernetes 的强大之处在于其高度可扩展性和灵活性,使得它适用于各种不同的应用程序和用例,从简单的Web应用程序到复杂的微服务架构。它已成为云原生应用程序开发和运维的事实标准,被广泛用于容器化工作负载的管理和编排。
Kubernetes 官方文档:https://kubernetes.io/zh/
k8s的组成以下是 Kubernetes 的一些关键概念和组件:
节点(Nodes): 节点是 ...
使用Docker优雅地部署Goland服务
作者 青鸟
在试过了systemed部署服务之后,尝试了一下docker来部署,相较于systemed的部署,docker更加优雅和方便,但在这个过程中也是遇到了大大小小的问题,也是做了很多优化,特地记录一下,值得注意的是我没有使用docker-compose来部署,而是单纯的容器间通讯,之后会再写一篇来记录。文章较长,有错误的欢迎指出
关于docker环境的安装,按照官方教程即可以轻松解决,同时需要注意Docker Hub被墙了,因此要用镜像源,推荐使用腾讯云的镜像仓库
搭建生产环境这里的生产环境主要指的就是redis和mysql这两个数据库,这里有一个大坑就是当你卸载容器的时候,数据库里的数据会随之销毁,这显然是不符合我们的要求的,解决办法就是配置的时候使用挂载数据卷的方式,将数据库信息挂在到宿主主机上,以此可以在销毁或者重启容器的时候做到数据持久化。
mysql配置我们首先创建三个文件夹
123456#配置文件mkdir /usr/local/mysql/conf#数据存储mkdir /usr/local/mysql/data#mysql日志mkdir /usr/local/my ...
Etcd的简介与静态部署
作者 青鸟
在最近的工作中想用go-micro来实现一个简单的微服务,选择了etcd作为服务与注册中心,于是就在服务器上部署了etcd,并使用systemed来作为进程守护,虽然最后还是选择了Consul来作为注册中心,但是在部署Etcd这个过程中遇到了大大小小的问题,于是写一篇博客记录一下,其中着重介绍一下静态部署
Etcd的简介首先要说明的就是为什么会选etcd来作为服务与注册中心。etcd 是一个分布式键值对存储,设计用来可靠而快速的保存关键数据并提供访问。通过分布式锁,leader选举和写屏障(write barriers)来实现可靠的分布式协作。etcd集群是为高可用,持久性数据存储和检索而准备。从上述的定义中就可以看出Etcd的核心作用就是两个方面:持久化的键值存储系统 和 分布式系统数据一致性服务提供者。
所有的分布式系统,都面临的一个问题是多个节点之间的数据共享问题,这个和团队协作的道理是一样的,成员可以分头干活,但总是需要共享一些必须的信息,比如谁是 leader, 都有哪些成员,依赖任务之间的顺序协调等。所以分布式系统要么自己实现一个可靠的共享存储来同步信息(比如 ...
JVM中的自动内存管理结构
作者 青鸟
JVM线程在Hotspot JVM中,每个线程与操作系统中的线程直接映射。当一个Java线程准备好执行后,此时操作系统的一个本地线程也同时创建。Java线程执行终止后,本地线程也会回收。操作系统负责将所有线程安排调度到一个可用的CPU上。一旦本地线程初始化成功,它就会调用Java线程的run方法。JVM中的线程分为守护线程和普通线程,当程序中最后一个非守护线程终止后,JVM也会进行终止JVM的系统线程主要分为几种,其中GC线程、虚拟机线程、周期任务线程、编译线程、信号调度线程
Java虚拟机(JVM)线程是操作系统线程的一种抽象,用于支持Java程序的并发执行。JVM线程是Java多线程编程的基础,它允许Java应用程序在同一进程内同时执行多个独立的任务,实现并发和多线程处理。
以下是关于JVM线程的一些关键信息:
线程模型:JVM线程模型通常是基于内核线程(Kernel Thread)的。每个JVM线程都会映射到一个底层操作系统线程,这使得Java线程可以在多核处理器上并发执行。
线程生命周期:JVM线程具有生命周期,包括新建、就绪、运行、阻塞和终止等状态。线程可以通过 ...
关于向量机的学习
作者 青鸟
最近在学习数图相关的知识,在数图中经常使用的机器学习方法是线性回归和支持向量机(SVM)。由于支持向量回归(SVR)在图像特征融合中使用的比较多,所以着重介绍关于SVR的芝士
什么是支持向量回归对于传统的回归模型直接基于模型输出f(x)与真实输出y之间的差别来调整系数,并且当且仅当f(x)和y完全相同时候,损失才为0.与之不同的是支持向量回归(Support Vector Regression 简称SVR)假设我们能容忍一个一个偏差值z,当前仅当f(x)与y之间的差值大于z才计算损失,这相当于以f(x)为中心,构建了一个宽度为2z的间隔带,若训练样本落入此间隔带,则认为预测正确。
这里需要解释的是为什么需要引入一个软间隔z。假如没有软间隔z,我们基于的假设是训练样本在样本空间或特征空间中是线性可分的,即存在一个超平面能将不同类的样本完全划分开。然而,我们其实很难判断我们找到的超平面是不是由于过拟合而造成的在特征空间中线性可分,因此我们引入软间隔来避免过拟合的这种情况。
支持向量回归的非线性拟合支持向量回归(SVR)可以处理非线性数据的原因在于其能够利用核函数来转换数据,使其 ...
详解HTTPS的安全传输
作者 青鸟
计算机网络中对应用层中的HTTP做了详细解释,而却对于现在广泛使用的HTTPS却一笔带过,因此专门也了一篇博客来做此学习
HTTPS简介HTTPS(Hypertext Transfer Protocol Secure)是一种用于在Web浏览器和Web服务器之间安全传输数据的协议。HTTPS的安全性基于SSL(Secure Sockets Layer)或其继任者TLS(Transport Layer Security)协议。以下是HTTPS中SSL/TLS的工作原理:
握手阶段(Handshake Phase):
客户端向服务器发送一个连接请求,并请求建立安全连接。
服务器会回复一个包含其公钥和数字证书的消息。数字证书通常是由可信的证书颁发机构(CA)签发的,用于验证服务器的身份。
客户端会验证服务器的数字证书。如果数字证书有效且由可信CA签发,客户端会生成一个随机的对称密钥,然后使用服务器的公钥加密这个密钥。
客户端将加密后的密钥发送回服务器,只有服务器可以解密它,因为它拥有相应的私钥。
服务器使用其私钥解密客户端发送的密钥,并将其存储在内存中。
数据传输 ...
列式存储与ClickHouse数据库
作者 青鸟
在字节青训营中专门花了一节课时间来介绍了列式存储,列式存储在大数据分析中具有相对于行存储具有绝对的优势,而ClickHouse则是列式存储数据库对代表
列式存储列式存储(Columnar Storage)是一种数据存储和管理方法,与传统的行式存储(Row-based Storage)相对立。在列式存储中,数据按列而不是按行进行存储和检索。这意味着将同一列的数据一起存储在一起,而不是将整个行的数据存储在一起。以下是列式存储的关键特点和优势:
按列存储:数据按列储存,每个列都有自己的存储区域。这与行式存储不同,行式存储将整个行的数据存储在一起。
高压缩率:由于相似的数据通常会在列中重复出现,列式存储非常适合数据压缩。这可以显著减小存储需求,降低存储成本。
高性能分析:列式存储非常适合用于分析性质的查询,如聚合、过滤和统计。因为查询通常只涉及少数列,所以只需要读取和处理必要的数据列,从而提高了查询性能。
减少I/O操作:由于数据按列存储,查询只需要访问所需的列,而不必读取整行数据。这降低了I/O操作的开销,提高了查询速度。
列存储索引:列式存储通常使 ...
在Go语言中优雅的使用消息队列
作者 青鸟
最近在项目中接触了消息队列,写一篇记录一下Go语言下的使用消息队列,调用的是这个库asynq(”github.com/hibiken/asynq”)这个的文档真的是读过这么多以来最清楚的一个了,很值得去拜读一下。这篇博客是对asynq的Wiki做了一个简单的翻译。
什么是消息队列消息队列(Message Queue)是一种在分布式系统中用于在不同组件或服务之间传递消息的通信模式。它是一种异步通信方式,用于解耦不同部分的系统,使它们能够以解耦和的方式协同工作,而无需直接相互通信。
在消息队列中,消息的发送者将消息放入队列中,而消息的接收者从队列中获取消息并进行处理。这使得发送者和接收者之间可以彼此独立地操作,无需即时相互通信。消息队列具有以下一些优点和特点:
解耦性: 消息队列允许系统的不同部分能够独立演化,而不会直接影响其他部分。这使得系统更加灵活和可维护。
异步通信: 发送者和接收者之间的通信是异步的,即发送者不需要等待接收者处理消息。这有助于提高系统的性能和响应性能。
缓冲能力: 消息队列可以作为一个缓冲区,帮助平衡发送者和接收者之间的处理速度 ...
使用tmux和systemed守护进程
作者 青鸟
会话与进程命令行的典型使用方式是,打开一个终端窗口,在里面输入命令。用户与计算机的这种临时的交互,称为一次”会话”(session) 。
会话的一个重要特点是,窗口与其中启动的进程是连在一起的。打开窗口,会话开始;关闭窗口,会话结束,会话内部的进程也会随之终止,不管有没有运行完。
这就带来一个问题,当我们运行后端程序时,我们的程序进程是和我们的会话绑定的。当我们退出命令行的时候,程序进程就难以管理,这就不符合我们对于后端程序进程的管理需求。于是就有了进程守护这一概念。
Tmux什么是Tmuxtmux是一个优秀的终端复用软件,类似GNU Screen,但来自于OpenBSD,采用BSD授权。使用它最直观的好处就是,通过一个终端登录远程主机并运行tmux后,在其中可以开启多个控制台而无需再“浪费”多余的终端来连接这台远程主机。
tmux可以将会话与窗口”解绑”:窗口关闭时,会话并不终止,而是继续运行,等到以后需要的时候,再让会话”绑定”其他窗口。
于是乎,tmux就可以起到守护进程的作用。
tmux守护进程新建会话第一个启动的 Tmux 窗口,编号是0,第二个窗口的编号是1,以 ...