Nacos手动注册,Nacos内网IP的解决办法,自动获取外网注册服务

2023-11-17

Nacos内网IP的解决办法,自动获取外网注册服务

废话不说 直接上代码

pom文件:

     <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>

NacosUtils工具类:

/**
 * @date: 2021/3/16
 * @description:Nacos工具
 */
@Slf4j
@Component
@EnableNacosDiscovery(globalProperties = @NacosProperties(serverAddr = "${spring.cloud.nacos.discovery.server-addr}"))
public class NacosUtils implements CommandLineRunner {

    //当前项目环境
    @Value("${spring.profiles.active}")
    private String active;

    //当前服务名
    @Value("${spring.application.name}")
    private String serverName;

    //当前Nacos分组
    @Value("${spring.cloud.nacos.discovery.group}")
    private String groupName;

    //当前Nacos命名空间
    @Value("${spring.cloud.nacos.discovery.namespace}")
    private String namespace;

    //当前Nacos连接地址
    @Value("${spring.cloud.nacos.discovery.server-addr}")
    private String serverAddr;

    @NacosInjected
    private NamingService namingService;

    @Resource
    private DiscoveryClient discoveryClient;

    /**
     * @date: 2021/3/16
     * @description:服务初始化事件监听
     */
    @Override
    public void run(String... args) throws Exception {
        //是否关闭自动注册服务
        String enabled = ApplicationContextHolder.getApplicationProperty("spring.cloud.nacos.discovery.register-enabled");
        //关闭则通过手动方式注册
        if ("false".equals(enabled)) {
            //异步加载
                    new Thread(() -> {
                    //定义线程名称(监控线程堆栈使用率)
                    Thread.currentThread().setName("InintNacos");
                    //手动注册服务
                    registerNacosServer();
        }).start();
        }
    }
    
    /**
     * @Date: 2022/6/6
     * @Description:注册服务
     */
    public void registerNacosServer(Instance instance) {
        try {
            namingService.registerInstance(instance.getServiceName(), groupName, instance);
            log.info("Nacos server register details:["+instance.getIp()+"/" + groupName + "/" + instance.getServiceName() + "/" + namespace + "]!");
        } catch (Exception e) {
            throw new BusinessException("ServerName:[" + instance.getServiceName() + "] register faild: " + e.getMessage());
        }
    }


    /**
     * @Date: 2022/6/6
     * @Description:注册服务
     */
    public void registerNacosServer() {
        try {
            Instance instance = new Instance();
            //获取配置文件中的 Nacos服务发现IP
            String clientIp = ApplicationContextHolder.getApplicationProperty("spring.cloud.nacos.discovery.ip");
            //是否未配置  Nacos服务发现IP
            if (StringUtils.isBlank(clientIp)) {
                //根据环境环境 获取当前服务 IP地址
                clientIp =TcpIpUtil.getPublicIp();
            }
            ExceptionUtil.isBlank(clientIp, "Server profiles active get faild !");
            instance.setIp(clientIp);
            instance.setServiceName(serverName);
            instance.setPort(Integer.parseInt(TcpIpUtil.getLocalPort()));
            log.info("server details: " + instance);
            registerNacosServer(instance);
        } catch (Exception e) {
            log.error("Nacos server register faild: " + e.getMessage());
        }
    }
}

bootstrap.yml配置:

spring:
  cloud:
    nacos:
      #================== 服务注册与发现 ==================
      discovery:
        #== Nacos分组 ==
        group: @group@
        #== Nacos命名空间 ==
        namespace: @namespace@
        #== Nacos注册地址 ==
        server-addr: @server-addr@
        
        #== 是否关闭自动注册服务(true:自动注册服务)  ==
        register-enabled: false

IP工具类

package com.za.edu.utils;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.*;
import java.util.Enumeration;
import java.util.Scanner;
import java.util.regex.Matcher;

import com.aliyun.openservices.shade.org.apache.commons.lang3.StringUtils;
import io.netty.channel.Channel;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.map.HashedMap;

import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.Query;
import javax.servlet.http.HttpServletRequest;
import java.lang.management.ManagementFactory;
import java.net.InetAddress;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;

/**
 * @author: Owen
 * @date: 2021/3/18
 * @description:IP工具类
 */
@Slf4j
public class TcpIpUtil {
    //服务器 公网IP
    public static String publicIp;
    //服务器 内网IP
    public static String serversIp;

