通过Nacos让Nginx拥有服务发现能力

简介:

背景

先来回忆一下, nginx 如何配置多个实例的负载均衡,配置如下:

upstream serverList {
    server 172.17.0.111:9999;
    server 172.17.0.110:9999;
}
 
server {
   location / {
       proxy_pass  http://serverList;
    }
}

当我们的服务实例变化时,要手动修改 nginx.conf 然后 nginx -s reload

在微服务架构下,我们的服务均已经注册到 注册中心 例如(nacos/eureka),注册中心已经维护所有服务实例的 IP:PORT 列表 ,为何不直接通过 nginx 来获取注册中心中的IP:PORT 列表自动配置 upstream 和热更新。
如上思路实现有如下:

  • 使用 nginx-lua-module 模块编写 lua 脚本, 调用注册中心的 Http API 来获取实例列表 配置 upstream,定时 reload 热更新
  • 使用 JAVA/Golang 编写单独的agent,直接使用nacos 对应语言的 SDK ,获取实例列表生成 upstream,并且使用 Naocs SDK 监听服务变化 reload

nacos-nginx-template 使用

nacos-nginx-template 以上的第二种思路实现以Agent的形式让Nginx实现对Nacos的服务发现。

  1. 下载二进制包

点击此处下载:最新稳定版

  1. 配置config.toml

配置文件使用TOML进行配置

nginx_cmd = "/usr/sbin/nginx"
nacos_addr = "172.16.0.100:8848,172.16.0.101:8848,172.16.0.102:8848"
reload_interval = 1000

[discover_config1]
nginx_config = "/etc/nginx/nginx.conf"
nginx_upstream = "upsteam1"
nacos_service_name = "service1"

[discover_config2]
nginx_config = "/etc/nginx/nginx.conf"
nginx_upstream = "upsteam2"
nacos_service_name = "service2"
参数 描述 例子
nginx_cmd nginx命令的全路径 "/usr/sbin/nginx"
nacos_addr nacos的地址 "172.16.0.100:8848,172.16.0.101:8848,172.16.0.102:8848"
reload_interval nginx reload命令执行间隔时间(ms 默认值1000) 1000
nacos_service_name nacos服务名 "com.nacos.service.impl.NacosService"
nginx_config 需要修改nginx配置的路径 "/etc/nginx/nginx.conf"
nginx_upstream nginx中upstream的名字 "nacos-service"
  1. 启动,即可使用

sh bin/startup.sh

核心代码

  • 获取 config.toml 配置的信息,支持多个 upstream ,调用Nacos Api 拉取实例列表
for (DiscoverConfigBO configBO : list) {
    namingService.subscribe(configBO.getServiceName(),
            event -> {
                List<Instance> instances = namingService
                        .getAllInstances(configBO.getServiceName());
                //更新nginx中的upstream
                refreshUpstream(instances, configBO.getUpstream(), configBO.getConfigPath());
            }
    );
}
  • 根据实例列表,拼凑 upstream
    private boolean refreshUpstream(List<Instance> instances, String nginxUpstream, String nginxConfigPath) {
        //获取到upstream 名称
        Pattern pattern = Pattern.compile(UPSTREAM_REG.replace(PLACEHOLDER, nginxUpstream));
        //获取到配置文件内容
        String conf =  FileUtl.readStr(nginxConfigPath);
        //拼接新的upstream
        String newUpstream = UPSTREAM_FOMAT.replace(PLACEHOLDER, nginxUpstream);
        StringBuffer servers = new StringBuffer();
        if (instances.size() > 0) {
            for (Instance instance : instances) {
                //不健康或不可用的跳过
                if (!instance.isHealthy() || !instance.isEnabled()) {
                    continue;
                }
                servers.append(formatSymbol + "    server " + instance.getIp() + ":" + instance.getPort() + ";\n");
            }
        }
        servers.append(formatSymbol);
        newUpstream = newUpstream.replace(PLACEHOLDER_SERVER, servers.toString());
        //替换原有的upstream
        conf = matcher.replaceAll(newUpstream);
        return true;
    }

-Java 调用nginx reload

Runtime.getRuntime().exec("nginx  -s reload");
目录
相关文章
|
3月前
|
Cloud Native Java Nacos
微服务时代的新宠儿!Spring Cloud Nacos实战指南,带你玩转服务发现与配置管理,拥抱云原生潮流!
【8月更文挑战第29天】Spring Cloud Nacos作为微服务架构中的新兴之星,凭借其轻量、高效的特点,迅速成为服务发现、配置管理和治理的首选方案。Nacos(命名和配置服务)由阿里巴巴开源,为云原生应用提供了动态服务发现及配置管理等功能,简化了服务间的调用与依赖管理。本文将指导你通过五个步骤在Spring Boot项目中集成Nacos,实现服务注册、发现及配置动态管理,从而轻松搭建出高效的微服务环境。
243 0
|
3月前
|
应用服务中间件 Nacos 数据库
Nacos 1.2.1 集群搭建(三) Nginx 配置 集群
Nacos 1.2.1 集群搭建(三) Nginx 配置 集群
63 1
|
5月前
|
开发框架 .NET Nacos
使用 Nacos 在 C# (.NET Core) 应用程序中实现高效配置管理和服务发现
使用 Nacos 在 C# (.NET Core) 应用程序中实现高效配置管理和服务发现
453 0
|
6月前
|
应用服务中间件 Nacos nginx
nacos 2.3.2模式 standalone 使用nginx 反向代理之后访问nacos控制台静
nacos 2.3.2模式 standalone 使用nginx 反向代理之后访问nacos控制台静
|
6月前
|
负载均衡 Java Nacos
Nacos作为一个服务发现与配置管理工具,它本身不直接依赖于`ribbon-loadbalancer`包
Nacos作为一个服务发现与配置管理工具,它本身不直接依赖于`ribbon-loadbalancer`包【1月更文挑战第18天】【1月更文挑战第89篇】
75 4
|
6月前
|
Java 数据库连接 Nacos
Nacos作为一个服务发现和配置管理平台
Nacos作为一个服务发现和配置管理平台【1月更文挑战第18天】【1月更文挑战第88篇】
79 4
|
6月前
|
负载均衡 定位技术 Nacos
Nacos 高级玩法:深入探讨分布式配置和服务发现
Nacos 高级玩法:深入探讨分布式配置和服务发现
652 0
|
6月前
|
负载均衡 网络协议 数据管理
深入解析Nacos:服务发现、配置管理与更多特性解析
深入解析Nacos:服务发现、配置管理与更多特性解析
669 0
|
6月前
|
Linux Nacos 数据库
Linux 通过 Docker 部署 Nacos 2.2.3 服务发现与配置中心
Linux 通过 Docker 部署 Nacos 2.2.3 服务发现与配置中心
|
NoSQL API Nacos
Nacos是一个开源的微服务架构下的服务发现和配置管理工具,
Nacos是一个开源的微服务架构下的服务发现和配置管理工具,
148 2