【使用公网ip向nacos注册服务】

启动的时候获取本机的公网ip去注册到nacos上
思路大概是: 启动的时候加载完配置文件后,设置配置文件中的spring.cloud.nacos.discovery.ip值为本机的公网ip
那么第一个问题来了,我怎么知道自己的公网ip呢?
开发过程中常见的方式就是从请求中取,但是如果是通过nginx代理的服务就得让nginx代理的时候将真实访问ip也代理过去,那我们是否就可以从nginx来获取呢?
于是我在我的nginx上加了这个配置(配置在server中)

nginx.conf


user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;
	
	server {
        listen       80;
        server_name  centos.jiangzt.cn;
        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        location = /getIp{
			return 200 "$remote_addr";
		}
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }
    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

这时候你访问 域名/getIp 就会直接返回访问端的IP地址了

这个公网ip来源解决了,接下来就是把ip更新到配置中去

增加一个listener:

public class AfterConfigListener implements SmartApplicationListener, Ordered {


    @Override
    public boolean supportsEventType(Class<? extends ApplicationEvent> aClass) {
        return(ApplicationEnvironmentPreparedEvent.class.isAssignableFrom(aClass) ||
                ApplicationPreparedEvent.class.isAssignableFrom(aClass) );
    }
    @Override
    public int getOrder() {
        return(ConfigFileApplicationListener.DEFAULT_ORDER + 1);
    }

    @Override
    public void onApplicationEvent(ApplicationEvent applicationEvent) {
        RestTemplate restTemplate=new RestTemplate();
        ResponseEntity<String> response=restTemplate.getForEntity("https://xxxx.xxx/getIp",String.class);
        String currenIp=response.getBody();
        if (applicationEvent instanceof ApplicationEnvironmentPreparedEvent)
        {
            System.setProperty("spring.cloud.nacos.discovery.ip", currenIp);
        }
    }
}

然后在启动类的main方法中注册这个listener:

SpringApplication springApplication = new SpringApplication(xxxxApplication.class);
springApplication.addListeners(new AfterConfigListener());
springApplication.run(args);

这时候你启动这个服务的时候,在服务最后你就能发现输出了一行:

(NacosServiceRegistry.java:65)- nacos registry, DEFAULT_GROUP xxx-xxx-xxx xxx.xxx.xxx.xxx:port register finished

这时候你到nacos控制台上就能发现,ip已经是公网ip了,两个服务之间就不用在同个局域网内了
在这里插入图片描述

参考

  1. https://juejin.cn/post/7111912514744500238
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值