    /**
     * @author: Owen
     * @date: 2021/3/18
     * @description:获取服务Ip详情
     */
    public static Map<String, String> getIpInfo() {
        String serverIp = null;
        String serverPort = null;
        Map<String, String> ipInfo = new HashedMap();
        try {
            MBeanServer beanServer = ManagementFactory.getPlatformMBeanServer();
            Set<ObjectName> objectNames = beanServer.queryNames(new ObjectName("*:type=Connector,*"),
                    Query.match(Query.attr("protocol"), Query.value("HTTP/1.1")));
            serverIp = InetAddress.getLocalHost().getHostAddress();
            serverPort = objectNames.iterator().next().getKeyProperty("port");
            ipInfo.put(serverIp, serverPort);
        } catch (Exception e) {
            log.error("Failed to get current service IP : ", e);
        }
        return ipInfo;
    }



    /**
     * @author: Owen
     * @date: 2021/3/17
     * @description:获取当前机器的端口号
     */
    public static String getLocalPort() {
        String serverPort = null;
        try {
            MBeanServer beanServer = ManagementFactory.getPlatformMBeanServer();
            Set<ObjectName> objectNames = beanServer.queryNames(new ObjectName("*:type=Connector,*"),
                    Query.match(Query.attr("protocol"), Query.value("HTTP/1.1")));
            serverPort = objectNames.iterator().next().getKeyProperty("port");
            ExceptionUtil.isBlank(serverPort, "当前服务端口获取失败!");
            return serverPort;
        } catch (MalformedObjectNameException e) {
            e.printStackTrace();
        }
        return serverPort;
    }


    /**
     * @author: Owen
     * @date: 2021/3/18
     * @description:获取公网IP+端口
     */
    public static String getPublicIp() {
        try {
            if (StringUtils.isBlank(publicIp)) {
                String ip = publicIp();
                ExceptionUtil.isBlank(ip, "当前服务(公网IP)获取失败!");
                String port = getLocalPort();
                ExceptionUtil.isBlank(port, "当前服务(端口号)获取失败!");
                StringBuffer result = new StringBuffer(ip);
                result.append(":");
                result.append(port);
                publicIp = result.toString();
                log.info("Get public ip:" + ip);
            }
        } catch (Exception e) {
            log.error("Failed to get current service Ip : " + e.getMessage());
        }
        return publicIp;
    }

    /**
     * @author: Owen
     * @date: 2021/9/12
     * @description:公网IP
     */
    public static String publicIp() {
        String ip = null;
        // 第一种方式
        try {
            ip = getNowIP1();
            if (!StringUtils.isEmpty(ip)) {
                ip.trim();
                return ip;
            }
            // 第二种方式
            ip = getNowIP2();
            if (!StringUtils.isEmpty(ip)) {
                ip.trim();
                return ip;
            }

            // 第三种方式
            ip = getNowIP3();
            if (!StringUtils.isEmpty(ip)) {
                ip.trim();
                return ip;
            }

            // 第四种方式
            ip = getNowIP4();
            if (!StringUtils.isEmpty(ip)) {
                ip.trim();
                return ip;
            }
        } catch (Exception e) {
            log.error("Get public Ip Failed!");
        }
        return ip;
    }

    /**
     * @author: Owen
     * @date: 2021/9/12
     * @description:获取公网IP方法1
     */
    private static String getNowIP1() throws IOException {
        try {
            String ip = null;
            BufferedReader br = null;
            try {
                URL url = new URL("https://v6r.ipip.net/?format=callback");
                br = new BufferedReader(new InputStreamReader(url.openStream()));
                String s = "";
                StringBuffer sb = new StringBuffer("");
                String webContent = "";
                while ((s = br.readLine()) != null) {
                    sb.append(s + "\r\n");
                }
                webContent = sb.toString();
                int start = webContent.indexOf("(") + 2;
                int end = webContent.indexOf(")") - 1;
                webContent = webContent.substring(start, end);
                ip = webContent;
            } finally {
                if (br != null)
                    br.close();
            }
            if (StringUtils.isEmpty(ip)) {
                throw new RuntimeException();
            }
            return ip;
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * @author: Owen
     * @date: 2021/9/12
     * @description:获取公网IP方法2
     */
    private static String getNowIP2() {
        try {
            String ip = null;
            String chinaz = "http://ip.chinaz.com";
            StringBuilder inputLine = new StringBuilder();
            String read = "";
            URL url = null;
            HttpURLConnection urlConnection = null;
            BufferedReader in = null;
            try {
                url = new URL(chinaz);
                urlConnection = (HttpURLConnection) url.openConnection();
                in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "UTF-8"));
                while ((read = in.readLine()) != null) {
                    inputLine.append(read + "\r\n");
                }
                Pattern p = Pattern.compile("\\<dd class\\=\"fz24\">(.*?)\\<\\/dd>");
                Matcher m = p.matcher(inputLine.toString());
                if (m.find()) {
                    String ipstr = m.group(1);
                    ip = ipstr;
                }
            } finally {
                if (in != null) {
                    in.close();
                }
            }
            if (StringUtils.isEmpty(ip)) {
                throw new RuntimeException();
            }
            return ip;
        } catch (Exception e) {
            return null;
        }
    }


