1、项目中引入nacos
父项目中已经引入了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左右检测不到心跳,会将这个服务剔除掉。
2、代码中对nacos的使用
通过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,这样咱们就实现轮询了