[Nacos] 业务实例如何指定IP注入Nacos

这篇具有很好参考价值的文章主要介绍了[Nacos] 业务实例如何指定IP注入Nacos。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

需求描述

使用 Spring Cloud Alibaba 搭建微服务,业务实例默认使用内网 IP 注册到 Nacos 服务端,这样在跨局域网时会无法请求成功。那如何解决呢?

答:指定外网 IP 注册到 Nacos 上。
[Nacos] 业务实例如何指定IP注入Nacos

下述方法来自网络,版权归原著作人,本人只是搬运工+实践者!

No.1 指定IP注册

在 Nacos 客户端指定IP,启动成功后即可以在 Nacos 服务端上看到对应的IP。

在 bootstrap.yml 配置文件中写入:

spring.cloud.nacos.discovery.ip = xx
spring.cloud.nacos.discovery.port = xxx

或指定网卡注册:

spring.cloud.nacos.discovery.networkInterface = xx

也可以使用spring cloud 的 InetUtils工具,配置项为,具体说明可以自行检索

spring.cloud.inetutils.default-hostname
spring.cloud.inetutils.default-ip-address
spring.cloud.inetutils.ignored-interfaces
spring.cloud.inetutils.preferred-networks
spring.cloud.inetutils.timeout-seconds
spring.cloud.inetutils.use-only-site-local-interfaces

No.2 动态注册IP-配置文件形式

package com.zhongyi.doctor.config;

import cn.hutool.http.Header;
import cn.hutool.http.HttpRequest;
import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
import com.alibaba.cloud.nacos.NacosServiceManager;
import com.alibaba.cloud.nacos.discovery.NacosServiceDiscovery;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;

/**
 * @author SymbolWong
 * @description
 * @date 2023/2/6 16:25
 */
@Configuration
@Slf4j
public class NacosDiscoveryConfig {
    /**
     * nacosConfigServerAaddr yml中配置的nacos配置中心地址
     */
    @Value("${spring.cloud.nacos.config.server-addr}")
    String nacosConfigServerAaddr;
    /**
     * nacosConfignamespace yml中配置的nacos配置中心命名空间
     */
    @Value("${spring.cloud.nacos.config.namespace}")
    String nacosConfignamespace;
    /**
     * getServerInternetIP 通过Nginx获取本机外网IP,需要Nginx配合配置
     * @author IPMan
     * @date 2022/7/10
     *
     * @return java.lang.String 返回本机外网IP
     */
    private String getServerInternetIPByNginx(){
        //通过配置中心地址构造查询IP请求地址
        String url="http://"+nacosConfigServerAaddr.split(":")[0]+"/getIp";
        //调试输出,这里不推荐err的方式输出,这样仅为测试使用,推荐采用日志实现或者不输出
        // System.err.println(url);
        log.warn("Nacos server addr is {}",url);
        //外网IP
        String internetIP="127.0.0.1";
        //这里一步完成了,构造一个RestTemplate对象,通过对指定URL执行GET请求来获取响应实体
        ResponseEntity<String> response =
                new RestTemplate()
                        .getForEntity(url, String.class);
        // //从响应实体对象中获取内容
        internetIP = response.getBody();
        // //调试输出,这里不推荐err的方式输出,这样仅为测试使用,推荐采用日志实现或者不输出
        // System.err.println(internetIP);
        log.warn("Internet ip is {}",url);
        return internetIP;
    }

    /**
     * nacosProperties Nacos 服务发现配置类,代替yml中spring.cloud.nacos.discovery:配置
     * @author IPMan
     * @date 2022/7/10
     *
     * @return com.alibaba.cloud.nacos.NacosDiscoveryProperties
     */
    @Bean
    public NacosDiscoveryProperties nacosProperties() {
        //new一个nacos服务发现配置对象
        NacosDiscoveryProperties properties = new NacosDiscoveryProperties();
        //设置发现注册的IP,即注册中心详情中的IP,这里很关键,默认是Inet4Address.getLocalHost(),即如果包含子网,则获取的是子网IP
        properties.setIp(getServerInternetIP());
        //设置注册中心地址
        properties.setServerAddr(nacosConfigServerAaddr);
        //设置注册中心命名空间
        properties.setNamespace(nacosConfignamespace);
        return properties;
    }

