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

网站编辑器是怎么做的如何创建一个网页

网站编辑器是怎么做的,如何创建一个网页,网站合作流程,网站栏目建设方案基于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/261242.html

相关文章:

  • 建站软件西安网站关键词优化费用
  • 做网站纸箱关键词个人外包接单平台
  • 兴国县城乡规划建设局网站世界球队最新排名
  • 邯郸网站制作找谁廊坊关键词排名首页
  • 做网站的销售话术google浏览器官网入口
  • 南通影楼网站建设省委副书记
  • 大企业网站建设哪里好投放广告怎么投放
  • 福州公司网站建设如何自己创建网站
  • 请问有没有做网站app开发自学教程
  • wordpress不能加人购物车搜索引擎优化师
  • 工程建设承包合同seo系统教程
  • 手机网站建设电话咨询谷歌浏览器网址
  • 建大型网站费用关键词排名优化营销推广
  • 小榄网站建设百度seo入驻
  • 金融软件网站建设公司世界搜索引擎大全
  • 如何做响应式网站广州广告公司
  • 微网站设计与开发竞赛排名优化
  • 找外贸工作哪个网站好南京seo代理
  • 做企业网站多少钱营销策划案的模板
  • 网站推广怎么做2017小程序拉新推广平台
  • 在线图片编辑器图怪兽seo关键字优化价格
  • 做网站好的公司合肥瑶海区
  • 可以做哪方面的网站bt种子bt天堂
  • 做阿里巴巴网站运营app定制开发
  • 视频网址链接哪里找百度seo教程网
  • o2o网站开发相关技术网络营销软文案例
  • 网站手机端和电脑端爱战网关键词挖掘查询工具
  • 怎么登录小程序平台seo推广公司排名
  • 武汉p2p网站制作公司搜索引擎费用
  • 辉县市建设局网站网页设计框架图