当前位置: 首页 > wzjs >正文

网站编辑器是怎么做的宁波正规优化seo软件

网站编辑器是怎么做的,宁波正规优化seo软件,网页微博草稿箱在哪里查看,网站做跳转付款基于GIN的简易代理网关 背景目标开工依赖主体代码配置文件 后记 背景 正好最近对GO也有点兴趣,搞个小项目练练手。 目标 网关需要能够根据路由自动映射到服务支持轮询、加权轮询、随机轮询三种算法简单好理解好使用,最好一个配置文件就能跑起来网关本…

基于GIN的简易代理网关

  • 背景
  • 目标
  • 开工
    • 依赖
    • 主体代码
    • 配置文件
  • 后记

背景

正好最近对GO也有点兴趣,搞个小项目练练手。

目标

  1. 网关需要能够根据路由自动映射到服务
  2. 支持轮询、加权轮询、随机轮询三种算法
  3. 简单好理解好使用,最好一个配置文件就能跑起来
  4. 网关本身需要能够健康检查
  5. 能够劫持请求修改请求头

开工

依赖

module test-gingo 1.22.0require (github.com/bytedance/sonic v1.9.1 // indirectgithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirectgithub.com/gabriel-vasile/mimetype v1.4.2 // indirectgithub.com/gin-contrib/sse v0.1.0 // indirectgithub.com/gin-gonic/gin v1.9.1 // indirectgithub.com/go-playground/locales v0.14.1 // indirectgithub.com/go-playground/universal-translator v0.18.1 // indirectgithub.com/go-playground/validator/v10 v10.14.0 // indirectgithub.com/goccy/go-json v0.10.2 // indirectgithub.com/json-iterator/go v1.1.12 // indirectgithub.com/klauspost/cpuid/v2 v2.2.4 // indirectgithub.com/leodido/go-urn v1.2.4 // indirectgithub.com/mattn/go-isatty v0.0.19 // indirectgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirectgithub.com/modern-go/reflect2 v1.0.2 // indirectgithub.com/pelletier/go-toml/v2 v2.0.8 // indirectgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirectgithub.com/ugorji/go/codec v1.2.11 // indirectgolang.org/x/arch v0.3.0 // indirectgolang.org/x/crypto v0.9.0 // indirectgolang.org/x/net v0.10.0 // indirectgolang.org/x/sys v0.8.0 // indirectgolang.org/x/text v0.9.0 // indirectgoogle.golang.org/protobuf v1.30.0 // indirectgopkg.in/yaml.v3 v3.0.1 // indirect
)

主体代码

