使用discoveryClient
配置依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starteralibaba-nacos-discovery</artifactId>
</dependency>
配置nacos
server:
port: 9000
spring:
application:
name: xdclass-video-service
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
启动类添加注解
@EnableDiscoveryClient
controller逻辑
@RestController
@RequestMapping("api/v1/video_order")
public class OrderController {
@Autowired
private RestTemplate restTemplate;
private DiscoveryClient discoveryClient;
@RequestMapping("/save")
public Object save(int videoId){
//默认是集群
List<ServiceInstance> list = discoveryClient.getInstances("video-service");
//只用第一个 不轮询了
ServiceInstance serviceInstance = list.get(0);
//路径和端口不写死
Video video = restTemplate.getForObject("http://"+ serviceInstance.getHost() +":"+ serviceInstance.getPort() +"/api/v1/video/find_by_id?videoId="+videoId, Video.class);
VideoOrder videoOrder = new VideoOrder();
videoOrder.setVideoId(video.getId());
videoOrder.setVideoTitle(video.getTitle());
videoOrder.setCreateTime(new Date());
return videoOrder;
}
}
这时候获取到的是video-service的ip和端口号
v1/find_by_id?videoId=xx这个接口是通过id查询所有值
这时候运行 http://localhost:8087/save?videoId=40 即可输出两张表都有的的三个值(VideoId,VideoTitle,CreateTime)
使用Ribbon实现负载均衡
在orderApplication添加@LoadBalanced注解
@Bean
//使用Ribbon的注解
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
然后VideoController进行调用
@RestController
@RequestMapping("api/v1/video_order")
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/save")
public Object save(int videoId){
//直接使用nacos路径
Video video = restTemplate.getForObject("http://xdclass-video-service/api/v1/video/find_by_id?videoId="+videoId, Video.class);
VideoOrder videoOrder = new VideoOrder();
videoOrder.setVideoId(video.getId());
videoOrder.setVideoTitle(video.getTitle());
videoOrder.setCreateTime(new Date());
return videoOrder;
}
}
Ribbon配置负载均衡
策略选择:
1、一般不修改策略,默认即可
2、如果部分机器配置强,则可以改为WeightedResponseTimeRule
3.还有别的轮询策略,但一般用不到
xdclass-video-service这个是nacos被调用的服务名称 我在order调用video的服务,所以把这个配置写在order的application中
xdclass-video-service:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule
结语
Ribbon已经很方便了,但其实有一种更方便的就是Feign,它集成了Ribbon使调用更方便,具体怎么用可以看我下面的文章
https://blog.csdn.net/Andrew0219/article/details/122435346