目录
1.前言
nacos
是第二代微服务SpringCloudAlibaba
开源的一款注册中心和分布式配置中心组件,其功能上为第一代微服务SpringCloud
中Eureka
和Config
的结合体。简而言之,Nacos可以实现分布式服务注册与发现
和分布式配置
中心功能。
Nacos官方文档: https://nacos.io/zh-cn/docs/what-is-nacos.html
2.Nacos-discovery默认支持Ribbon负载均衡
为了保持好奇心,特地分析了一下SpringCloud常见的注册中心组件: Eureka
、Consul
、nacos
等,默认都是集成并开启了Ribbon
负载均衡,本节为nacos主题,我们分析下nacos的服务发现组件,不难看出,他也是默认集成并且支持ribbon负载均衡的。
3.环境搭建
3.1.Product提供接口
package com.bruce.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @BelongsProject: springcloud-alibaba-nacos
* @BelongsPackage: com.bruce.controller
* @CreateTime: 2021-02-18 13:37
* @Description: 生产者——>商品服务
*/
@Slf4j
@RestController
public class ProductController {
@Value("${server.port}")
private String port;
@GetMapping("/getProductMsg")
public String getProductMsg() {
log.info("开始调用商品服务信息啦");
return "我是商品服务, 调用商品服务接口成功了===>> : " + port;
}
}
3.2.Order消费商品的接口(3种方式)
package com.bruce.controller;
/**
* @BelongsProject: springcloud-alibaba-nacos
* @BelongsPackage: com.bruce.controller
* @CreateTime: 2021-02-18 13:47
* @Description: TODO
*/
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.List;
/**
* @desc: 消费者——>订单服务
* @author: cao_wencao
* @date: 2020-04-17 20:58
*/
@Slf4j
@RestController
public class OrderController {
@Autowired(required = false)
private RestTemplate restTemplate;
@Autowired
private LoadBalancerClient loadBalancerClient;
@Autowired
private DiscoveryClient discoveryClient;
//方式一 :通过IP地址
@GetMapping("/getProductMsg")
public String getProductMsg() {
String url = "http://127.0.0.1:8715/getProductMsg";
String response = restTemplate.getForObject(url, String.class);
log.info("response==>: {}",response);
return response;
}
//方式二 :通过服务名(这种方式不可行,在Eureka中可以)
@GetMapping("/getProductMsg2")
public String getProductMsg2() {
String url = "http://nacos-product/getProductMsg";
String response = restTemplate.getForObject(url, String.class);
log.info("response==>: {}",response);
return response;
}
//方式三 :通过LoadBalancerClient获取服务调用地址进行调用
@GetMapping("/getProductMsg3")
public String getProductMsg3() {
//discoveryClient.getInstances()
ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-product");
String url = String.format("http://%s:%s", serviceInstance.getHost(), serviceInstance.getPort() + "/getProductMsg");
String response = restTemplate.getForObject(url, String.class);
log.info("response结果==>>>: {}", response);
return response;
}
//方式四 :通过LoadBalancerClient获取服务调用地址进行调用
@GetMapping("/getProductMsg4")
public String getProductMsg4() {
List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("nacos-product");
//任意选择一个,实现本地RPC调用
ServiceInstance serviceInstance = serviceInstanceList.get(0);
String response = restTemplate.getForObject(serviceInstance.getUri()+ "/getProductMsg", String.class);
log.info("response结果==>>>: {}", response);
return response;
}
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
4.基于RestTemplate测试
使用nacos做注册中心时,服务消费有两大类,一类是RestTemplate,另一类是Feign客户端,其中RestTemplate具体实现服务消费有3种方式
启动项目,先观察nacos控制台,发现服务都注册上去了
- 通过IP地址调用: http://127.0.0.1:8710/getProductMsg
- 通过LoadBalancerClient获取服务调用地址进行调用: http://127.0.0.1:8710/getProductMsg3
- 通过DiscoveryClient获取服务调用地址进行调用: http://127.0.0.1:8710/getProductMsg4