Sala de chat de código abierto Goim compilation-bilibili, compatible con millones de usuarios en línea

Sala de chat de código abierto Goim compilation-bilibili, compatible con millones de usuarios en línea

Introducción al goim

Sitio web oficial: https://goim.io/
goim es creado por Mao Jian, director técnico de bilibili, desarrollado en lenguaje go y utilizado en el marco de servicios de mensajería instantánea (sala de chat) en la línea de producción de la estación B. El diagrama esquemático de el marco es el siguiente:
Inserte la descripción de la imagen aquí
después de una implementación exitosa La demostración de websocket es la siguiente:
Inserte la descripción de la imagen aquí

Entorno básico

entorno de golang

1. Descargue el paquete binario: go1.4.linux-amd64.tar.gz

wget https://dl.google.com/go/go1.14.3.linux-amd64.tar.gz

2. Descomprima el paquete binario descargado en el directorio / usr / local

tar -C /usr/local -xzf go1.14.3.linux-amd64.tar.gz

3. Configurar las variables de entorno de go

$ vim ~/.bash_profile
# 将以下环境变量添加到profile最后面
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
export GOPATH=/home/go              // 存放go源码的目录
$ source ~/.bash_profile // 生效
$ go env // 查看是否成功

Java

1. Descargar: https://www.oracle.com/java/technologies/javase/javase8u211-later-archive-downloads.html

$ mkdir -p /usr/local/java
$ tar -zxvf jdk-8u241-linux-x64.tar.gz -C /usr/local/java/ # 解压

2. Configuración de variables de entorno

$vim ~/.bash_profile

# 加入到末尾
export JAVA_HOME=/usr/local/java/jdk1.8.0_141
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

$ source ~/.bash_profile
$ java -verison

kafka

Consulte para obtener más detalles: http://kafka.apache.org/quickstart

1. Descarga e instala

cd /data
wget https://mirror.bit.edu.cn/apache/kafka/2.5.0/kafka_2.12-2.5.0.tgz
tar -zxvf kafka_2.12-2.5.0.tgz
cd kafka_2.12-2.5.0

2. Inicie ZooKeeper

bin/zookeeper-server-start.sh config/zookeeper.properties

3. Inicie Kafka

bin/kafka-server-start.sh config/server.properties

4. Inicio en segundo plano Después
de que se ejecutan los 2 y 3 anteriores, el terminal sale del servicio y se detiene, agrega & para convertirse en operación en segundo plano, use nohup para redirigir la salida a otro archivo

nohup sh bin/zookeeper-server-start.sh config/zookeeper.properties >>zookeeper.out &
nohup sh bin/kafka-server-start.sh config/server.properties >>kafka.out &

restart_kafka.sh es el siguiente

#!/bin/sh
# 停止
stop(){
    
    
  ./kafka-server-stop.sh
}

# 启动
start(){
    
    
  nohup sh bin/kafka-server-start.sh config/server.properties >>kafka.out &
}

stop
start

5. Prueba, crea un tema

bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic test

6. Ver el tema creado

bin/kafka-topics.sh --list --bootstrap-server localhost:9092

Lo anterior está bien, felicitaciones, ¡la versión independiente de kafka se ha instalado e iniciado correctamente!

Algunas configuraciones requeridas para goim:
1. Crear goim-push-topic (será usado por trabajo)

bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic goim-push-topic

2. Cambie la dirección IP de escucha

vim config/server.properties
# 把下面一行取消注释,并且输入部署kafka机器的IP地址
#listeners=PLAINTEXT://:9092
listeners=PLAINTEXT://10.0.107.218:9092

repetir

1. Inicio de la instalación

yum install redis
systemctl restart redis # 启动redis

2. Cambiar el archivo de configuración

vim /etc/redis.conf
bind 127.0.0.1 -> bind 10.0.107.218
systemctl restart redis # 启动redis

3. Opcional [instalar mac redis visualization tool rdm]
haga clic en conectarse al servidor redis, ingrese host. Luego haga clic en Probar conexión y haga clic en Aceptar cuando se le solicite.

Compilar

Compilar goim

Referencia: https://goim.io/tutorials/

