在学习微服务注册到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 {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate 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到orderorder.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>
加入坐标后,重新编译运行。
也是成功解决问题。