需求描述
使用 Spring Cloud Alibaba 搭建微服務(wù),業(yè)務(wù)實例默認(rèn)使用內(nèi)網(wǎng) IP 注冊到 Nacos 服務(wù)端,這樣在跨局域網(wǎng)時會無法請求成功。那如何解決呢?
答:指定外網(wǎng) IP 注冊到 Nacos 上。
下述方法來自網(wǎng)絡(luò),版權(quán)歸原著作人,本人只是搬運(yùn)工+實踐者!
No.1 指定IP注冊
在 Nacos 客戶端指定IP,啟動成功后即可以在 Nacos 服務(wù)端上看到對應(yīng)的IP。
在 bootstrap.yml 配置文件中寫入:
spring.cloud.nacos.discovery.ip = xx
spring.cloud.nacos.discovery.port = xxx
或指定網(wǎng)卡注冊:
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 動態(tài)注冊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獲取本機(jī)外網(wǎng)IP,需要Nginx配合配置
* @author IPMan
* @date 2022/7/10
*
* @return java.lang.String 返回本機(jī)外網(wǎng)IP
*/
private String getServerInternetIPByNginx(){
//通過配置中心地址構(gòu)造查詢IP請求地址
String url="http://"+nacosConfigServerAaddr.split(":")[0]+"/getIp";
//調(diào)試輸出,這里不推薦err的方式輸出,這樣僅為測試使用,推薦采用日志實現(xiàn)或者不輸出
// System.err.println(url);
log.warn("Nacos server addr is {}",url);
//外網(wǎng)IP
String internetIP="127.0.0.1";
//這里一步完成了,構(gòu)造一個RestTemplate對象,通過對指定URL執(zhí)行GET請求來獲取響應(yīng)實體
ResponseEntity<String> response =
new RestTemplate()
.getForEntity(url, String.class);
// //從響應(yīng)實體對象中獲取內(nèi)容
internetIP = response.getBody();
// //調(diào)試輸出,這里不推薦err的方式輸出,這樣僅為測試使用,推薦采用日志實現(xiàn)或者不輸出
// System.err.println(internetIP);
log.warn("Internet ip is {}",url);
return internetIP;
}
/**
* nacosProperties Nacos 服務(wù)發(fā)現(xiàn)配置類,代替yml中spring.cloud.nacos.discovery:配置
* @author IPMan
* @date 2022/7/10
*
* @return com.alibaba.cloud.nacos.NacosDiscoveryProperties
*/
@Bean
public NacosDiscoveryProperties nacosProperties() {
//new一個nacos服務(wù)發(fā)現(xiàn)配置對象
NacosDiscoveryProperties properties = new NacosDiscoveryProperties();
//設(shè)置發(fā)現(xiàn)注冊的IP,即注冊中心詳情中的IP,這里很關(guān)鍵,默認(rèn)是Inet4Address.getLocalHost(),即如果包含子網(wǎng),則獲取的是子網(wǎng)IP
properties.setIp(getServerInternetIP());
//設(shè)置注冊中心地址
properties.setServerAddr(nacosConfigServerAaddr);
//設(shè)置注冊中心命名空間
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 服務(wù)發(fā)現(xiàn)對象,這個對象構(gòu)造完成后是無法設(shè)置配置的
* @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,本來以為是得到的公網(wǎng)IP前后有空格之類的,用了trim方法依然還是報錯,有待繼續(xù)研究。
No.3 動態(tài)IP注冊-監(jiān)聽器形式
- 新建監(jiān)聽器類
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();
}
}
- 啟動入口處注入該監(jiān)聽類
SpringApplication springApplication = new SpringApplication(DoctorApplication.class);
springApplication.addListeners(new AfterConfigListener());
springApplication.run(args);
PS:使用此方法完美解決,可以愉快的跨服務(wù)器請求了!文章來源:http://www.zghlxwxcb.cn/news/detail-446312.html
特別強(qiáng)調(diào)
- 跨服務(wù)器組裝業(yè)務(wù)一定要使用公網(wǎng)IP,千萬不要用內(nèi)網(wǎng)IP!??!
- 注意防火墻、安全組的限制?。?!
參考文章
https://developer.aliyun.com/article/984147文章來源地址http://www.zghlxwxcb.cn/news/detail-446312.html
到了這里,關(guān)于[Nacos] 業(yè)務(wù)實例如何指定IP注入Nacos的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!