    private String getServerInternetIP() {
        String internetip = "";
        String url = "https://ip.3322.org";
        internetip = HttpRequest.get(url)
                .header(Header.USER_AGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36")
                .execute().body();
        log.warn("Internet ip is {}",internetip);
        return internetip;
    }

    /**
     * nacosServiceDiscovery nacos 服务发现对象,这个对象构造完成后是无法设置配置的
     * @author IPMan
     * @date 2022/7/10
     *
     * @param discoveryProperties com.alibaba.cloud.nacos.NacosDiscoveryProperties
     * @param nacosServiceManager com.alibaba.cloud.nacos.NacosServiceManager
     * @return com.alibaba.cloud.nacos.discovery.NacosServiceDiscovery
     */
    @Bean
    public NacosServiceDiscovery nacosServiceDiscovery(
            NacosDiscoveryProperties discoveryProperties,
            NacosServiceManager nacosServiceManager) {
        return new NacosServiceDiscovery(discoveryProperties, nacosServiceManager);
    }
}

PS:本人使用该方法虽然能注册成功,但是请求是失败的,报错:Illegal character in authority at index 7,本来以为是得到的公网IP前后有空格之类的,用了trim方法依然还是报错,有待继续研究。

No.3 动态IP注册-监听器形式

  1. 新建监听器类
package com.zhongyi.doctor.config;

import cn.hutool.http.Header;
import cn.hutool.http.HttpRequest;
import org.springframework.boot.context.config.ConfigFileApplicationListener;
import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent;
import org.springframework.boot.context.event.ApplicationPreparedEvent;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.event.SmartApplicationListener;
import org.springframework.core.Ordered;

/**
 * @author SymbolWong
 * @description
 * @date 2023/2/18 9:13
 */
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) {
        String currentIp = getServerInternetIP();
        if (applicationEvent instanceof ApplicationEnvironmentPreparedEvent) {
            System.setProperty("spring.cloud.nacos.discovery.ip", currentIp);
        }
    }


    private String getServerInternetIP() {
        String internetip = "";
        String url = "https://ip.3322.org";
        internetip = HttpRequest.get(url)
                .header(Header.USER_AGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36")
                .execute().body();
        return internetip.trim();
    }
}

  1. 启动入口处注入该监听类
SpringApplication springApplication = new SpringApplication(DoctorApplication.class);
springApplication.addListeners(new AfterConfigListener());
springApplication.run(args);

PS:使用此方法完美解决,可以愉快的跨服务器请求了!

特别强调

  1. 跨服务器组装业务一定要使用公网IP,千万不要用内网IP!!!
  2. 注意防火墙、安全组的限制!!!

参考文章

https://developer.aliyun.com/article/984147文章来源地址https://www.toymoban.com/news/detail-446312.html

