Go Socket和服务部署|青训营笔记

122 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第5篇笔记。

查询空闲端口

netstat -an|findstr <端口号>可以查看到占用情况,无返回即为没有占用,一般取较大值均空闲。

编写Server和client

使用net.ListenUDP net.ReadFromUDP net.WriteToUDP三个函数完成服务器功能 代码如下

package udpSocket

import (
   "fmt"
   "net"
)

func main() {
   fmt.Println("server opening")
   listen, err := net.ListenUDP("udp", &net.UDPAddr{
      IP:   net.IPv4(0, 0, 0, 0),
      Port: 10000,
   })
   if err != nil {
      fmt.Println("listen error:", err)
      return
   }
   defer listen.Close()
   for {
      fmt.Println("looping")
      var data [1024]byte
      n, addr, err := listen.ReadFromUDP(data[:])
      fmt.Println("listened")
      if err != nil {
         fmt.Println("ReadFromUDP err:", err)
         continue
      }
      fmt.Printf("接受内容是:%v,地址是,%v,长度为%v", string(data[:n]), addr, n)
      _, err = listen.WriteToUDP(data[:n], addr)
      if err != nil {
         fmt.Println("WriteToUDP err:", err)
         continue
      }
   }
}

使用net.DialUDP net.Write net.ReadFromUDP三个函数完成客户端功能

package udpSocket

import (
   "fmt"
   "net"
)

func client() {
   fmt.Println("client opening")
   socket, err := net.DialUDP("udp", nil, &net.UDPAddr{
      IP:   net.IPv4(0, 0, 0, 0),
      Port: 10000,
   })
   if err != nil {
      fmt.Println("listen error:", err)
      return
   }
   fmt.Println("socket!")
   defer socket.Close()
   sendData := []byte("你好,服务器!")
   _, err = socket.Write(sendData)
   data := make([]byte, 4096)
   n, remoteAddr, err := socket.ReadFromUDP(data)
   if err != nil {
      fmt.Println("accept err", err)
      return
   }
   fmt.Printf("接受内容是:%v,地址是,%v,长度为%v", string(data[:n]), remoteAddr, n)

![image.png](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/6e294386b1c5482fa993bd52d91ec859~tplv-k3u1fbpfcp-watermark.image?)
}

运行结果 image.png image.png

可靠UDP(待补充)

将我的服务开放给用户

Host管理

手动更改hosts维护ip和域名的DNS

域名系统

分级结构

  1. 顶级域general Top-level Domainsg gTLD .gov .com .mil .org .edu
  2. 购买获得二级域名

自建DNS服务器

内网域名解析也要出去公网获取,效率低下 外部用户看到内网ip,容易攻击 云厂商权威DNS容易出故障,影响体验 扩大公司品牌技术影响力

DNS过程

本地DNS DNS跟服务器 顶级域服务器 二级服务器

dig工具

DNS类型

  1. A/AAAA IP指向记录
  2. CNAME 别名记录,根据别名继续解析以提取IP
  3. TXT 文本记录,购买证书
  4. MX 邮件交换记录
  5. NS 解析服务器记录,哪台服务器解析
  6. SOA 其实授权机构记录,每个zone有且仅有一条SOA,描述zone属性以及主要权威服务器记录

image.png

权威DNS系统架构

权威DNS系统+LocalDNS 常见开源DNS master-slave模式

接入HTTPS

SSL client random server random premaxster secret使用服务端公钥加密 三个数字计算得到对很密钥session key image.png

全站加速

静态加速 CDN 动态加速 DCDN(最短路由)

四层负载均衡

基于IP+端口,利用算法将报文转发到某个后端服务器,实现负载均衡。 解耦VIP(Virtual IP) RS(Real Server) NAT 扩充地址 防攻击 不暴露端口 synproxy DdOS

常见调度算法

RR轮询
加权RR轮询
最小链接
五元组hash(如果服务器down,需要rehash) 一致性hash,只影响故障服务器的session

FullNAT

CIP CPORT 客户端地址 VIP GW 和外网 (内部设备ip->内网IP) LIP 四层负载均衡的内部地址 RSIP 设备物理IP image.png 相当于内网完全使用内网地址 image.png

四层负载特点

dpdk技术实现,技术成熟 用户态协议栈 无缓存,零拷贝 仅针对四层数据包(TCP)转发,小包可达限速,承受高cps

image.png

nginx

七层反向代理(http/https) master-worker架构 事件驱动 异步非阻塞 支持aio mmap nginx调优 长连接 缓存 proxybuffer 四层 开源LVS keepalived Nginx stream模块

Ngrok 本地服务公网可用