基于Istio ingress对外提供服务
1 简介上一篇是在Service Mesh中两个应用之间互相访问,本片介绍下通过Istio Ingress把服务网络中的应用对外暴露,通过Ingress Gateway控制从外边访问服务网格中的应用。在Service Mesh中部署两个服务,一个httpserver应用,一个Nginx,通过在Ingress Gateway中配置路由控制,使用同一个域名,不同的URI访问两个应用服务。如下:
12curl -H "Host: simple.baihl.io" $INGRESS_IP/simple/httpservercurl -H "Host: simple.baihl.io" $INGRESS_IP/simple/nginx
$INGRESS_IP 为 Istio中Ingress Gateway对外的IP地址。
2 创建应用服务1234kubectl create ns simplekubectl create -f simple.yaml -n simplekubectl create -f nginx.yaml -n simplekubect ...
Istio 中的流量劫持机制
1 Istio流量劫持机制在Service Mesh架构中,Istio通过流量劫持机制,让Pod中的应用访问其他服务时都经过Istio代理,实现对流量的控制。基于Istio可以实现请求路由、服务发现和负载均衡、故障处理、故障注入和规则配置等功能。,因为所有Pod中的进出流量都经过Istio的数据面,所以也可以实现日志记录和追踪。如下是Istio的架构图:下边通过一个示例操作,看下Istio是怎么实现流量劫持的,流量被劫持后又是怎么转到目的地的。
2 环境介绍部署两个Pod,分别表示客户端和服务端,通过客户端发起请求,然后看请求整个链路的转发过程。
12345678# 创建一个namespacekubectl create ns sidecar# 注入sidecarkubectl label ns sidecar istio-injection=enabled# 部署nginx podkubectl apply -f nginx.yaml -n sidecar# 部署toolbox podkubectl apply -f toolbox.yaml -n sidecar
nginx.ya ...
MySQL 索引详解
第4讲 深入浅出索引常见索引模型索引的作用:提高数据查询效率下边介绍几种数据结构:
哈希表 存放 键-值 (key - value)对。
哈希思路:把值放在数组里,用一个哈希函数把key换算成一个确定的位置,然后把value放在数组的这个位置
哈希冲突的处理办法:链表
哈希表适用场景:只有等值查询的场景,查询范围会很慢
有序数组按顺序存储。查询用二分法就可以快速查询,时间复杂度是:O(log(N))
有序数组查询效率高,更新效率低
有序数组的适用场景:静态存储引擎。
二叉搜索树每个节点的左儿子小于父节点,父节点又小于右儿子。查询时间复杂度O(log(N)),更新时间复杂度O(log(N))数据库存储大多不适用二叉树,因为树高过高,会适用N叉树
InnoDB中的索引模型:B+Tree(具体介绍看《数据结构与算法笔记》)
InnoDB的索引模型在InnoDB中,表都是根据主键顺序以索引的形式存放的,这种存储方式的表称为索引组织表。又因为前面我们提到的,InnoDB使用了B+树索引模型,所以数据都是存储在B+树中的。每一个索引在InnoDB里面对应一棵B+树。假设,我 ...
Go--进阶篇
00 参考资料笔记资料:
https://www.yuque.com/xguan56/uwu3y5/gzbs7g
精选 Go 学习资料https://1024casts.com/topics/Lqno6VNP9b71ZYQ5rZBMd02KG3zQwx
优秀博客:https://lailin.xyz/post/go-training-01.html
实战代码:https://github.com/marmotedu/iam
01 并发编程13 GO语言实践-Runtime13.1 Goroutine原理13.2 内存管理13.2.1 逃逸分析通过检查变量的作用域是否超出了它所在的栈来决定是否将它分配在堆上
其中“变量的作用域超出了它所在的栈”这种行为即被称为逃逸。逃逸分析在大多数语言里属于静态分析:在编译期由静态代码分析来决定一个值是否能被分配在栈帧上,还是需要“逃逸”到堆上。
减少 GC 压力,栈上的变量,随着函数退出后系统直接回收,不需要标记后再清除
减少内存碎片的产生
减轻分配堆内存的开销,提高程序的运行速度
编译的语句如下:
1go build -gcflags ...
负载均衡:高并发网关设计原理与实践
0 参考资料0.1 引用资料123456789101112131415161718192021222324252627282930313233343536373839[1] http://www.linuxvirtualserver.org/[2] https://github.com/alibaba/LVS[3] http://kb.linuxvirtualserver.org/wiki/IPVS_FULLNAT_and_SYNPROXY[4] https://wearesocial.com/blog/2018/01/global-digital-report-2018?utm_content=buffer98aa2&utm_medium=social&utm_source =twitter.com&utm_campaign=buffer[5] http://www.cac.gov.cn/2018-08/20/c_1123296882.htm[6] https://tools.ietf.org/html/rfc5798[7] https://tools.iet ...
Langchain 详解与实战
0 参考资料0.1 网站
LangChain 中文网:https://www.langchain.asia/
LangChain Github:https://github.com/langchain-ai/langchain
LangChain API文档:https://python.langchain.com/docs/get_started
大语言模型实践:https://wangwei1237.github.io/LLM_in_Action/
0.2 课程
《LangChain 实战课》
0.3 开源项目
AutoGPT:https://github.com/Significant-Gravitas/AutoGPT
AgentBench:https://github.com/THUDM/AgentBench (测试 Agent 性能)
ChatALL:https://github.com/sunner/ChatALL (对多个大模型进行整合输出)
1 LangChain 安装和使用1.1 LangChain 安装123pip install langchain ...
REUSEADDR 和REUSEPORT 对TCP连接的控制
参考资料REUSEADDR 与 REUSEPORT 到底做了什么?
REUSEADDRSO_REUSEADDR 提供了一套复用地址的规则。对于 AF_INET 套接字,这意味着一个套接字可以绑定,除非有一个活动的监听套接字绑定到该地址。 当监听套接字使用特定端口绑定到 INADDR_ANY 时,就不可能为任何本地地址重新绑定到该端口。
对服务端,在创建socket后,对soket设置reuseaddr属性,可以实现同时复用ip+port
1234开启 REUSEADDR,并且调用 listen 使套接字称为监听状态,两个使用相同 port 进行bind,结果如下: server1 :127.0.0.1:30001, bind 成功 server2 :0.0.0.0:30001, bind 成功
如果ip+port完全相同则报错。
当作为服务端重启时,主动断开连接,会进入TIME_WAIT状态,此时启动时会报错,Address already in use,如果开启REUSEADDR,则可以正常快速重启。
REUSEPORT对于TCP套接字而言,这个选项通过每个监听线程使用不 ...
HTTP2 vs HTTP3详解
1 HTTP2 特性概览1.1 头部压缩在HTTP/1中使用头部字段“Content-Encoding”指定Body的编码方式,比如用gzip压缩来节约带宽,但是报文的头部却被无视,没有针对优化手段。有时候,比如GET请求,Body很小,就几十字节,但头部字段却多达上百字节。
在HTTP/2中使用头部压缩手段对头部进行优化,使用的是“HPACK”算法,在客户端和服务器两端建立“字典”,用索引号表示重复的字符串,还釆用哈夫曼编码来压缩整数和字符串,可以达到50%~90%的高压缩率。
“HPACK”算法是专门为压缩HTTP头部定制的算法,与gzip、zlib等压缩算法不同,它是一个“有状态”的算法,需要客户端和服务器各自维护一份“索引表”,也可以说是“字典”(这有点类似brotli),压缩和解压缩就是查表和更新表的操作。为了方便管理和压缩,HTTP/2废除了原有的起始行概念,把起始行里面的请求方法、URI、状态码等统一转换成了头字段的形式,并且给这些“不是头字段的头字段”起了个特别的名字——“伪头字段”(pseudo-header fields)。为了与“真头 ...
部署Nginx搭建HTTPS服务器
1 安装Nginx本次安装的nginx版本为1.15.9,基于CentOS7.7系统默认自带的OpenSSL 1.0.2k-fips
1.1 下载源码12345# 下载[root@baihl baihl]# wget http://nginx.org/download/nginx-1.15.9.tar.gz#解压[root@baihl baihl]# tar -xvf nginx-1.15.9.tar.gz
1.2 编译安装1234567891011#进入解压后的nginx源码目录[root@baihl baihl]# cd nginx-1.15.9/#配置参数,配置参数中增加--with-http_ssl_module,为了支持ssl./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module#编译[root@baihl baihl]# make#安装[root@baihl baihl]# make install
1.3 验证安装完成之后,则可以在刚才指定 ...
LVS 四层负载均衡
OSI七层和TCP/IP四层模型
四层和七层负载均衡的定义四层:所谓四层就是基于IP+端口的负载均衡七层:所谓七层就是基于应用层(URL等)信息的负载均衡
七层负载均衡时,数据包在经过TCP/IP内核协议栈后会进入用户空间,然后根据端口号交给不同的用户程序进行处理,如下图:
四层负载均衡不会进入用户空间,在内核空间处理完就转发出去。
四层和七层负载均衡对比
四层负载均衡
七层负载均衡
在大型站点使用,接入层最前端
中小站点
结合四层+七层使用
只使用七层负载均衡
优缺点
四层比七层可以承载更大的并发量,大型站点使用
七层可以实现更为复杂的负载均衡控制,比如:基于URL、基于Session、动静分离等
七层会占用大量的CPU事件,更耗费性能,所以承载的并发量小
LVS介绍LVS的组成
LVS相关术语
DS Director Server 目标服务器,即负载均衡器
RS Real Server 真实服务器,即后端服务器
VIP 直接面对用户的IP地址,通常为公网IP地址
DIP Director Server IP 主要用于和内部主机通信的I ...