通过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. 下载二进制包

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

  2. 配置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"                                         |

3. #### 启动,即可使用

```shell
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");
```

目录
相关文章
|
负载均衡 Java 应用服务中间件
基于 nginx 部署 gateway 集群环境|学习笔记
快速学习基于 nginx 部署 gateway 集群环境
912 0
|
负载均衡 关系型数据库 MySQL
基于 Nginx 实现 Nacos 集群部署|学习笔记
快速学习基于 Nginx 实现 Nacos 集群部署
573 0
基于 Nginx 实现 Nacos 集群部署|学习笔记
|
弹性计算 Kubernetes Cloud Native
K8s 网关选型初判:Nginx 还是 Envoy?
本文将从性能和成本、可靠性、安全性 3 方面,对两大开源实现进行比对,希望对正在做 K8s 网关选型的企业有所借鉴。
K8s 网关选型初判:Nginx 还是 Envoy?
|
4月前
|
应用服务中间件 Nacos 数据库
Nacos 1.2.1 集群搭建(三) Nginx 配置 集群
Nacos 1.2.1 集群搭建(三) Nginx 配置 集群
66 1
|
6月前
|
Prometheus 监控 Cloud Native
Nacos集群监控搭建
Nacos 0.8.0版本完善了监控系统,支持通过暴露metrics数据接入第三方监控系统监控Nacos运行状态。
112 1
|
7月前
|
应用服务中间件 Nacos nginx
nacos 2.3.2模式 standalone 使用nginx 反向代理之后访问nacos控制台静
nacos 2.3.2模式 standalone 使用nginx 反向代理之后访问nacos控制台静
|
7月前
|
负载均衡 Java Nacos
Nacos作为一个服务发现与配置管理工具,它本身不直接依赖于`ribbon-loadbalancer`包
Nacos作为一个服务发现与配置管理工具,它本身不直接依赖于`ribbon-loadbalancer`包【1月更文挑战第18天】【1月更文挑战第89篇】
80 4
|
Kubernetes 关系型数据库 Nacos
Kubernetes(k8s)上搭建nacos集群
Kubernetes(k8s)上搭建nacos集群
3172 0
|
Nacos Docker 容器
基于Docker搭建Nacos高可用集群
基于Docker搭建Nacos高可用集群
899 0
|
运维 Dubbo Cloud Native
APISIX+Dubbo+Nacos 最佳实践
虽然使用 APISIX+Dubbo+Nacos,能够解决这个实践中最主要的两个问题。但是它在使用中仍然还有需要进步的地方。社区中会在后续的计划和展望中继续优化。
468 14
APISIX+Dubbo+Nacos 最佳实践