在学习微服务注册到nacos的时候,所有过程都正确了,注册也成功了,但是访问不了调用的地址报错出现问题。
一、引入依赖
在cloud-demo父工程的pom文件中的<dependencyManagement>
中引入SpringCloudAlibaba的依赖
1、springboot
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.4</version>
<relativePath/>
</parent>
2、springCloud
根据对应springboot版本找队友springcloud版本,点击下面链接
Spring Cloud
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2023.0.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
3、nacos的管理依赖
可以在这里看对应版本信息GitCode - 开发者的代码家园
<!--nacos的管理依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2022.0.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
版本信息都对应上。
4、引入nacos-discovery依赖
在user-service和order-service中的pom文件中引入nacos-discovery依赖:
可以在这边对应找maven版本,但是默认和parent的版本一致,对应即可https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-discovery
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
注意:不要忘了注释掉eureka的依赖。
二、配置nacos地址
在user-service和order-service的application.yml中添加nacos地址:
spring:
cloud:
nacos:
server-addr: localhost:8848
注意:不要忘了注释掉eureka的地址
三、重启项目
重启微服务后,登录nacos管理页面,可以看到微服务信息:
这些都成功实现。
四、出现的问题
当我在浏览器搜索http://localhost:8080/order/102这个地址想看看结果是否也能成功出现,但是出现问题。
在idea里面报以下错误。
文字描述(方便搜索出来):04-16 23:34:03:092 ERROR 31032 --- [orderservice] [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://userservice/user/2": userservice] with root cause
对应的service:
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
@Autowired
private RestTemplate restTemplate;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
//2.利用RestTemplate发起http请求,查询用户
//2.1 url路径
// String url="http://localhost:8081/user/"+order.getUserId();
//用服务名代替ip端口
String url="http://userservice/user/"+order.getUserId();
//2.2 发起http请求,实现远程调用
User user = restTemplate.getForObject(url, User.class);
//3.封装user到order
order.setUser(user);
// 4.返回
return order;
}
}
五、解决问题
在经过几个小时的搜索和看弹幕,我锁定在应该是负载均衡那边没有成功。
在order的启动类上我加了@LoadBalanced这个注解,但是缺少一个maven坐标
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
/**
* 创建RestTemplate对象,并注入Spring容器中
* @return
*/
@Bean
@LoadBalanced//负载均衡
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
以下是需要添加的maven坐标
<!-- nacos配置管理依赖包 -->
<!--负载均衡-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
加入坐标后,重新编译运行。
也是成功解决问题。