cd $GOPATH/src  // 上面的/home/go,也可以使用echo $GOPATH查看具体路径
mkdir -p github.com/Terry-Mao/
cd github.com/Terry-Mao/
git clone https://github.com/Terry-Mao/goim.git
cd goim

make build

Error:

go: github.com/BurntSushi/[email protected]: Get "https://proxy.golang.org/github.com/%21burnt%21sushi/toml/@v/v0.3.1.mod": dial tcp 34.64.4.113:443: i/o timeout

La biblioteca descargada depende de una biblioteca oficial y el sitio web oficial está bloqueado. Configure un proxy:

// go env里面永久多了一项:GOPROXY="https://goproxy.cn"
go env -w GOPROXY=https://goproxy.cn 
// 重新编译
make build

Después de tener éxito, se genera el directorio de destino, que contiene los siguientes archivos:

[root@localhost goim]# ls target/
comet  comet.toml  job  job.toml  logic  logic.toml

PD: Todos confían en el servicio de descubrimiento en el puerto 7171. Este es un módulo de descubrimiento y registro de servicio similar al zookeeper de bilibili, ver más abajo.

Compilar descubrimiento

Consulte para obtener más detalles: https://github.com/bilibili/discovery

PS1: Go1.12 y superior
PS2: este proyecto de código abierto se refiere al diseño del módulo Netflix Eureka (https://github.com/Netflix/eureka) de descubrimiento de servicios en Spring Cloud.
PS3: En esencia, creo que ZK es difícil de usar, un marco de registro y descubrimiento de servicios complicado y de desarrollo propio.

cd $GOPATH/src
git clone https://github.com/bilibili/discovery.git
cd discovery/cmd/discovery
go build

cp discovery 

3. Compile el servidor websocket de goim, que es un cliente con su propia prueba, usando el framework gin.

cd $GOPATH/src/github.com/Terry-Mao/goim/examples/javascript
go build -o httpd-ws

instalación

1. Agregar directorio de datos

cd /
mkdir -p /data/goim

2. Copie goim (incluidos cometa, lógica, trabajo y 3 archivos de configuración)

cp -r $GOPATH/src/github.com/Terry-Mao/goim/target /data/goim/

3. Copie el servidor de ejemplo de goim-websocket.

cp -rf $GOPATH/src/github.com/Terry-Mao/goim/examples /data/goim/

4. Copiar descubrimiento

cp $GOPATH/src/discovery/cmd/discovery/discovery /data/goim/target/
cp $GOPATH/src/discovery/cmd/discovery/discovery-example.toml /data/goim/target/
cd /data/goim/
ls 

Ahora / data / goim debería verse así

[root@localhost goim]# ls
examples  target
[root@localhost goim]# ls target/
comet  comet.toml  discovery  discovery.toml  job  job.toml  logic  logic.toml
[root@localhost goim]# ls examples/
cert.pem  javascript  private.pem

A continuación se describe brevemente cómo modificar el archivo de configuración y agregar reiniciar.sh y detener.sh, iniciar y detener con un clic.

desplegar

Suponiendo que la IP local es 10.0.107.218, kafka \ redis \ discovery \ goim \ examples se implementan en una máquina.

Nota: ¿Por qué no se recomienda 127.0.0.1? Principalmente por la conveniencia de depurar el código fuente.

1.kafka comprueba la IP y se reinicia

vim /data/kafka_2.12-2.5.0/config/server.properties
listeners=PLAINTEXT://10.0.107.218:9092

2.redis comprobar IP

vim /etc/redis.conf
bind 10.0.107.218

3. Apague el firewall

systemctl stop firewalld # 注意如果重启防火墙会自动打开,可以永久禁用掉systemctl disable firewalld

4.discovery-example.toml (tenga en cuenta que no se puede cambiar a discovery.toml, de lo contrario se producirá un error)

cd /data/goim/target && vim discovery-example.toml
nodes = ["10.0.107.218:7171"]
addr = "10.0.107.218:7171"

5.comet.toml

vim comet.toml
nodes = ["10.0.107.218:7171"] # discovery的地址
certFile = "examples/cert.pem" # wss协议ssl证书
privateFile = "examples/private.pem" # ssl私钥
WhiteLog  = "log/white_list.log" # 统一存放到/data/goim/log目录下

PD: El cliente websocket en el ejemplo es el puerto 3102 de la lógica conectada.

6.job.toml

vim job.toml
: # 输入一个:号,进入替换模式
%s/127.0.0.1/10.0.107.218/g

7.logic.toml

vim logic.toml
: # 输入一个:号,进入替换模式
%s/127.0.0.1/10.0.107.218/g

PD: La API WEB para enviar mensajes usando la prueba del cartero es proporcionada por lógica.

8.Ejemplos

vim /data/goim/examples/javascript/client.js
//var ws = new WebSocket('ws://sh.tony.wiki:3102/sub');
var ws = new WebSocket('ws://10.0.107.218:3102/sub');

9. Cree un directorio de registro

mkdir -p /data/goim/log
mkdir -p /data/goim/log/comet
mkdir -p /data/goim/log/discovery
mkdir -p /data/goim/log/job
mkdir -p /data/goim/log/logic
cd /data/goim/log && vim white_list.log # 创建一个空文件

10.stop.sh

#!/bin/sh

stop(){
    
    
  pkill -f target/logic
  pkill -f target/job
  pkill -f target/comet
  pkill -f target/discovery
}

stop

11.restart.sh

nohup: cuando la terminal sale, el servicio se puede ejecutar
&: ejecutar en segundo plano, pero si solo hay este comando, el proceso terminará después de que la terminal salga.
-> log / discovery.log: escribe la salida capturada por nohub en un archivo
-log.dir = "log / discovery": biblioteca Glog, el directorio donde se genera el archivo de registro. Si no está configurado, no habrá registro
-stderrthreshold = INFO: biblioteca glog, registros de salida a la consola.
Nota: glog se basa en consideraciones de rendimiento, el registro se actualizará cada cierto período de tiempo (¿10 segundos?) (Escribir en el archivo y la consola)

#!/bin/sh
stop(){
    
    
  pkill -f target/logic
  pkill -f target/job
  pkill -f target/comet
  pkill -f target/discovery
}

startDiscovery(){
    
    
  echo 'start discovery'
  nohup target/discovery -conf=target/discovery-example.toml -log.dir="log/discovery" > log/discovery.log &
}

startHttpWsServer(){
    
    
  echo 'start websocket server'
  nohup examples/javascript/httpd-ws > log/httpd-ws.log &
}

startGoim(){
    
    
  echo 'start logic server'
  nohup target/logic -conf=target/logic.toml -region=sh -zone=sh001 -deploy.env=dev -weight=10 -log_dir="log/logic" -stderrthreshold=INFO 2>&1 > log/logic.log &
  sleep 1

  echo 'start comet server'
  nohup target/comet -conf=target/comet.toml -region=sh -zone=sh001 -deploy.env=dev -weight=10 -addrs=10.0.107.218 -debug=true -log_dir="log/comet" -stderrthreshold=INFO 2>&1 > log/comet.log &
  sleep 1

  echo 'start job server'
  nohup target/job -conf=target/job.toml -region=sh -zone=sh001 -deploy.env=dev -log_dir="log/job" -stderrthreshold=INFO 2>&1 > log/job.log &
}

show(){
    
    
  sleep 1
  ps aux|grep target
}

stop
startDiscovery
startHttpWsServer
sleep 2
startGoim
show

correr

1. Asegúrese de que se hayan iniciado kafka y redis. Consulte
2. Inicio anterior para obtener más detalles.

cd /data/goim/ && chmod 777 *.sh
./restart.sh

3. Ver

ps aux|grep target

4. Registro

tail -f log/comet.log       # 看这个
tail -f log/logic.log       # 和这个多一点
tail -f log/discovery.log
tail -f log/job.log

prueba

1. Acceso al navegador: http://10.0.107.218:1999/
Inserte la descripción de la imagen aquí

2. Haga clic en examples / javascript.
Inserte la descripción de la imagen aquí

3. Utilice cartero para enviar un mensaje a la sala de chat.
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/xmcy001122/article/details/106551567
Recomendado
Clasificación