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

}

相关