springcloud nacos 踩坑指南 微服务异常解决

异常简要列表

  • 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>
&lt;!&ndash;			<version>${nacos-config-spring-boot.version}</version>&ndash;&gt;
			<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>
&lt;!&ndash;			<version>2.2.4.RELEASE</version>&ndash;&gt;
		</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>


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值