分类 编程 中的文章

LastBattle | 服务架构

服务器架构简图如下:

连线说明:

  • 实线:表示客户端登录流程,①②③④⑤表示登录流程,详细解释见下文。
  • 虚线:表示服务器间的连接,虚线箭头指向监听方。

架构说明:

|英文名称|简称|中文名称|功能简介|单个大区需求数量|数量说明 |—— |GameClient|GC|游戏客户端|不解释|n|不超服务器承载上限均可 |LoginSer|LS|游戏登录服务器|用于登录验证的服务器|1|登录入口仅需一个 |GateSer|GS|游戏网关服务器|用于客户端与其场景服和中心服通讯的转接|n|根据客户端连接数量调整 |BalanceSer|BS|游戏负载均衡服务器|用于负载均衡,给客户端分配合理的网关服,其上连接多台GS|n|根据实际需求配置 |SceneSer|SS|游戏场景服务器|用于游戏战斗的服务器|n|根据实际需求配置 |CentralSer|CS|游戏中心服务器|用于玩家数据管理,匹配等核心功能服务器|1|统一管理玩家数据 |LogSer||游戏日志服务器|用于游戏日志收集|1|统一日志收集 |UserRedis||游戏玩家数据缓存服务器|用于缓存玩家数据|1|统一数据缓存 |LogicRedis||游戏逻辑数据缓存服务器|用于缓存游戏数据|1|统一数据缓存 |MySql||游戏数据库|用于持久化游戏及玩家数据|1|统一数据存储 |Remote||游戏远程控制端|用于输入gm命令等远程控制|n|根据实际需求配置

……

阅读全文

Cgo | 使用libevent库实现一个定时器

使用libevent库作为例子

下载 & 编译 & 安装libevent


$ git clone https://github.com.cnpmjs.org/libevent/libevent.git

$ cd libevent && mkdir build && cd build


$ cmake ..

$ make

libevent实现的定时器


// main.cpp

#include "event.h"


struct event ev;

struct timeval tv;

void time_cb(evutil_socket_t fd, short event, void *argc)

{

  printf("timer wakeup\n");

  event_add(&ev, &tv); // reschedule timer

}


int main()
{

  struct event_base *base = event_base_new();

  tv.tv_sec = 2;

  tv.tv_usec = 0;


  evtimer_set(&ev, time_cb, NULL);

  event_base_set(base, &ev);

  event_add(&ev, &tv);

  event_base_dispatch(base);


  event_base_free(base);

}

go调用libevent实现定时器

把编译好的头文件和库文件放到go工程里

……

阅读全文

Golang | builds

概述

通常我们会给每个产品环境设置不同的配置,比如 redis 要在开发环境就连接 localhost:6379,测试环境可能连接某一个主机的 redis。

如果放在 go 里面是否可行?因为 go 是编译二进制包,也没有动态加载这么一说,那怎么实现?

……

阅读全文

Cgo | 简单使用

使用自己的C函数

文件名:testC.go

package main

/*
#include <stdio.h>
#include <stdlib.h>
void c_print(char *str) {
    printf("%s\n", str);
}
*/
import "C" //import C 必须单起一行,并且紧跟在注释行之后
import "unsafe"

func main() {
    s := "Hello Cgo"
    cs := C.CString(s)               //字符串映射
    C.c_print(cs)                    //调用C函数
    defer C.free(unsafe.Pointer(cs)) //释放内存
}

说明:
1、go代码中的C代码,需要用注释包裹,块注释和行注释均可,其次import “C”是必须的,并且和上面的C代码之间不能用空行分割,必须紧密相连

……

阅读全文

Golang | 使用Lumberjack+zap进行日志切割归档

使用Lumberjack+zap进行日志切割归档

为了添加日志切割归档功能,我们将使用第三方库Lumberjack来实现。

安装

执行下面的命令安装Lumberjack

go get -u github.com/natefinch/lumberjack

zap logger中加入Lumberjack

要在zap中加入Lumberjack支持,我们需要修改WriteSyncer代码。我们将按照下面的代码修改getLogWriter()函数:

……

阅读全文

TCP/IP | 大量TIME_WAIT对线上业务的影响

TCP的三次握手和四次挥手

8bdf9b9537f30646bf95dafe476884b2.png

TIME_WAIT概述

TIME_WAIT 状态:

  • TCP 连接中,主动关闭连接的一方出现的状态;(收到 FIN 命令,进入 TIME_WAIT 状态,并返回 ACK 命令)
  • 保持 2 个 MSL
    时间,即,4 分钟 ;(MSL 为 2 分钟)

TCP 连接建立后,「主动关闭连接」的一端,收到对方的 FIN 请求后,发送 ACK 响应,会处于 time_wait 状态;

……

阅读全文

Libevent | 定时器

libevent 实现定时器流程

首先初始化libevent库,并保存返回的指针

struct event_base * base = event_init();  

实际上这一步相当于初始化一个Reactor实例;在初始化libevent后,就可以注册事件了。

初始化事件event,设置回调函数和关注的事件 ,事实上这等价于调用event_set(&ev, -1, 0, timer_cb, NULL);

……

阅读全文

FFmpeg | 画中画和视频多宫格处理

FFmpeg生成画中画

静态画中画

将视频sub.mp4视频文件缩放成宽 480 、高 320 的视频,然后显示在 视频 input.mp4,x坐标为0,y 坐标为0 的位置

ffmpeg -re -i input.mp4 -vf "movie=sub.mp4, scale=480x320[test]; [in][test]overlay [out]" -vcodec libx264 output.flv

显示在画面的右下角,则需要用到 overlay 中x坐标与y坐标的内部变量:

ffmpeg -re -i input.mp4 -vf "movie=sub.mp4, scale=480x320[test]; [in][test]overlay=x=main_w-480:y=main_h-320 [out]" -vcodec libx264 output.flv

根据命令行可以分析出,除了显示在 overlay 画面中,子视频将会定位在主画面的 右边减去子视频的宽度,最下边减去子视频的高度的位置

……

阅读全文