irpas技术客

Spring Boot 2.5.3 整合Spring Cloud Alibaba 搭建Nacos服务 报 ‘serviceName‘ is illegal, s

未知 8202

版本说明

Spring Boot 与 Spring Cloud Alibaba 的版本是有对应关系的,如果没有按照对应的版本号设置maven坐标,会导致各种各样奇葩的问题。

传送门:GitHub中的版本关系

最重要的是 毕业版本依赖关系: 根据 Spring Boot Version ,找到对应的Spring Cloud Alibaba Version,就无需再关心 Spring Cloud Alibaba 中各个组件的版本了,因为它会自动依赖好对应的组件版本:

整合过程 创建父工程

1、使用Spring Initializr 创建父工程 2、修改工程类型和打包方式为pom

Type可以在此处修改Packaging需要等到工程创建后,修改父工程的pom.xml文件 3、单击next,可以选择Spring Boot的版本号,此处的版本号来自于步骤1中https://start.spring.io,这是spring提供的Java工程脚手架。 此处不用选择其它依赖组件,我们在pom.xml中手动配置依赖坐标。 4、父工程的pom.xml <!--子工程--> <modules> <module>orders-nacos</module> </modules> <!--springboot 版本管理 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <!--创建时的SpringBoot版本号--> <version>2.3.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example.springcloud</groupId> <artifactId>springcloudalibaba</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springcloudalibaba</name> <description>Demo project for Spring Boot</description> <!--打包方式改为pom--> <packaging>pom</packaging> <properties> <java.version>1.8</java.version> <!--统一管理依赖的组件版本号--> <spring.cloud.alibaba.version>2.2.6.RELEASE</spring.cloud.alibaba.version> <spring.cloud.version>Hoxton.SR9</spring.cloud.version> </properties> <dependencyManagement> <dependencies> <!--springcloud alibaba 版本管理 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>${spring.cloud.alibaba.version}</version> <type>pom</type> <scope>import</scope> </dependency> <!--springcloud 版本管理 --> <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> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> 创建nacos-client客户端应用

直接new一个maven的module即可,此处不再赘述。

1. orders-nacos工程结构

注意:刚开始我将Application启动类放在了与com包下,与cloud包在同一层级,这是导致下文中问题【2. 修改Spring Boot 版本后依然报错】的原因!!!

2. pom.xml <parent> <artifactId>springcloudalibaba</artifactId> <groupId>com.example.springcloud</groupId> <version>0.0.1-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>orders-nacos</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--依赖父工程中Spring cloud alibaba的组件 nacos--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> </dependencies> </project> 3. application.yml配置 server: port: 8010 spring: application: name: order-service cloud: nacos: server-addr: 127.0.0.1:8848 4. StockController代码 /** * @ * @author: AntonyZhang * @date: 2021/08/10 21:33 */ @RestController @RequestMapping("/order") public class OrderController { @Autowired RestTemplate restTemplate; @RequestMapping("/add") public String add() { System.out.println("下单成功"); // 访问stock2-nacos服务,stock-service为stock2-nacos服务作为nacos-server的服务名,配置在其yml文件中 String resp = restTemplate.getForObject("http://stock-service/stock/reduct", String.class); return "success" + " " + resp; } } 5. Application代码 /** * @ * @author: AntonyZhang * @date: 2021/08/10 21:35 */ @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class); } // 通过构造器 创建一个restTemplate @Bean @LoadBalanced public RestTemplate restTemplate(RestTemplateBuilder builder) { RestTemplate restTemplate = builder.build(); return restTemplate; } } 创建nacos-server服务端应用 1. stock2-nacos工程结构

2. pom.xml <parent> <artifactId>springcloudalibaba</artifactId> <groupId>com.example.springcloud</groupId> <version>0.0.1-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>stock2-nacos</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> </dependencies> 3. application.yml配置 server: port: 8011 spring: application: name: stock-service cloud: nacos: server-addr: 127.0.0.1:8848 4. StockController代码 /** * @author: AntonyZhang * @date: 2021/08/10 21:48 */ @RestController @RequestMapping("/stock") public class StockController { @RequestMapping("/reduct") public String add() { System.out.println("扣减库存"); return "扣减库存"; } } 5. Application代码 /** * @ * @author: AntonyZhang * @date: 2021/08/10 21:35 */ @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class); } } 问题 1. Spring Boot 2.5.3 版本不兼容导致启动报错

报:Caused by: java.lang.ClassNotFoundException: org.springframework.boot.context.properties.ConfigurationBeanFactoryMetadata 找不到 解决方案: 1、怀疑是兼容性问题,根据上面的版本说明,父pom中,spring.cloud.alibaba.version 和 spring.cloud.version 对应的Spring Boot的版本号应该是 2.3.2.RELEASE

<spring.cloud.alibaba.version>2.2.6.RELEASE</spring.cloud.alibaba.version> <spring.cloud.version>Hoxton.SR9</spring.cloud.version>

2、因此,修改Spring Boot的版本号为 2.3.2.RELEASE 可以看到,修改之后,找不到这个版本, 将父工程重新install以下,就可以拉到这个版本了,即使它仍然是红色也不影响。

2. 修改Spring Boot 版本后依然报错

具体报错信息如下:

Description: Parameter 0 of method ribbonServerList in com.alibaba.cloud.nacos.ribbon.NacosRibbonClientConfiguration required a bean of type 'com.netflix.client.config.IClientConfig' that could not be found. Action: Consider defining a bean of type 'com.netflix.client.config.IClientConfig' in your configuration.