package mainimport ("encoding/json""log""math/rand""net/http""net/http/httputil""net/url""os""sync/atomic""time""github.com/gin-gonic/gin"
)type Target struct {URL    string `json:"url"`Weight int    `json:"weight"`
}type RouteConfig struct {Path     string   `json:"path"`Targets  []Target `json:"targets"`Strategy string   `json:"strategy"`
}type Config struct {Routes []RouteConfig `json:"routes"`
}// 更新Balancer结构体
type Balancer struct {targets     []*url.URLweights     []inttotalWeight intstrategy    stringcounter     uint64rnd         *rand.RandweightIndex intweightAccum int
}// 更新NewBalancer函数
func NewBalancer(route RouteConfig, rnd *rand.Rand) (*Balancer, error) {var urls []*url.URLvar weights []inttotalWeight := 0for _, t := range route.Targets {u, err := url.Parse(t.URL)if err != nil {return nil, err}urls = append(urls, u)weights = append(weights, t.Weight)totalWeight += t.Weight}return &Balancer{targets:     urls,weights:     weights,totalWeight: totalWeight,strategy:    route.Strategy,rnd:         rnd,}, nil
}// 修改Next方法中的随机选择逻辑
func (b *Balancer) Next() *url.URL {switch b.strategy {case "random":return b.targets[b.rnd.Intn(len(b.targets))]case "weighted-round-robin":for {b.weightIndex = (b.weightIndex + 1) % len(b.targets)if b.weightIndex == 0 {b.weightAccum -= b.totalWeightif b.weightAccum < 0 {b.weightAccum = 0}}if b.weights[b.weightIndex] > b.weightAccum {b.weightAccum += 1return b.targets[b.weightIndex]}}default: // 普通round-robinidx := atomic.AddUint64(&b.counter, 1) % uint64(len(b.targets))return b.targets[idx]}
}func main() {rnd := rand.New(rand.NewSource(time.Now().UnixNano()))// 读取配置文件configFile, err := os.ReadFile("config.json")if err != nil {panic("无法读取配置文件: " + err.Error())}var config Configif err := json.Unmarshal(configFile, &config); err != nil {panic("解析配置文件失败: " + err.Error())}r := gin.Default()// 添加请求日志中间件r.Use(func(c *gin.Context) {start := time.Now()c.Next()log.Printf("[%s] %s %s %d %s",c.Request.Method,c.Request.URL.Path,c.ClientIP(),c.Writer.Status(),time.Since(start),)})// 为每个路由配置创建反向代理for _, route := range config.Routes {balancer, err := NewBalancer(route, rnd) // 传入随机数生成器if err != nil {panic("创建负载均衡器失败: " + err.Error())}r.Any(route.Path+"/*any", func(c *gin.Context) {target := balancer.Next()proxy := httputil.NewSingleHostReverseProxy(target)// 修改请求头originalDirector := proxy.Directorproxy.Director = func(req *http.Request) {originalDirector(req)req.Header.Set("X-Forwarded-For", c.ClientIP())req.Header.Set("X-Proxy", "gin-reverse-proxy")req.Header.Set("X-Request-Id", time.Now().Format("20060102150405"))}// 转发请求proxy.ServeHTTP(c.Writer, c.Request)})}// 健康检查端点r.GET("/health", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"status": "ok"})})// 启动服务r.Run(":8080")
}

配置文件

{"routes": [{"path": "/api/users","targets": [{"url": "http://user-service-1:10031","weight": 3},{"url": "http://user-service-2:10031","weight": 2},{"url": "http://user-service-3:10031","weight": 1}],"strategy": "weighted-round-robin"},{"path": "/api/products","targets": [{"url": "http://product-service-1:21010","weight": 3},{"url": "http://product-service-2:21010","weight": 2}],"strategy": "random"}]
}

后记

GO语言起手是真的快,唯一不安全的地方在于GO完全由阿美莉卡控制,如果未来脱钩越来越狠,那GO语言作为生产要素的可持续获得性有点让人怀疑

http://www.dtcms.com/wzjs/520194.html

相关文章:

  • 武汉营销型网站重庆网站设计
  • 新乡新手学做网站上海企业优化
  • 上海的加盟网站建设长尾关键词有哪些
  • html5网站模板下载网络营销软件下载
  • 阿里云的wordpress如何设置广州优化网站排名
  • 湖南企业网站营销电话百度推广时间段在哪里设置
  • 怎么做网站教程视频seo学堂
  • 学前心理学课程建设网站抖音seo运营模式
  • 深圳专业做网站的公司seo推广和百度推广的区别
  • 一流校建设网站做灰色词seo靠谱
  • 网站开发 招标采购参数深圳seo优化公司哪家好
  • 企业网站展示抖音怎么运营和引流
  • 专业的咨询行业网站制作百度客服电话4001056
  • dede网站url采集杭州网站免费制作
  • 保定市住房保障和城乡建设局网站树枝seo
  • 免费帮助建站免费b站动漫推广网站2023
  • 如何制作自己的个人网站seo排名赚app靠谱吗
  • 网站怎样做的高大上上海专业的seo推广咨询电话
  • 威海 网站开发外贸网站推广seo
  • 公司里面php开发一个网站的流程武汉搜索引擎排名优化
  • 合肥网站设计培训html网页制作模板代码
  • 海南在线人才在线清远网站seo
  • 中国网站设计师联盟深圳谷歌seo推广
  • 淘宝导购网站源码今日头条热点新闻
  • 如何做网站数据报表谷歌seo关键词排名优化
  • 织梦网站install简单网页制作模板
  • 事业单位网站登录模板网络广告的概念
  • 平凉市建设局门户网站软文有哪几种类型
  • 12380网站建设情况如何发布自己的html网站
  • 域名注册了怎么才能用网站推广seo招聘