nginx consul consul-template 服务发现自动配置

介绍

在微服务的环境下网关是比较重要的节点,所有服务通过网关去统一调用。在.net环境下ocelot是比较常用的微服务网关方案,简单将ocelot引入webapi项目后添加配置文件即可比较方便的做出熔断、限流等逻辑管控。
本文介绍一种通过consul-template获取consul中服务信息,然后自动生成nginx的配置文件的方案。通过生成的这个新的配置文件即可完成反向代理的配置,从而打通前后端的链路。

整体思路

  • 通过consul-template获取需要代理的微服务的配置
  • nginx中加载生成的配置文件

consul-template

下载地址 https://releases.hashicorp.com/consul-template

配置

添加配置文件【nginx.ctmpl】

upstream system {
    {{range service "SystemWebAPI" }}
    server {{ .Address }}:{{ .Port }};
    {{ end }}
}

upstream basic {
    {{range service "BasicDataWebAPI" }}
    server {{ .Address }}:{{ .Port }};
    {{ end }}
}


server {
        listen       8105;
        location /api/System {
            proxy_pass   http://system ;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection keep-alive;
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_cache_bypass $http_upgrade;

        }
		
		location /api/Basic {
            proxy_pass   http://basic ;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection keep-alive;
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_cache_bypass $http_upgrade;

        }

  }
  • 配置了两个代理服务,分别是SystemWebAPI、BasicDataWebAPI。
  • 配置了一个nginx的站点并绑定在8105端口上
  • 配置了两个后端服务的代理接口,分别绑定最上方的两个代理服务从而实现根据不同路由导航到不同后端接口

这些配置需要对nginx有基本的了解,consul-template只是生成nginx的配置文件。

生成配置文件

consul-template --consul-addr 192.168.2.211:7500 --template "./nginx.ctmpl:./vhost.conf:nginx -s reload" --log-level=info

通过consul-template程序执行刚才的配置模板,参数介绍如下

  • --consul-addr 连接的consul服务地址
  • --template 模板文件地址及生成后执行的命令 - 生成的配置文件名称为vhost.conf- 生成完成后自动执行的nginx的reload指令

nginx配置

在nginx的配置文件中的http节点下引入生成的配置文件

http {
	include D:/test/consul-template_0.41.0_windows_amd64/*.conf;
}

备注

通过此方案完成了后端服务的统一转发,在此基础上如果需要做统一的鉴权,例如验证平台授权是否到期等与业务无关的逻辑时可以添加一个独立的授权检验接口,然后通过nginx配置鉴权(参考nginx配置统一鉴权)。这个授权的接口只检验是否在许可证的有效期内,如果需要对特殊接口放行也可以在此接口内添加相关的逻辑。

[参考]
负载均衡之nginx+consul(自动更新路由)

posted @ 2025-06-24 11:37  Hey,Coder!  阅读(44)  评论(0)    收藏  举报