赞
踩
父项目中已经引入了spring-cloud-alibaba,这个里面就已经包含nacos依赖了,所以在子项目中引入nacos依赖不用添加版本信息
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
- <!--nacos-服务注册发现-->
- <dependency>
- <groupId>com.alibaba.cloud</groupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
- </dependency>
- </dependencies>
引入之后需要在子项目的application.yml中添加服务的名称和nacos服务地址信息
- server:
- port: 8020
- #应用名称(nacos会将该名称当做服务名称)
- spring:
- application:
- name: order-service
- cloud:
- nacos:
- server-addr: 192.168.1.146:8848
- discovery:
- #不配置,默认的就是nacos
- username: nacos
- password: nacos
- #namespace的默认值就是public,可以不用配置
- namespace: public
- server:
- port: 8021
- #应用名称(nacos会将该名称当做服务名称)
- spring:
- application:
- name: stock-service
- cloud:
- nacos:
- server-addr: 192.168.1.146:8848
- discovery:
- #不配置,默认的就是nacos
- username: nacos
- password: nacos
- #namespace的默认值就是public,可以不用配置
- namespace: public
然后咱们启动这两个服务
通过日志,咱们可以看到服务已经注册到nacos中了,那么咱们访问下nacos
可以看到服务已经注册到nacos中了。
点击操作列的“详情”,可以看到详细的元数据信息
如果将服务停止,15s左右健康状况改成false,如果20s-30s左右检测不到心跳,会将这个服务剔除掉。
通过order中调用stock库存的原先的代码
- package com.chinasofti.order.controller;
-
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RestController;
- import org.springframework.web.client.RestTemplate;
-
- /**
- * @Author mxx
- * @Date 2023/6/12 16:44
- * @Version 1.0
- */
- @RestController
- @RequestMapping("/order")
- public class OrderController {
- @Autowired
- RestTemplate restTemplate;
- @RequestMapping("/add")
- public String add(){
- System.out.println("下单成功");
- String msg=restTemplate.getForObject("http://localhost:8011/stock/reduct",String.class);
- return "Hello World!"+msg;
- }
- }
引入nacos之后的代码:
- package com.chinasofti.order.controller;
-
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RestController;
- import org.springframework.web.client.RestTemplate;
-
- /**
- * @Author mxx
- * @Date 2023/6/12 16:44
- * @Version 1.0
- */
- @RestController
- @RequestMapping("/order")
- public class OrderController {
- @Autowired
- RestTemplate restTemplate;
- @RequestMapping("/add")
- public String add(){
- System.out.println("下单成功");
- String msg=restTemplate.getForObject("http://stock-service/stock/reduct",String.class);
- return "Hello World!"+msg;
- }
- }
重启下order的服务,调用下add方法看看
访问失败了,这是为啥呢,原因是nacos解析不了ip端口这些东西,它需要负载均衡器进行调用,负载均衡器默认采用轮询的方式调用库存服务,nacos默认采用的负载均衡是Ribbon
怎么引入负载均衡器呢,咱们在咱的RestTemplate中加一个注解 @LoadBalanced,如下:
- package com.chinasofti.order;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.boot.web.client.RestTemplateBuilder;
- import org.springframework.cloud.client.loadbalancer.LoadBalanced;
- import org.springframework.context.annotation.Bean;
- import org.springframework.web.client.RestTemplate;
-
- /**
- * @Author mxx
- * @Date 2023/6/12 16:55
- * @Version 1.0
- */
- @SpringBootApplication
- public class OrderApplication {
- public static void main(String[] args) {
- SpringApplication.run(OrderApplication.class,args);
- }
- @Bean
- @LoadBalanced
- public RestTemplate restTemplate(RestTemplateBuilder builder){
- RestTemplate restTemplate = builder.build();
- return restTemplate;
- }
- }
然后重启order服务再次访问,成功了,如下:
咱们如何测试nacos的负载均衡器的轮询的方式呢,咱们通过将stock复制一份出来
将复制出来的server.port 端口修改为8022
为了方便查看咱们到底请求的是哪个stock,那么咱们修改下stock的代码,加上访问的端口
- package com.chinasofti.stock.controller;
-
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RestController;
-
- /**
- * @Author mxx
- * @Date 2023/6/12 16:48
- * @Version 1.0
- */
- @RestController
- @RequestMapping("/stock")
- public class StockController {
- @Value("${server.port}")
- String port;
- @RequestMapping("/reduct")
- public String reduct(){
- System.out.println("扣减库存");
- return "扣减库存:"+port;
- }
- }
然后咱们将这三个服务都启动起来,再访问下订单的地址
多次刷新,发现一会访问的是8021,一会访问的是8022,这样咱们就实现轮询了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。