# Nacos 注册中心

# 官网地址 (opens new window)

# 简介

所有提供者将自己提供服务的名称及自己主机详情(IP、端口、版本等)写入到另一台主机中的一个列表中,这台主机称为服务注册中心,而这个表称为服务注册表。

所有消费者需要调用微服务时,其会从注册中心首先将服务注册表下载到本地,然后根据消费者本地设置好的负载均衡策略选择一个服务提供者进行调用。这个过程称为服务发现。

可以充当Spring Cloud服务注册中心的服务器很多,如Zookeeper、.Eureka、Consul等。Spring Cloud Alibaba中使用的注册中心为Alibaba的中间件Nacos。

# 服务注册

  1. 添加依赖
    注意依赖,前面的cloud依赖,这个不需要版本是因为前面的Cloud 父工程里面指定了
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  1. 配置
spring:
  application:
    name: provider-8081
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

# 服务调用

在开篇简单的服务之间调用,是通过RestTemplate进行服务之间简单的调用,弊端就是不宜维护和服务之间的联系
在这种情况下使用 Nacos 将服务注册,并通过注册的 Nacos 服务名来调用,实现负载均衡

代码还是简单的调用,只是增加了 Nacos 不以写死的地址调用而是通过服务名

  1. 配置
  • 在配置RestTemplate上增加 @LoadBalanced 达到负载均衡的作用
@Configuration
public class WebConfig {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

  • 新版的完全摒弃了 Ribbon,需要增加负载均衡的依赖,不增加的话调用会报错
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
  1. 服务调用
    将写死的地址改为服务名
@RestController
@RequestMapping("/consumer")
@AllArgsConstructor
public class ConsumerController {

    private final RestTemplate restTemplate;
    @GetMapping
    public Depart getObject() {
        //原先的是 localhost:8081 现在是 provider-8081 
        Depart forObject = restTemplate.getForObject("http://provider-8081/depart/1", Depart.class);
        return forObject;
    }
}