go语言学习 - caddy添加nacos-gateway

news/2025/3/13 13:08:02/文章来源:https://www.cnblogs.com/kevin-Y/p/18769691

添加我们自己的module,找到这个文件 \caddy\modules\caddyhttp\standard\imports.go

package standardimport (// standard Caddy HTTP app modules_ "github.com/caddyserver/caddy/v2/modules/caddyhttp"_ "github.com/caddyserver/caddy/v2/modules/caddyhttp/caddyauth"//other..._ "github.com/caddyserver/caddy/v2/modules/caddyhttp/reverseproxy"//other..//添加我们的package_ "github.com/caddyserver/caddy/v2/modules/caddyhttp/nacosgateway"
)

 

先看看我们的配置,Caddyfile文件部分节点

:2015 {bind localhost 192.168.1.133root * D:\myenv\webvufile_server {index index.html index.htm}handle /gate/* {uri strip_prefix /gate		reverse_proxy {dynamic nacos {				server_addr 192.168.1.109server_port 8848name_space myenvgateway_addr 192.168.1.133gateway_port 2015gateway_service caddy}}}	
}

 

 以下是部分关键代码。程序会在启动时向nacos注册caddy服务。/gate/{service}/htmlurl的请求来时,会向nacos获取{service}的实际地址,将/htmlurl转到该地址上。

package nacosgatewayimport ("fmt""net/http""strconv""strings""sync""github.com/caddyserver/caddy/v2""github.com/caddyserver/caddy/v2/caddyconfig/caddyfile""github.com/caddyserver/caddy/v2/modules/caddyhttp/reverseproxy""github.com/nacos-group/nacos-sdk-go/v2/clients""github.com/nacos-group/nacos-sdk-go/v2/clients/naming_client""github.com/nacos-group/nacos-sdk-go/v2/common/constant""github.com/nacos-group/nacos-sdk-go/v2/model""github.com/nacos-group/nacos-sdk-go/v2/vo"
)func init() {caddy.RegisterModule(NacosUpstreamSource{})
}// NacosUpstreamSource 实现了 UpstreamSource 接口
type NacosUpstreamSource struct {ServerAddr     string `json:"server_addr,omitempty"`ServerPort     uint64 `json:"server_port,omitempty"`	NameSpace      string `json:"namespace,omitempty"`GatewayAddr    string `json:"gateway_addr,omitempty"`GatewayPort    uint64 `json:"gateway_port,omitempty"`GatewayService string `json:"gateway_service,omitempty"`client         naming_client.INamingClientupstreamCache  map[string][]*reverseproxy.Upstream // 新增缓存字段cacheMutex     sync.RWMutex                        // 用于保护缓存的读写锁
}// 初始化 NacosUpstreamSource 时初始化缓存
func NewNacosUpstreamSource() *NacosUpstreamSource {return &NacosUpstreamSource{// 其他字段初始化...upstreamCache: make(map[string][]*reverseproxy.Upstream),}
}// Provision 初始化 Nacos 客户端
func (n *NacosUpstreamSource) Provision(ctx caddy.Context) error {serverConfigs := []constant.ServerConfig{{IpAddr: n.ServerAddr,Port:   n.ServerPort,},}clientConfig := constant.ClientConfig{NamespaceId:         n.NameSpace,TimeoutMs:           5000,NotLoadCacheAtStart: true,LogDir:              "/tmp/nacos/log",CacheDir:            "/tmp/nacos/cache",}var err errorn.client, err = clients.NewNamingClient(vo.NacosClientParam{ClientConfig:  &clientConfig,ServerConfigs: serverConfigs,},)if err != nil {return err}// 注册服务实例success, err0 := n.client.RegisterInstance(vo.RegisterInstanceParam{Ip:          n.GatewayAddr,Port:        n.GatewayPort,ServiceName: n.GatewayService})if err0 != nil {panic(err0)}if !success {return fmt.Errorf("Service registration failed")}return nil
}// GetUpstreams 从 Nacos 获取服务列表
func (n *NacosUpstreamSource) GetUpstreams(r *http.Request) ([]*reverseproxy.Upstream, error) {// 提取 URL 中的服务名serviceName, newPath := extractServiceName(r.URL.Path)// 从 URL 中去掉 /{service} 部分r.URL.Path = newPathif serviceName == "" {// 如果没有提取到,使用默认服务名return nil, fmt.Errorf("No service name found in URL")}// 先从缓存中查找n.cacheMutex.RLock()upstreams, exists := n.upstreamCache[serviceName]n.cacheMutex.RUnlock()if exists {return upstreams, nil}serviceInfo, err := n.client.GetService(vo.GetServiceParam{ServiceName: serviceName,})if err != nil {return nil, err}if len(serviceInfo.Hosts) == 0 {return nil, fmt.Errorf("No instances found for service %s", serviceName)}// 构建 Upstreamupstreams = make([]*reverseproxy.Upstream, 0, len(serviceInfo.Hosts))for _, instance := range serviceInfo.Hosts {upstream := &reverseproxy.Upstream{Dial: fmt.Sprintf("%s:%d", instance.Ip, instance.Port),}upstreams = append(upstreams, upstream)}// 将结果存入缓存n.cacheMutex.Lock()n.upstreamCache[serviceName] = upstreamsn.cacheMutex.Unlock()return upstreams, nil
}// CaddyModule 返回模块信息
func (NacosUpstreamSource) CaddyModule() caddy.ModuleInfo {return caddy.ModuleInfo{ID:  "http.reverse_proxy.upstreams.nacos",New: func() caddy.Module { return NewNacosUpstreamSource() },}
}func (n *NacosUpstreamSource) UnmarshalCaddyfile(d *caddyfile.Dispenser) error {d.Next() // 跳过指令名: nacosfor d.NextBlock(0) {switch d.Val() {case "server_addr":if !d.NextArg() {return d.ArgErr()}n.ServerAddr = d.Val()//其他属性case "gateway_service":if !d.NextArg() {return d.ArgErr()}n.GatewayService = d.Val()default:return d.Errf("unrecognized subdirective %s", d.Val())}}return nil
}var _ caddy.Provisioner = (*NacosUpstreamSource)(nil)
var _ reverseproxy.UpstreamSource = (*NacosUpstreamSource)(nil)

  

后面学习一下seaweedfs的源代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/898122.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列

合集 - LeetCode 题集(10)1.LeetCode题集-1- 两数之和2024-08-312.LeetCode题集-2 - 两数相加2024-09-053.LeetCode题集-3 - 无重复字符的最长子串2024-09-094.4 - 寻找两个有序数组的中位数,图文并茂,六种解法,万字讲解2024-09-165.LeetCode题集-5 - 最长回文子串(一)202…

day27 作业-通配符

今日作业要求 1.通配符和特殊符号篇整理所学通配符、特殊符号的符号表格 有哪些符号、以及作用 符号的具体用法2.正则表达式篇预习正则表达式,记录 正则符号、符号作用参照表今日练习题 1.笔记作业 1.参考老师提供的脑图大纲,做好自己的脑图笔记,包括符号有哪些符号的作用符…

高密度SNP芯片-代加工/激光/芯片/flowcell/河南/郑州/芯晨微纳

SNP芯片(Single Nucleotide Polymorphism Chip)是一种高通量基因分型技术,用于快速检测基因组中单核苷酸多态性(SNP)位点。通过预先设计的探针阵列,SNP芯片能够同时分析数十万至上百万个SNP位点,广泛应用于疾病关联研究、群体遗传学、药物基因组学和精准医学等领域。一、…

在mybatis中的sql别名为rs会报错问题,有没有大佬能解释一下

同事今天早上发现了bug,这段sql在navicat中正常运行,但是项目跑起来就会报错 SELECTs.security_id AS securityId,s.security_name AS securityName,s.ding_talk_id AS userId,rs.year_num AS yearNum,rs.shift_month_day AS shiftMonthDay,sh.id AS shiftId,sh.shift_name A…

网络虚拟存储 Iscsi实现方案

网络虚拟存储,通过Iscsi协议可以实现本地挂载磁盘,扩展本机设备存储。 Iscsi有以下实现方案,简单介绍下: 1.Powershell 脚本 PowerShell 提供了一些 cmdlet,比如 Get-iSCSITarget 和 New-iSCSISession,用于管理 iSCSI 会话。 PowerShell实现有比较完善的文档:简介 - Tra…

17.8K star!完美超越宝塔的产品,像呼吸一样部署应用,这款开源神器绝了!

Dokploy是一个强大的开源平台,旨在简化全栈 Web 应用的开发和部署。通过其直观的界面和丰富的功能,开发者可以在几分钟内构建和部署复杂的应用程序。Dokploy 提供了灵活的架构和多样的功能,适合各种规模的项目。嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质…

为OpenEuler操作系统安装UKUI 桌面环境并设置root用户登录许可

UKUI 2.0是一款基于MATE的轻量级桌面环境,使用GTK和Qt开发,从开始菜单、控制面板、桌面任务栏以及桌面主题图标等不同层面进行了重新设计和实现,内容丰富,界面清爽。在视觉上,UKUI 2.0 遵循中华民族美学核心——观物取象,主色调采用了源自大自然的中国传统颜色,而图标及…

什么是大模型的量化和蒸馏

Quantization (量化) & Knowledge Distillation(蒸馏) Ollama:量化技术 量化是一种将模型中的浮点数参数(如32位浮点数)转换为低精度数值(如8位整数)的技术。通过减少数值的精度,可以显著减少模型的计算复杂度和存储需求。 量化类型: 1.权重量化:仅对模型的权重进行…

NocoBase 本周更新汇总:双因素身份认证(2FA)

本周更新包括:兼容历史按钮配置按钮权限,AI 集成插件等。原文链接:https://www.nocobase.com/cn/blog/weekly-updates-202503013 汇总一周产品更新日志,最新发布可以前往我们的博客查看。 本周我们发布了 NocoBase 1.6.0 版本,带来集群模式部署、安全策略优化和迁移管理等…

网站开发(1)**基础工具**

使用html、css和javascript进行网站前端开发,使用MySQL、java进行后端开发。 项目工程不算太大,使用VSCode进行编辑和管理。 **安装插件** 在VSCode中安装实时服务器插件:安装成功后,只需要对我们正在编写的html文件右键,选择“Open with Live Server”,然后选择指定浏览…

高密度SNP芯片/Flowcell加工工艺路线-芯晨微纳(河南)-专注于河南郑州激光代加工

★★★文章来源 网络、新闻采访、专利等公开信息,仅用于学习 文章由芯晨微纳(河南)光电科技有限公司搜集整理

使用MMSeg1.2.2进行可视化

1. 对image进行预测和mask进行可视化 1.1 使用mmsegmentation/tools/analysis_tools/feature_map_visual.py进行推理: 编写脚本进行可视化推理,需要打开wandb(详情可见MMSeg官方手册),输入格式为python feature_map_visual.py \ (imaeg_path) \ (configs_path) \ (checkpo…