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;
}
}