    /**
     * @author: Owen
     * @date: 2021/9/12
     * @description:获取公网IP方法2
     */
    private static String getNowIP3() throws IOException {
        try {
            String ip = null;
            String objWebURL = "https://ip.900cha.com/";
            BufferedReader br = null;
            try {
                URL url = new URL(objWebURL);
                br = new BufferedReader(new InputStreamReader(url.openStream()));
                String s = "";
                String webContent = "";
                while ((s = br.readLine()) != null) {
                    if (s.indexOf("我的IP:") != -1) {
                        ip = s.substring(s.indexOf(":") + 1);
                        break;
                    }
                }
            } finally {
                if (br != null)
                    br.close();
            }
            if (StringUtils.isEmpty(ip)) {
                throw new RuntimeException();
            }
            return ip;
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * @author: Owen
     * @date: 2021/9/12
     * @description:获取公网IP方法4
     */
    private static String getNowIP4() throws IOException {
        try {
            String ip = null;
            String objWebURL = "https://bajiu.cn/ip/";
            BufferedReader br = null;
            try {
                URL url = new URL(objWebURL);
                br = new BufferedReader(new InputStreamReader(url.openStream()));
                String s = "";
                String webContent = "";
                while ((s = br.readLine()) != null) {
                    if (s.indexOf("互联网IP") != -1) {
                        ip = s.substring(s.indexOf("'") + 1, s.lastIndexOf("'"));
                        break;
                    }
                }
            } finally {
                if (br != null)
                    br.close();
            }
            if (StringUtils.isEmpty(ip)) {
                throw new RuntimeException();
            }
            return ip;
        } catch (Exception e) {
            return null;
        }
    }

    public static String getIpAddr(HttpServletRequest request) {
        String ip = request.getHeader("X-Forwarded-For");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        ip = request.getHeader("X-Real-IP");
        if (StringUtils.isNotBlank(ip) && !"unKowm".equalsIgnoreCase(ip)) {
            return ip;
        }
        //    多个路由是,取得第一个非unknown的ip
        final String[] arr = ip.split(",");
        for (final String str : arr) {
            if (!"unknown".equalsIgnoreCase(str)) {
                ip = str;
                break;
            }
        }
        return ip;
    }

    /**
     * @author: Owen
     * @date: 2021/9/11
     * @description:获取本机的外网ip地址
     */
    public static String getV4IP() {
        String ip = "";
        String chinaz = "http://ip.chinaz.com";

        StringBuilder inputLine = new StringBuilder();
        String read = "";
        URL url = null;
        HttpURLConnection urlConnection = null;
        BufferedReader in = null;
        try {
            url = new URL(chinaz);
            urlConnection = (HttpURLConnection) url.openConnection();
            in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "UTF-8"));
            while ((read = in.readLine()) != null) {
                inputLine.append(read + "\r\n");
            }
            //System.out.println(inputLine.toString());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        Pattern p = Pattern.compile("\\<dd class\\=\"fz24\">(.*?)\\<\\/dd>");
        Matcher m = p.matcher(inputLine.toString());
        if (m.find()) {
            String ipstr = m.group(1);
            ip = ipstr;
            //System.out.println(ipstr);
        }
        return ip;
    }
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nacos手动注册,Nacos内网IP的解决办法,自动获取外网注册服务 的相关文章

随机推荐