分析:IClientConfig找不到,所以需要配置一个configuration类。

解决方案: 参考博主 Younger50的No qualifying bean of type ‘com.netflix.client.config.IClientConfig‘ available

@Configuration public class ClientConfig { @Bean public IClientConfig iClientConfig() { return new DefaultClientConfigImpl(); } }

再次启动,服务重启成功。 登录nacos客户端,可以看见已经注册到nacos的服务: 本以为搭建Nacos-client服务已经成功了,可是在测试的时候,又报错了,见下文。

3. ‘serviceName’ is illegal, serviceName is blank

1、在浏览器,通过访问订单服务,实现扣减库存服务。即通过nacos-client访问nacos-server,找不到serverName。 此时,报错如下: 2、orders-nacos服务的控制台日志输出如下: 主要报错:Caused by: java.lang.IllegalArgumentException: Param ‘serviceName’ is illegal, serviceName is blank

具体报错如下:

2021-08-14 22:52:13.280 WARN 12440 --- [erListUpdater-0] c.n.l.PollingServerListUpdater : Failed one update cycle java.lang.IllegalStateException: Can not get service instances from nacos, serviceId=null at com.alibaba.cloud.nacos.ribbon.NacosServerList.getServers(NacosServerList.java:60) ~[spring-cloud-starter-alibaba-nacos-discovery-2.2.6.RELEASE.jar:2.2.6.RELEASE] at com.alibaba.cloud.nacos.ribbon.NacosServerList.getUpdatedListOfServers(NacosServerList.java:49) ~[spring-cloud-starter-alibaba-nacos-discovery-2.2.6.RELEASE.jar:2.2.6.RELEASE] at com.netflix.loadbalancer.DynamicServerListLoadBalancer.updateListOfServers(DynamicServerListLoadBalancer.java:240) ~[ribbon-loadbalancer-2.3.0.jar:2.3.0] at com.netflix.loadbalancer.DynamicServerListLoadBalancer$1.doUpdate(DynamicServerListLoadBalancer.java:62) ~[ribbon-loadbalancer-2.3.0.jar:2.3.0] at com.netflix.loadbalancer.PollingServerListUpdater$1.run(PollingServerListUpdater.java:116) ~[ribbon-loadbalancer-2.3.0.jar:2.3.0] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_201] at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) [na:1.8.0_201] at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_201] at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) [na:1.8.0_201] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_201] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_201] at java.lang.Thread.run(Thread.java:748) [na:1.8.0_201] Caused by: java.lang.IllegalArgumentException: Param 'serviceName' is illegal, serviceName is blank at com.alibaba.nacos.api.naming.utils.NamingUtils.getGroupedName(NamingUtils.java:47) ~[nacos-api-1.4.2.jar:na] at com.alibaba.nacos.client.naming.NacosNamingService.selectInstances(NacosNamingService.java:359) ~[nacos-client-1.4.2.jar:na] at com.alibaba.nacos.client.naming.NacosNamingService.selectInstances(NacosNamingService.java:332) ~[nacos-client-1.4.2.jar:na] at com.alibaba.nacos.client.naming.NacosNamingService.selectInstances(NacosNamingService.java:320) ~[nacos-client-1.4.2.jar:na] at com.alibaba.cloud.nacos.ribbon.NacosServerList.getServers(NacosServerList.java:56) ~[spring-cloud-starter-alibaba-nacos-discovery-2.2.6.RELEASE.jar:2.2.6.RELEASE] ... 11 common frames omitted

原因:两个工程中的 SpringBoot应用启动类Application路径错误,导致了问题【2. 修改Spring Boot 版本后依然报错】,进而导致’serviceName’ is illegal, serviceName is blank !!!

解决方案: 1)将两个工程的Application启动类,都移动到com.cloud包下,放在与controller包同一级的目录下 2)同时,删除掉 ClientConfig的配置类 3)重启服务后,再次访问,模拟扣减库存成功!

总结 Spring Boot 整合Spring Cloud Alibaba 时,版本需要对应;无需配置类ClientConfig报'serviceName' is illegal, serviceName is blank 就是启动类的路径问题导致Spring Boot没有将nacos相关bean自动装配到容器中导致的问题

1、当然,这是笔者此次遇到的问题。搭建Nacos服务中的不同错误,是由你选择的Spring Boot的不同版本以及对应的Spring Cloud Alibaba的版本导致的。 2、网上找了好多篇文章,都没有解决问题。直到看到 segmentfault中的No instances available for xxxxxx这篇博文时,对比了下配置,发现了问题所在;具体过程是: 1)我在问题3出现后,一直没有找到解决方案 2)按照版本说明 修改了父工程中Spring Boot的版本 以及对应的Spring Cloud Alibaba版本,选择了低版本尝试 3)启动两个应用后再次尝试,报错就变为了 No instances available for stock-service 4)按照segmentfault文章中的方法,修改了Application启动类的路径,问题3就解决了 5)最后又尝试了高版本的Spring Boot的版本 以及对应的Spring Cloud Alibaba版本,删除ClientConfig的配置类,服务启动和访问也没有问题;但是不删除ClientConfig的配置类反倒报错,可见不同Spring Boot的版本 以及对应的Spring Cloud Alibaba版本,会出现各种不同的问题


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #Spring #Boot #253 #整合spring #Cloud #Alibaba #搭建Nacos服务 #