异常简要列表
- No instances available for XXX
没有名为XXX的可用实例 - Request URI does not contain a valid hostname
- java.lang.ClassNotFoundException
解决方案及注意事项
- springboot与springcloud在pom里引用的版本需对应,否则会出现找不到类或方法异常
- springboot/springcloud注册微服务时,服务名带下划线不影响注册,可以在nacos页面看到注册成功,但是被调用的话会出现调用不到现象,需按如下版本对应关系更新pom
- RestTemplate方式调用微服务时,要带 @LoadBalanced 这样才能通过服务名url调用微服务
- springcloud需要有配置文件bootstrap.properties,代替application.properties使用,否则会出现找不到注册中心文件什么的一些奇怪问题
- springcloud调用nacos配置文件时,dataid和服务名一致时,可以不在项目的配置文件里指定,默认会去调用
springcloud与springboot版本对应关系
Release Train Boot Version
Hoxton 2.2.x, 2.3.x (Starting with SR5)
Greenwich 2.1.x
Finchley 2.0.x
Edgware 1.5.x
Dalston 1.5.x
参考
- No instances available for XXX_搞机不搞基的博客-CSDN博客
https://blog.csdn.net/weixin_43465497/article/details/88089394 - 使用springcloud注册服务是Request URI does not contain a valid hostname: http://eureka_client:8763/hi_呀喳喳小红帽的博客-CSDN博客 https://blog.csdn.net/weixin_44594257/article/details/98343573
- SpringCloud踩坑指南(错误解决)之eureka启动报错,版本不匹配,提示The following method did not exist:CompositeHealt_cmqwan的博客-CSDN博客 https://blog.csdn.net/cmqwan/article/details/89025397
简要示例
配置文件 bootstrap.properties
server.port=8079
management.endpoints.web.exposure.include=*
#server.port= 8079
spring.application.name=cloudConsumer1
#spring.application.name=cloud_consumer1
#服务器ip或本地ip 配置中心不指定配置文件名的话,服务会使用默认指定文件 Data Id为服务名,Group为DEFAULT_GROUP
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
Main
package com.example.demo;
import com.alibaba.nacos.api.exception.NacosException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
/**
*@Description: 为了方便起见,笔者把控制器、服务注册的代码都写在启动类ProvideApplication中
* Nacos同springcloud-config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,
* 才能保证项目的正常启动。springboot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application
*@Author: hanxs-28Rules
*/
@SpringBootApplication
@RestController
@ServletComponentScan //自动注册Filter
//@EnableFeignClients
@EnableDiscoveryClient //启用服务发现
@RefreshScope //打开动态刷新功能
public class SpringcloudConsumer1 {
public static void main(String[] args) {
SpringApplication.run(SpringcloudConsumer1.class, args);
}
@Bean //RestTemplate在调用数据的时候会有一定的缺陷(参数拼接的问题),下一篇将附上使用Feign进行服务间的通信
@LoadBalanced //重要,实现负载均衡,底层实现了动态获取服务提供方ip
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
return restTemplate;
}
@Value("${user.name}") //从nacos配置中心的相关文件中获取值
String userName;
@Value("${service.name.provider}")//从nacos配置中心的相关文件中获取值
String webServerName;
@RequestMapping(value = "/way", method = RequestMethod.GET)
public String way() {
return "敢于尝试1"+ userName +this.getClass().getSimpleName();
// return String.format("%s say hello!", serverName);
}
}
@RestController
@RefreshScope //打开动态刷新功能
class TestRestTemplateController {
@Value("${service.name.provider}") //从nacos配置中心的相关文件中获取值
String webServerName;
@Resource
RestTemplate restTemplate;
@RequestMapping(value = "/way2/{string}", method = RequestMethod.GET)
public String way2(@PathVariable String string) throws NacosException {
String url = String.format("http://%s/%s", webServerName, "testreq");
// url="http://localhost:8040/"+webServerName+"/testreq";
url="http://localhost:8083/testreq";
url="http://springcloud-nacos-discovery-provider/test/" + string;
//通过getForObject()方法获取OrderController里的数据 第二个参数为获取到的数据的返回类型
// return restTemplate.getForObject("http://springcloud-nacos-discovery-provider/test/" + string, String.class);
// String result=restTemplate.getForObject(url, String.class);
String result=restTemplate.getForObject(url, String.class);
return "敢于尝试cloudConsumer1way2"+result;
}
//这里直接注入feign client
/* @Autowired
IWebTestServer iWebTestServer;
@RequestMapping(value = "/way3", method = RequestMethod.GET)
public String way3() throws NacosException {
String result=iWebTestServer.get();
return "敢于尝试way3"+result;
}*/
}
//@FeignClient("${service.name.provider}")
/* @FeignClient("springcloud-nacos-discovery-provider") //web服务名
@Service
interface IWebTestServer{
// @DeleteMapping(value = "/{videoId}")
// public R removeVideo(@PathVariable("videoId") String videoId);
@GetMapping(value = "/testreq") //uri
public String get();
@GetMapping("test/{string}")
public String test(@PathVariable String string);
}*/
pom
<?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.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<!-- <version>2.1.3.RELEASE</version>--> <!--匹配cloud版本 <version>Greenwich.SR2</version>-->
<version>2.3.5.RELEASE</version> <!--匹配cloud版本 <version>Hoxton.SR5</version>-->
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.hanxs</groupId>
<artifactId>SpringcloudConsumer1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>SpringcloudConsumer1</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<!-- <nacos-config-spring-boot.version>0.2.1</nacos-config-spring-boot.version>-->
<nacos-config-spring-boot.version>0.2.4</nacos-config-spring-boot.version>
<spring-cloud.version>Hoxton.SR8</spring-cloud.version>
</properties>
<dependencies>
<!-- Spring Boot Web 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Boot Test 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
<!-- Junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!-- <dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<version>1.5.20</version>
<scope>compile</scope>
</dependency>-->
<!-- nacos 依赖 -->
<!-- 配置中心-->
<!--<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<!– <version>${nacos-config-spring-boot.version}</version>–>
<version>0.2.4</version>
</dependency>-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
<!-- springboot的nacos服务发现依赖->
<!- <dependency>-->
<!-- <groupId>com.alibaba.boot</groupId>-->
<!-- <artifactId>nacos-discovery-spring-boot-starter</artifactId>-->
<!-- <version>0.2.4</version>-->
<!-- </dependency>-->
<!-- springcloud的nacos服务发现依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
<!--服务调用-->
<!--openfeign客户端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.4.RELEASE</version>
</dependency>
<!-- <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
<version>2.2.3.RELEASE</version>
<!– <version>2.2.4.RELEASE</version>–>
</dependency>-->
<!-- <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-openfeign-core</artifactId>
<version>2.2.4.RELEASE</version>
</dependency>-->
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<repositories>
<repository>
<id>central</id>
<name>aliyun</name>
<!-- <url>https://maven.aliyun.com/repository/public</url>-->
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>false</enabled></snapshots>
</repository>
<repository>
<id>springsource-repos</id>
<name>SpringSource Repository</name>
<url>http://repo.spring.io/release/</url>
</repository>
<repository>
<id>central-repos</id>
<name>Central Repository</name>
<url>http://repo.maven.apache.org/maven2</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<name>aliyun</name>
<!-- <url>https://maven.aliyun.com/repository/public</url>-->
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</pluginRepository>
</pluginRepositories>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>