- 博客(297)
- 收藏
- 关注
原创 cmake
cmake是一个可以在linux,windows,macos中使用。构建工具:cmake不直接参与编译,而是生成平台相应的构建工具。比如:linux下的makefile,windows下的.sln(解决方案),.proj(工程文件)。
2025-02-09 22:38:29
694
原创 C++简单实现消息队列
消息队列是一种应用间的通讯方式,消息发送后可以立即放回,由消息系统来确保消息的可靠传递。消息发布者只需要将消息发布到消息队列中,而不需要管谁来取。消息使用者只管从消息队列中取消息而不管谁发布的。这样发布者和使用者都不同知道对方的存在。消息队列普遍使用在生产者和消费者模型中。下面使用C++实现一个简单的消息队列。
2024-07-28 20:27:23
1146
原创 nginx基本原理
当nginx启动之后,会有一个master进程和多个worker进程。默认是一个worker进程。master进程的作用:接收来自外界信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程在异常情况下退出后,会自动重新启动新的worker进程。worker进程作用:处理基本的网络事件。多个worker进程之间时对等的,他们同等,各进程互相之间是独立的。一个请求只可能在一个worker进程中处理,不可能处理其它进程的请求。
2024-07-20 17:41:49
1093
原创 nginx动静分离配置实例
ngnix动静分离简单来说就是把。不能理解成只是单纯的把动态页面和静态页面物理分离。可以理解成使用nginx处理静态页面,使用tomcat处理动态页面。实现是:通过location指定不同的后缀名实现不同的请求转发。通过expires参数设置,可以使浏览器缓存过期时间,减少与服务器之间的请求和流量。
2024-07-18 14:52:01
909
原创 nginx负载均衡实例
浏览器输入地址http://nginx服务器ip(:80)/edu/a.html,实现负债均衡效果,平均分配到 服务器ip:8080和 服务器ip:8081进程中。
2024-07-16 17:11:41
505
原创 nginx反向代理实例
在tomcat8080目录的解压后的tomcat的webapp目录下建立edu文件夹,在edu目录下建立html文件。在tomcat8081目录的解压后的tomcat的webapp目录下建立vod文件夹,在vod目录下建立html文件。解压后,进入解压后的bin目录下,执行startup.sh脚本,运行tomcat,默认启动端口8080。实际访问的ip和port是反向代理服务器的,但是得到的是运行在服务器的tomcat的资源。访问http://ip:9001/edu/ 直接跳转到,ip:8080进程。
2024-07-16 14:46:36
1248
原创 nginx基本概念和安装
主要作用是基于ngnix服务器接收到的请求字符串(例如:server_name/uri-string),对虚拟主机的名称(也可以是ip别名)之外的字符串(例如:前面的/url-string)进行匹配,对待定的请求进行处理,地址定向,数据缓存和应答控制的功能,还有许多第三方模块的配置也在这里进行。在早期的单一系统使用的架构为客户端发送多个请求给服务器,服务器处理请求,有一些可能要与数据库进行交互,服务器处理完毕后,再将处理结果返回给客户端,这种架构适用于并发量比较少的情况。
2024-07-12 10:36:59
1105
原创 go——Swagger使用
Swagger是一个用于设计,构建和文档化API的开源框架。在Go语言中,Swagger可以帮助后端开发人员快速创建和定义RESTful API,并提供,这些文档包含了API的详细信息以及如何使用他们的说明。RESTful是一个网络应用程序的设计风格,基于HTTP协议。使用XML或JSON格式定义统一标准接口。强调资源,统一接口,URL和无状态的设计风格。不是标准也不是协议,只是一种风格。
2024-07-04 20:53:07
2948
原创 gin参数验证
使用go-playground/validator包。validator包是Golang中一个非常受欢迎的数据验证工具,它提供了丰富的验证规则和简单易用的API。使用validator包可以轻松的定义和执行各种验证规则,如必填字段,最大长度,最小值等。同时validator包还支持自定义验证规则,可根据具体业务需求进行扩展。除了支持内置的验证规则,validator包还支持自定义验证规则。我们可以通过实现validator.Func类型的函数来定义自己的验证规则。
2024-07-02 15:45:08
2095
原创 gin会话控制
session就是用来在服务端存储相关数据的,以便在同一个用户多次请求之间保存用户的状态,比如登录状态。因为HTTP协议是无状态的,不记录用户的信息,使用cookie的缺点不安全,明文发送,而session通过使用标识,也就是所谓的sessionid来解决cookie的不安全的缺点。该sessionid有服务器生成,并存储在客户端的cookie或者url中。当客户端再次发送请求时,会携带该标识,服务端可以通过该标识查找到存在服务器上的相关数据。
2024-06-30 20:22:12
987
原创 gin中间件
HandlerFunc是一个函数类型,接收一个Context参数,函数由于编写中间件的处理逻辑。type HandlerFunc func(*Context)其实就是代表一个中间件。
2024-06-28 10:06:46
1076
原创 gin数据解析,绑定和渲染
html文件:代码: 演示:html文件:代码:三. URI数据解析和绑定gin.Context中的ShouldBindUri方法将uri中的数据,自动按照uri格式解析到结构体。演示:
2024-06-26 15:53:26
596
原创 golang——Gin框架及路由介绍
gin框架中采用的路由库是基于httprouter做的支持Restful风格的API,意思是"表面层状态转化",是一个互联网应用程序的API设计理念:URL定位资源。可以创建路由组,为了管理相同的URL。import ("net/http"//将应用切换到“发布模式”以提升性能//创建路由//默认使用了两个中间件Logger(),Recovery()})})//路由组1})})//路由组2})})//监听端口,默认绑定端口8080。
2024-06-26 09:35:01
4939
原创 Golang——gRPC gateway网关
etcd3 API全面升级为gRPC后,同时要提供REST API服务,维护两个版本的服务显然不大合理,所以gRPC-gateway诞生了。通过protobuf的自定义option实现了一个网关。服务端同时开启gRPC和HTTP服务,HTTP服务接收客户端请求后转换为grpc请求数据,获取响应后转为json数据放回给客户端。安装gRPC-gateway:gogetu githubcomgrpcecosystemgrpcgatewayprotocgengrpcgateway。
2024-06-15 17:57:49
1947
3
原创 Golang——gRPC内置Trace
gRPC内置了客户端和服务端的请求追踪,基于golang.org/x/net/trace包实现,默认是开启状态,可以查看事件和请求日志,对于基本的请求状态查看调试也是很有帮助的,客户端与服务端基本一致,这里以服务端开启trace server为例,代码如下。
2024-06-13 10:00:00
352
原创 Go语言结构体内嵌接口
不依赖具体实现:即接口为A,结构体B1、B2实现了接口A,结构体C内嵌了A,那么C.A可以通过B1/B2实例化;对接口类型进行重写:当C.A通过B1实例化后,C和B1的关系,可以转变为结构体C内嵌结构体B1,那么C可以直接使用B1中的所有方法,当然C也可以对B1中的方法进行重写,这里官方文档这样解释“Interface and we can override a specific method without having to define all the others.”
2024-06-11 21:17:39
774
原创 Golang——gRPC认证和拦截器
TLS(Transport Layer Security,安全传输层),TLS是建立在传输层TCP协议之上的协议,服务于应用层,它的前身是SSL(Secure Socket Layer,安全套接字层),它实现了将应用层的报文进行加密后再交由TCP进行传输的功能。Token认证是一种基于Token的身份验证方法,用于在客户端和服务器之间进行身份验证。主要概念Token的含义:Token(令牌)是服务端生成的一串字符串,作为客户端进行请求的一个标识。Token的组成。
2024-06-11 10:59:30
1355
原创 Golang——gRPC与ProtoBuf介绍
微服务架构中,由于每个服务对应的代码库是独立运行的,无法直接调用,彼此之间的通信就是一个大问题。gRPC可以实现微服务,将大的项目拆分为多个小且独立的业务模块,也就是服务,各个服务将使用高效的protobuf协议进行RPC调用,gRPC默认使用protocol buffers,这个是google开源的一套成熟的结构数据序列化机制,当然也可以使用其它数据结构如JSON。可以用proto files创建gRPC服务,用message类型来定义方法参数和返回类型。
2024-06-06 17:32:19
1889
1
原创 Golang——RPC
要实现的一个功能为,接收到客户端发过来需要调用的函数和参数,实现对应函数的调用,将结果返回。我理解的微服务(RPC),将项目中必要的功能注册成一个服务,客户端可以直接调用。另外,net/rpc/jsonrpc库通过json格式编解码,支持跨语言调用。例题:golang实现RPC程序,实现求矩形面积和周长。连接rpc服务,发送请求调用方法。注册服务,监听请求,处理请求。
2024-06-04 15:01:51
1260
1
原创 Redis连接池
连接池中的每一个连接有一个唯一标识,通过标识来获取对一个连接,标识可以是对应表冈功能(比如:如果是游戏中的排行榜,可以是不同的排行榜,也可以是不同玩家,每个玩家对应一个redis)。主要实现的功能为:读取配置,将配置中对应建立redis连接并加入到连接池中,然后从连接池中取出连接使用。有些类是利用RAII思想,构造时获得对象,初始化锁,加锁等,析构时释放对象,释放锁资源,释放锁等。连接池主要实现了将连接加入到连接池中,和从连接池中拿出连接。对应的连接池和读取配置只需要一个对象,可以实现为单例。
2024-05-29 11:36:12
808
原创 Redis面试题
不能有耗时操作,体现在响应性能。比如现在有多个客户端连接一个Redis服务器。当一个客户端发送请求给服务器时,如果响应很慢,第二个客户端发送请求给服务器,必须等上一个请求处理完才被处理。上图中我们发现,Redis服务器内部有5个线程(在其它版本的Redis可能还会有io_xxx线程,主要用来进行命令的解码和编码的),并不是单线程。为什么redis是单线程?这里的单线程指什么?其实Redis服务器主要的工作是处理命令,所以。
2024-05-24 17:20:41
388
原创 Golang——Context
在Go http包的Server中,每一个请求在都有一个对应的goroutine去处理。请求处理函数通常会启动额外的goroutine用来访问后端服务。比如数据库和RPC服务。用来处理一个请求的goroutine通常需要访问一些与请求特定的数据,比如终端用户的身份认证信息,验证相关的token,请求的截止时间。当一个请求被取消或超时时,所有用来处理请求的goroutine都应该迅速退出,然后系统才能释放这些goroutine占用的资源。
2024-05-16 14:12:56
1073
原创 Golang——http包
/ Transport指定执行独立、单次HTTP请求的机制。// 如果Transport为nil,则使用DefaultTransport。// CheckRedirect指定处理重定向的策略。// 如果CheckRedirect不为nil,客户端会在执行重定向之前调用本函数字段。// 参数req和via是将要执行的请求和已经执行的请求(切片,越新的请求越靠后)。// 如果CheckRedirect返回一个错误,本类型的Get方法不会发送请求req,// 而是返回之前得到的最后一个回复和该错误。
2024-05-11 18:01:54
1346
1
原创 Golang——Strconv包
strconv包实现了基本数据类型与其字符串表示的转换,主要有以下常用函数:Atoi(),Itoa(),parse系列函数,format系列函数,append系列函数。
2024-05-09 20:32:53
1412
1
原创 Golang——IO操作
根据提供的文件名创建新的文件,返回一个文件对象,默认权限0666,任何人可读可写,不可执行,如果文件存在,则会截断它(为空文件),如果成功,返回的文件对象可用于I/O;在指定位置(相对于文件起始位置),写入byte类型的数据到文件,它返回写入的字节数和可能遇到的任何错误。文件读取可以用file.Read()和file.ReadAt(),读到文件末尾会返回io.EOF的错误。打开一个名为name的文件,flag是打开方式,只读或只写,不存在创建等,perm文件权限。向文件中写入string类型的信息到文件。
2024-05-08 17:40:05
1074
原创 Go标准库——Flag库和Log库
有以下两种常见的定义命令行flag参数的方法。基本格式如下:flag.Type(flag名,默认值,帮助信息) *Type。name := flag.String("name", "张三", "姓名")age := flag.Int("age", 25, "年龄")married := flag.Bool("married", false, "婚否")delay := flag.Duration("d", 0, "时间间隔")
2024-05-07 10:12:17
1174
原创 Go常用的标准库——fmt,time
fmt包实现了类似C语言printf和scanf的格式化I/O。主要分为向外输出内容和获取输入内容两大部分。
2024-04-29 20:56:46
1411
1
原创 go操作Mysql
使用第三方开源mysql库:githubcomgosqldrivermysqlgithubcomjmoironsqlx(基于mysql驱动的封装)命令行输入:go getgithubcomgosqldrivermysqlcomjmoironsqlxgo get 时的问题:需要保证go环境变量GO111MODULE=on需要生成go mod文件 在src文件夹下创建一个文件(如:sample-app),使用go mod init sample-app。
2024-04-26 14:29:01
1665
原创 Golang特殊init函数
init()函数是一个特殊的函数,存在一下特性以下是<<the way to go>>的解释:变量除了可以在全局声明中初始化,也可以在 init ()函数中初始化。这是一类非常特殊的函数,它不能够被人为调用,而是在每个包完成初始化后自动执行,并且执行优先级比 main 函数高。每个源文件都只能包含一个 init() 函数(此处存在错误)。初始化总是以单线程执行,并且按照包的依赖关系顺序执行。
2024-04-25 15:38:28
331
原创 Golang——GMP原理与调度
我们知道,一切软件都跑在操作系统上,真正用来干活(计算)的是CPU。早期的操作系统每一个程序就是一个进程,直到一个程序运行完,才能进行下一个进程,就是"单进程时代"。一切程序只能串行发生。那么能不能有有个进程来宏观一起来执行多个任务呢?后来操作系统就具有了最早的并发能力:多进程并发,当一个进程阻塞时,切换到另外一个等待执行的进程,这样就能尽量把CPU利用起来,CPU就不浪费了。
2024-04-25 13:15:01
2246
原创 Goroutine池,定时器,select
下面来一个例子:需求随机生成数字,计算一个数字的各个位数之和。例如数字123,结果为1 + 2 + 3 = 6。
2024-04-16 09:44:30
502
原创 Go——Goroutine介绍
在java/c++中我们要实现一个并发编程,我们通常需要自己维护一个线程池,并且需要自己取包装一个有一个任务,同时需要自己去调度线程执行任务并维护上下文切换,这一切通常会耗费程序员大量心智。那么能不能有一种机制,程序员只需要定义很多任务,让系统去帮助我们把这些任务分配到CPU上实现并发执行呢?Go语言中的goroutine就是这样一种机制,goroutine的概念类似于线程,但goroutine是由Go的运行时(runtime)调度和管理的。
2024-04-12 16:37:21
1452
2
原创 Go——网络编程
在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议簇隐藏在Socket后面,对用户来说只需要调用Socket规定的相关函数,让Socket去组织符合指定的协议数据然后进行通信。UDP协议中文名称是用户数据报协议,是OSI参考模型中一种无连接的传输层协议,不需要建立连接就能直接进行数据的发送和接收,数据不可靠的,没有时序的通信,但是UDP协议的实时性比较好(快),通常用于视频直播相关领域。创建套接字,绑定套接字,监听套接字,监听到连接后,获取到监听套接字,然后往监听套接字中收发数据。
2024-04-11 10:21:36
1149
1
原创 Go——面向对象
Go语言提倡面向接口编程。接口在底层实现上包含两部分,即类型(type)和数据(data)。接口是一个或多个方法签名的集合任何类型的方法集中只要拥有该接口对应的全部方法,就表示它实现了该接口,无须在该类型上显示声明实现了那个接口。这称为Structural Typing。所谓对应方法,是指有相同名称,参数列表(不包括参数名)以及返回值。当然,该类型还可以有其它方法。接口只有方法声明,没有实现,没有数据字段(属性)。接口可以匿名嵌入其它接口,或者嵌入到其它结构中。
2024-04-09 14:10:57
1157
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人