到了这里,关于[Nacos] 业务实例如何指定IP注入Nacos的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringCloud Nacos服务注册指定注册的ip和端口号

    如果说我们默认不配置注册指定ip和端口号那么会走我们的本地网卡 特殊服务部署可能需要制定注册的ip与端口号 配置文件加上 spring.cloud.nacos.discovery.ip = ip spring.cloud.nacos.discovery.port = 端口 就可以啦

    2024年02月11日
    浏览(32)
  • 华为云云服务器云耀L实例评测 | 智能不卡顿:如何实现流畅的业务运行

    🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页 ——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍专栏》 🐾 学会IDEA常用操作,工作效率翻倍~💐 🌊 《100天精通Golang(基础

    2024年02月09日
    浏览(67)
  • 如何通过Nacos获取当前服务注册的IP信息

    一台机器可能存在多个网卡也就同时存在多个IP地址,如果我想知道我这个服务在向Nacos注册的时候使用的哪一个IP该怎么获取呢? 非常简单,你可以通过这种方式获取 也可以在任意地方注入nacos的NacosDiscoveryProperties来获取比如下面 输出的就是本机向Nacos注册的IP地址 10.xxx.xxx.212

    2024年02月11日
    浏览(29)
  • 如何利用Socks5代理IP提升网络安全与跨境电商业务

    在今天的数字时代,网络安全对于个人和企业来说都至关重要。随着跨境电商和在线游戏等业务的不断发展,保护网络安全变得尤为重要。Socks5代理IP是一项强大的工具,可以帮助您实现更高水平的网络安全,同时促进跨境电商和游戏领域的增长。本文将探讨Socks5代理IP的作用

    2024年02月09日
    浏览(49)
  • 微服务注册到Nacos后如何读取外网IP

    微服务部署后,各服务是需要相互间调用的,其中服务A在去调用服务B的时候发现无法调用成功。其中服务注册和发现中心以及配置中心使用的是Nacos。Nacos客户端在注册服务时会从机器网卡中选择其中一个IP来注册,当我们要部署的机器存在多个网卡(例如存在虚拟网卡)时

    2024年02月16日
    浏览(29)
  • windows系统多网口如何指定出口IP

    需求背景: 服务器通常有多个网口,每一个网口提供不同的流量 网络拓扑: 举例 : 服务器 server 有两个网口:分别为: LAN 提供内部网络的访问,不配置网关 WAN1 提供外部网络的访问 查看IP命令: ipconfig  打印路由命令:route print  有两条永久路由: 1、到172.20.0.0/16 网络通

    2024年02月04日
    浏览(21)
  • 原生IP代理如何帮助跨境电商店铺做谷歌广告投放业务的?

    随着全球化的发展,越来越多的电商店铺开始拓展跨境业务,而谷歌广告作为全球最大的广告平台之一,为跨境电商店铺带来了巨大的收益和商机。 然而,由于谷歌广告的地域限制和审查机制,店铺很难直接进行投放业务,这时使用原生IP代理服务就成为了一种不错的解决方

    2024年01月18日
    浏览(40)
  • 如何使用静态IP代理解决Facebook多账号注册并进行网络推广业务?

    在当今的数字时代,社交媒体成为了企业进行网络推广的一个重要途径,其中,Facebook是最受欢迎的社交媒体之一,因为它可以让企业通过创建广告和页面来推广他们的产品或服务。 但是,使用Facebook进行网络推广时,很多企业会面临一个问题:不能大量注册账号。那么,这

    2024年01月25日
    浏览(31)
  • 业务拓展利器!跨境电商如何选对代理IP?IPIDEA 一键连接全球商机!

    全球化趋势下的跨境电商 据统计,全球跨境电商市场规模已超过4万亿美元,并呈现出持续增长的趋势。各国政府也纷纷出台政策支持跨境电商发展,进一步促进了市场规模的扩大。 跨境电商面临的挑战 跨境电商在迅速发展中,也面临着诸多挑战,如不同国家地区的语言、文

    2024年03月16日
    浏览(40)
  • 设置数据库服务器电脑固定IP,指定IP,静态IP的方法教程,WIn7电脑如何设置固定IP的方法,设置电脑的指定IP

    设置数据库服务器电脑固定IP,指定IP,静态IP的方法教程,WIn7电脑如何设置固定IP的方法,设置电脑的指定IP_哔哩哔哩_bilibili 本期视频讲解:如何将服务器电脑的IP地址改成固定IP。 https://www.bilibili.com/video/BV1qF411F7wF/ 盘点机PDA登录界面,【连接设置】里,如果是局域网实时在

    2024年02月10日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包