现状
我们想把自己的 http 服务注册 nacos,然后使用nginx 来实现反向代理。官方提供了一个方案是 通过 java 来订阅nacos 。当服务 ip 出现变化的时候。重新生成一份 nginx 配置文件,把然后 通过nginx -s reload 让nginx 进程重启来加载 新的配置文件。
这种方式在 QPS 较高的情况下会造成服务抖动。如果nginx 代理的服务特别多。那主要一个服务出现变化 nginx 就会重启,一天可能重启很多次。
新的方案
我们要解决这个问题,还是得老老实实对nginx 做修改,新开发一个nacos 模块来订阅后端服务。模块已经开发完成,推荐一下.。GitHub - zhwaaaaaa/nginx-nacos-upstream: nginx dynamic upstream module for nacos. subcribe nacos and update address automaticly without reloading config
使用步骤
- 首先得把这个带 nacos 模块的 nginx 下载下来然后编译。
git clone https://github.com/zhwaaaaaa/nginx-nacos-upstream.git
cd nginx-nacos-upstream
./configure --add-module=modules/auxiliary --add-module=modules/nacos && make
2. 启动一个nacos(略,参考nacos 官方文档)。
3. 准备一个 http服务来测试一下。使用 spring+nacos 最方便。一共只有几行代码。https://github.com/zhwaaaaaa/springmvc-nacos-registry。返回自己当前使用的端口
@SpringBootApplication
@EnableDiscoveryClient
public class RegistryDemoApplication {
public static void main(String[] args) {
SpringApplication.run(RegistryDemoApplication.class, args);
}
@RestController
public static class RegistryController {
@Value("${server.port}")
private int port;
@GetMapping("/hello")
public String helloWorld() {
return "Current server is running on " + port;
}
}
}
配置文件指定 nacos 服务地址
server:
port: 8080
spring:
application:
name: springmvc-nacos-demo
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
4. 使用带 nacos 模块的 nginx 来代理这个服务。准备配置文件
nacos {
server_list localhost:8848; # nacos 服务器列表,空格隔开
udp_port 19999; #udp 端口号
udp_ip 127.0.0.1; #udp ip 地址。
udp_bind 0.0.0.0:19999; # 绑定udp 地址
error_log logs/nacos.log info;
default_group DEFAULT_GROUP; # 默认的nacos group name
cache_dir cmake-build-debug/nacos/;
}
http {
upstream s {
# 这里得指定 为 spring 的项目名,nacos 使用appname 作为 dataid
use_nacos_address data_id=springmvc-nacos-demo;
}
server {
# ... other config
location ^~ / {
proxy_pass http://s;
}
}
}
启动nginx 。 curl http://127.0.0.1:9999/hello 。
敬请玩吧