Spring Cloud Alibaba Nacos 中处理Consumer的UnknownHostException的问题
参考:https://blog.csdn.net/ilyz5609/article/details/113400203
问题的原因是 Spring Cloud Alibaba 2020 之后弃用了 spring-cloud-starter-netflix-ribbon ,而改用 loadbalancer
Spring Cloud Alibaba 版本对应参考: https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
---------------------------------父级pom.xml----------------------------
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0modelVersion> <groupId>com.sparkmapgroupId> <artifactId>micro-serviceartifactId> <version>0.0.1version> <packaging>pompackaging> <name>micro-servicename> <properties> <java.version>1.8java.version> <project.build.sourceEncoding>UTF-8project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding> <spring-boot.version>2.4.2spring-boot.version> <spring-cloud.version>2020.0.1spring-cloud.version> <spring-cloud-alibaba.version>2021.1spring-cloud-alibaba.version> <spring-security-oauth2.version>2.5.1.RELEASEspring-security-oauth2.version> <slf4j.version>1.7.32slf4j.version> <logback.version>1.2.6logback.version> <junit.version>4.13.2junit.version> <commons-lang3.version>3.12.0commons-lang3.version> <commons-io.version>2.11.0commons-io.version> <commons-compress.version>1.21commons-compress.version> <commons-text.version>1.9commons-text.version> <commons-net.version>3.8.0commons-net.version> <commons-math3.version>3.6.1commons-math3.version> <commons-dbcp2.version>2.9.0commons-dbcp2.version> <fastjson.version>1.2.78fastjson.version> <dom4j.version>2.1.3dom4j.version> <jackson.version>2.13.0jackson.version> <httpcore.version>4.4.14httpcore.version> <httpclient.version>4.5.13httpclient.version> <druid.version>1.2.8druid.version> <postgresql.version>42.2.24postgresql.version> <postgis.version>2.5.1postgis.version> <jts.version>1.18.2jts.version> <geotools.version>25.2geotools.version> <proj4j.version>1.1.3proj4j.version> <gdal.version>3.2.0gdal.version> <maven-assembly-plugin.version>3.3.0maven-assembly-plugin.version> properties> <modules> <module>nocas-consumermodule> <module>nocas-providermodule> modules> <parent> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-parentartifactId> <version>2.4.2version> <relativePath/> parent> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloudgroupId> <artifactId>spring-cloud-dependenciesartifactId> <version>${spring-cloud.version}version> <type>pomtype> <scope>importscope> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-dependenciesartifactId> <version>${spring-boot.version}version> <type>pomtype> <scope>importscope> dependency> <dependency> <groupId>com.alibaba.cloudgroupId> <artifactId>spring-cloud-alibaba-dependenciesartifactId> <version>${spring-cloud-alibaba.version}version> <type>pomtype> <scope>importscope> dependency> <dependency> <groupId>org.springframework.security.oauthgroupId> <artifactId>spring-security-oauth2artifactId> <version>${security.oauth.version}version> dependency> <dependency> <groupId>com.alibabagroupId> <artifactId>druidartifactId> <version>${druid.version}version> dependency> <dependency> <groupId>org.apache.commonsgroupId> <artifactId>commons-dbcp2artifactId> <version>${dbcp.version}version> dependency> <dependency> <groupId>com.alibabagroupId> <artifactId>fastjsonartifactId> <version>${fastjson.version}version> dependency> <dependency> <groupId>org.dom4jgroupId> <artifactId>dom4jartifactId> <version>${dom4j.version}version> dependency> <dependency> <groupId>com.fasterxml.jackson.coregroupId> <artifactId>jackson-coreartifactId> <version>${jackson.version}version> dependency> <dependency> <groupId>com.fasterxml.jackson.coregroupId> <artifactId>jackson-annotationsartifactId> <version>${jackson.version}version> dependency> <dependency> <groupId>com.fasterxml.jackson.coregroupId> <artifactId>jackson-databindartifactId> <version>${jackson.version}version> dependency> <dependency> <groupId>org.apache.commonsgroupId> <artifactId>commons-lang3artifactId> <version>${commons-lang3.version}version> dependency> <dependency> <groupId>commons-iogroupId> <artifactId>commons-ioartifactId> <version>${commons-io.version}version> dependency> <dependency> <groupId>org.apache.commonsgroupId> <artifactId>commons-compressartifactId> <version>${commons-compress.version}version> dependency> <dependency> <groupId>org.apache.commonsgroupId> <artifactId>commons-math3artifactId> <version>${commons-math3.version}version> dependency> <dependency> <groupId>org.apache.commonsgroupId> <artifactId>commons-textartifactId> <version>${commons-text.version}version> dependency> <dependency> <groupId>commons-netgroupId> <artifactId>commons-netartifactId> <version>${commons-net.version}version> dependency> <dependency> <groupId>org.apache.httpcomponentsgroupId> <artifactId>httpcoreartifactId> <version>${httpcore.version}version> dependency> <dependency> <groupId>org.apache.httpcomponentsgroupId> <artifactId>httpclientartifactId> <version>${httpclient.version}version> dependency> <dependency> <groupId>org.apache.httpcomponentsgroupId> <artifactId>httpmimeartifactId> <version>${httpclient.version}version> dependency> <dependency> <groupId>org.locationtech.jtsgroupId> <artifactId>jts-coreartifactId> <version>${jts.version}version> dependency> <dependency> <groupId>org.locationtech.proj4jgroupId> <artifactId>proj4jartifactId> <version>${proj4j.version}version> dependency> <dependency> <groupId>org.postgresqlgroupId> <artifactId>postgresqlartifactId> <version>${postgresql.version}version> dependency> <dependency> <groupId>net.postgisgroupId> <artifactId>postgis-jdbcartifactId> <version>${postgis.version}version> dependency> <dependency> <groupId>org.slf4jgroupId> <artifactId>slf4j-apiartifactId> <version>${slf4j.version}version> dependency> <dependency> <groupId>ch.qos.logbackgroupId> <artifactId>logback-coreartifactId> <version>${logback.version}version> dependency> <dependency> <groupId>ch.qos.logbackgroupId> <artifactId>logback-classicartifactId> <version>${logback.version}version> dependency> <dependency> <groupId>junitgroupId> <artifactId>junitartifactId> <version>${junit.version}version> <scope>testscope> dependency> dependencies> dependencyManagement> <build> <resources> <resource> <directory>src/main/resourcesdirectory> <filtering>truefiltering> resource> resources> <pluginManagement> <plugins> <plugin> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-maven-pluginartifactId> <version>${spring-boot.version}version> <configuration> <layers> <enabled>trueenabled> layers> configuration> <executions> <execution> <goals> <goal>repackagegoal> goals> execution> executions> plugin> plugins> pluginManagement> build> project>
---------------------------------服务提供者----------------------------
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <parent> <artifactId>micro-serviceartifactId> <groupId>com.sparkmapgroupId> <version>0.0.1version> parent> <modelVersion>4.0.0modelVersion> <groupId>com.sparkmapgroupId> <artifactId>nacos-providerartifactId> <version>0.0.1version> <packaging>jarpackaging> <name>nacos-providername> <url>http://maven.apache.orgurl> <dependencies> <dependency> <groupId>org.springframeworkgroupId> <artifactId>spring-coreartifactId> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-webartifactId> dependency> <dependency> <groupId>com.alibaba.cloudgroupId> <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId> dependency> dependencies> project>
application.yml
spring: application: name: nacos-provider cloud: nacos: username: nacos password: nacos discovery: enabled: true server-addr: 192.168.2.18:8848 group: nacos_dev # config: # server-addr: 192.168.2.18:8848 # file-extension: yaml server: port: 8081
ProviderApplication.java
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient public class ProviderApplication { public static void main(String args[]){ SpringApplication.run(ProviderApplication.class,args); } }
DemoContoller.java
package com.demo; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RestController public class DemoContoller { @Value("${server.port}") private String port; @GetMapping(value = "/demo/{string}") public String demoTesting(@PathVariable("string") String string){ return "hello" + string + ": " + port; } }
---------------------------------服务使用者----------------------------
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <parent> <artifactId>micro-serviceartifactId> <groupId>com.sparkmapgroupId> <version>0.0.1version> parent> <modelVersion>4.0.0modelVersion> <groupId>com.sparkmapgroupId> <artifactId>nacos-consumerartifactId> <version>0.0.1version> <packaging>jarpackaging> <name>nacos-consumername> <url>http://maven.apache.orgurl> <dependencies> <dependency> <groupId>org.springframework.cloudgroupId> <artifactId>spring-cloud-starter-bootstrapartifactId> dependency> <dependency> <groupId>com.alibaba.cloudgroupId> <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId> <exclusions> <exclusion> <groupId>org.springframework.cloudgroupId> <artifactId>spring-cloud-starter-netflix-ribbonartifactId> exclusion> exclusions> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-webartifactId> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-actuatorartifactId> dependency> <dependency> <groupId>org.springframework.cloudgroupId> <artifactId>spring-cloud-starter-loadbalancerartifactId> dependency> <dependency> <groupId>org.springframework.cloudgroupId> <artifactId>spring-cloud-starter-openfeignartifactId> dependency> <dependency> <groupId>com.alibaba.cloudgroupId> <artifactId>spring-cloud-starter-alibaba-sentinelartifactId> dependency> dependencies> project>
application.yml
spring: application: name: nacos-consumer cloud: nacos: username: nacos password: nacos discovery: enabled: true server-addr: 192.168.2.18:8848 group: nacos_dev # config: # server-addr: 192.168.2.18:8848 # file-extension: yaml # sentinel: # eager: true # transport: # dashboard: localhost:8080 # feign: # sentinel: # enabled: true server: port: 8082 management: endpoints: web: exposure: include: "*" # ribbon: # nacos: # enabled: false
ConsumerApplication.java
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient public class ConsumerApplication { public static void main(String args[]) { SpringApplication.run(ConsumerApplication.class, args); } }
RestConfig.java
package com.demo; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; @Configuration public class RestConfig { //@LoadBalanced实现负载均衡,有多个服务提供者,一定要使用,不然会报错 @LoadBalanced @Bean public RestTemplate restTemplate() { return new RestTemplate(); } }
PrintController.java
package com.demo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController public class PrintController { @Value("${server.port}") private String port; // @Value("${service.name.provider}") // private String webServerName; @Autowired private RestTemplate restTemplate; @GetMapping(value = "/port") public String echo() { // String webServerName = "nacos-provider"; return "I'm port: " + port + ", " + restTemplate.getForObject("http://" + webServerName + "/demo/hi", String.class); } }