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

目录
相关文章
ffmpeg中--enable-gpl什么意思
ffmpeg中--enable-gpl什么意思
970 0
ffmpeg中--enable-gpl什么意思
|
负载均衡 关系型数据库 MySQL
基于 Nginx 实现 Nacos 集群部署|学习笔记
快速学习基于 Nginx 实现 Nacos 集群部署
779 0
基于 Nginx 实现 Nacos 集群部署|学习笔记
|
缓存 负载均衡 监控
【微服务】一文读懂网关概念+Nginx正反向代理+负载均衡+Spring Cloud Gateway(多栗子)
不知道什么是网关?正向代理?反向代理?负载均衡?负载均衡策略?Nginx和Gateway的区别?假如这些你都不知道,没关系,本文举了大量通俗易懂的例子来阐述了这些概念,保证小白也能看懂,并且最后还提到了gateway的一些配置。
11487 2
【微服务】一文读懂网关概念+Nginx正反向代理+负载均衡+Spring Cloud Gateway(多栗子)
|
存储 SpringCloudAlibaba 前端开发
SpringCloud Alibaba 2021版 nacos 配置中心教程
SpringCloud Alibaba 2021版 nacos 配置中心教程
11837 1
SpringCloud Alibaba 2021版 nacos 配置中心教程
|
Java Maven Spring
SpringBoot配置跨模块扫描问题解决方案
在分布式项目中,使用Maven进行多模块开发时,某些模块(如xxx-common)没有启动类。如何将这些模块中的类注册为Spring管理的Bean对象?本文通过案例分析,介绍了两种解决方案:常规方案是通过`@SpringBootApplication(scanBasePackages)`指定扫描路径;推荐方案是保持各模块包结构一致(如com.xxx),利用SpringBoot默认扫描规则自动识别其他模块中的组件,简化配置。
1804 1
SpringBoot配置跨模块扫描问题解决方案
|
负载均衡 Java Nacos
Nacos有几种负载均衡策略?
Nacos有几种负载均衡策略?
1543 0
Nacos有几种负载均衡策略?
|
对象存储 CDN
阿里云CDN边缘脚本实现+字符转义%2B
对象存储OSS中,文件名包含+字符时,请求URL未转义会导致404错误。解决方法是将URL中的+字符转义为%2B,或通过CDN/DCDN边缘脚本自动转义。示例脚本:若URI包含+,则替换为%2B。
318 10
|
Java Nacos 网络架构
SpringCloud Gateway的使用 + Nacos动态路由
SpringCloud Gateway的使用 + Nacos动态路由
|
负载均衡 网络协议 前端开发
一文快速上手 Nacos 注册中心+配置中心!
一文快速上手 Nacos 注册中心+配置中心!
9478 0

热门文章

最新文章