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

目录
相关文章
|
Nacos
Nacos源码构建报错程序包不存在com.alibaba.nacos.consistency.entity
Nacos源码构建报错程序包不存在com.alibaba.nacos.consistency.entity
1100 0
Nacos源码构建报错程序包不存在com.alibaba.nacos.consistency.entity
|
负载均衡 关系型数据库 MySQL
基于 Nginx 实现 Nacos 集群部署|学习笔记
快速学习基于 Nginx 实现 Nacos 集群部署
762 0
基于 Nginx 实现 Nacos 集群部署|学习笔记
|
缓存 负载均衡 监控
【微服务】一文读懂网关概念+Nginx正反向代理+负载均衡+Spring Cloud Gateway(多栗子)
不知道什么是网关?正向代理?反向代理?负载均衡?负载均衡策略?Nginx和Gateway的区别?假如这些你都不知道,没关系,本文举了大量通俗易懂的例子来阐述了这些概念,保证小白也能看懂,并且最后还提到了gateway的一些配置。
10959 2
【微服务】一文读懂网关概念+Nginx正反向代理+负载均衡+Spring Cloud Gateway(多栗子)
|
Java 应用服务中间件 持续交付
SpringBoot采用Java配置类的方式配置Nacos,动态注册微服务IP
本文是采用Java配置类的方式配置微服务的Nacos服务注册,并动态的配置spring.cloud.discovery.ip属性以打到微服务内网穿透注册至Nacos注册中心。
5616 0
SpringBoot采用Java配置类的方式配置Nacos,动态注册微服务IP
|
负载均衡 Java Nacos
Nacos有几种负载均衡策略?
Nacos有几种负载均衡策略?
1507 0
Nacos有几种负载均衡策略?
|
Java Nacos 网络架构
SpringCloud Gateway的使用 + Nacos动态路由
SpringCloud Gateway的使用 + Nacos动态路由
|
负载均衡 应用服务中间件 nginx
基于Nginx和Consul构建自动发现的Docker服务架构——非常之详细
通过使用Nginx和Consul构建自动发现的Docker服务架构,可以显著提高服务的可用性、扩展性和管理效率。Consul实现了服务的自动注册与发现,而Nginx则通过动态配置实现了高效的反向代理与负载均衡。这种架构非常适合需要高可用性和弹性扩展的分布式系统。
179 4
|
NoSQL 关系型数据库 MySQL
AWS Database Migration Service 助力数据库搬迁
AWS Database Migration Service 助力数据库搬迁
|
负载均衡 网络协议 应用服务中间件
HAProxy 与 NGINX:全面比较
【8月更文挑战第21天】
2948 0
HAProxy 与 NGINX:全面比较