SpringCloud(Alibaba版)Nacos注册中心

一、Nacos简介

为什么叫Nacos?

  前四个字母分别为 Naming 和 Configuration 的前两个字母,最后的 s 为 Service。所以组成 N A C O S

是什么?

  Nacos 是一个易于构建云原生应用的动态服务发现,配置管理和服务管理平台。使用 Spring Cloud Alibaba Nacos Discovery,你可以基于 Spring Cloud 的编程模型快速访问 Nacos 服务注册功能。

  • Nacos:Dynamic Naming and Configuration Service。

  • Nacos:其实就是 Eureka 服务注册中心 + Config 服务配置中心的组合。

 

二、安装并运行Nacos

去哪下载?

  先访问 Nacos 的 GitHub 地址:https://github.com/alibaba/Nacos,找到 http://nacos.io 链接进入 Nacos 官网:

进入 Nacos 官网后,然后单击 Release Note of V1.2.0 版本:

最后进入到 1.2.0 下载页面:https://github.com/alibaba/nacos/releases/tag/1.2.0,在 Assets 菜单下有个 nacos-server-1.2.0.zip 下载就 OK 了(tar.gz 是linux版本,zip 是windows版本)。

运行Nacos:

  解压 Nacos 安装包成功后,找到自己下载 Nacos 服务的 bin 目录,有个 startup.cmd 命令,鼠标双击启动即可运行:

此时,一个标准的单机模式 Nacos 服务就启动成功了,Nacos 默认 Tomcat 端口号为 8848。看到 8848 这个数字,不由自主的让我想起很早以前打广告牛逼的 8848 钛金手机,吐槽一波!!!

如何验证是否运行成功呢?

  很简单,命令运行成功后直接访问http://localhost:8848/nacos/,进入到 Nacos 网站首页管理界面,看到有 Nacos Logo 这个界面之后,就代表你的 Nacos 服务没有任何问题了,这样界面有点类似于平时我们做项目的后台管理页面。

我使用的是 1.2.0 版本,不需要进入 Nacos 登录页面就可以进行使用。这时不管点哪个菜单都没有数据显示!

 

三、基于Nacos的服务提供者

1)build.gradle项目依赖

创建gradle模块provider-nacos并添加web、actuator监控与alibaba-nacos-discovery依赖

dependencies {
   compile group: 'org.springframework.boot', name: 'spring-boot-starter-web'

   compile group: 'org.springframework.boot', name: 'spring-boot-starter-actuator'

   compile group: 'com.alibaba.cloud', name: 'spring-cloud-starter-alibaba-nacos-discovery', version: '2.1.0.RELEASE'
}

2)application.yaml配置文件

server:
  port: 8081
spring:
  application:
    name: provider-nacos
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848 #指定Nacos服务地址
management:
  endpoints:
    web:
      exposure:
        include: '*'
View Code

3)启动类ProviderNacosApplication.java

启动类添加@EnableDiscoveryClient注解,将Spring Boot应用程序注册服务至 Nacos。

package org.wesson.cloudalibaba.nacos;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@EnableDiscoveryClient
@SpringBootApplication
public class ProviderNacosApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProviderNacosApplication.class, args);
    }

}
View Code

4)Controller

package org.wesson.cloudalibaba.nacos.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/client")
public class ProviderNacosController {

    @Value("${server.port}")
    private String serverPort;

    @GetMapping("/info")
    public String info() {
        return "hello, nacos registry center serverPort:" + serverPort;
    }

}
View Code

5)测试

Step1:上述已经成功启动 Nacos 服务了

Step2:直接运行 provider-nacos 启动类,端口为8081

Step3:先访问http://localhost:8081/client/info,输出结果如下:

  • hello, nacos registry center serverPort:8081

Step4:然后访问http://localhost:8848/nacos,找到服务管理下的服务列表,就能够看到一个服务名为 provider-nacos 的应用程序注册至 Nacos 服务管理页面了:

此时,Nacos 服务注册中心 + 服务提供者构建成功了。

 

四、基于Nacos的服务消费者

1)build.gradle项目依赖

创建gradle模块consumer-nacos并添加web、actuator监控与alibaba-nacos-discovery依赖

dependencies {
   compile group: 'org.springframework.boot', name: 'spring-boot-starter-web'

   compile group: 'org.springframework.boot', name: 'spring-boot-starter-actuator'

   compile group: 'com.alibaba.cloud', name: 'spring-cloud-starter-alibaba-nacos-discovery', version: '2.1.0.RELEASE'
}

2)application.yaml配置文件

server:
  port: 8000
spring:
  application:
    name: consumer-nacos
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848 #指定Nacos服务地址
management:
  endpoints:
    web:
      exposure:
        include: '*'
service-url:
  provider-nacos: http://provider-nacos #消费者将要去访问的微服务名称(注册进Nacos的微服务提供者)
View Code

3)启动类ConsumerNacosApplication.java

package org.wesson.cloudalibaba.nacos;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@EnableDiscoveryClient
@SpringBootApplication
public class ConsumerNacosApplication {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    public static void main(String[] args) {
        SpringApplication.run(ConsumerNacosApplication.class, args);
    }

}
View Code

4)Controller

package org.wesson.cloudalibaba.nacos.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
@RequestMapping("/client")
public class ConsumerNacosController {

    private static final Logger LOGGER = LoggerFactory.getLogger(ConsumerNacosController.class);

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @Value("${service-url.provider-nacos}")
    private String consumerServiceUrl;

    @GetMapping("/info")
    public String info() {
        // getForObject方法
        return restTemplate.getForObject(consumerServiceUrl + "/client/info", String.class);
    }

    @GetMapping("/log-info-instance")
    public void logInfo() {
        ServiceInstance serviceInstance = this.loadBalancerClient.choose("provider-nacos");
        // 打印当前选择的是哪个节点
        ConsumerNacosController.LOGGER.info("{}:{}:{}", serviceInstance.getServiceId(),
                serviceInstance.getHost(), serviceInstance.getPort());
    }

}
View Code

5)测试

Step1:上述已经成功启动 Nacos 服务了

Step2:运行 provider-nacos 启动类2个实例,端口为8081、8082

Step3:运行 consumer-nacos 启动类,端口为8000

Step4:多次访问http://localhost:8000/client/info,返回结果如下:

  • hello, nacos registry center serverPort:8081

Step5:多次访问http://localhost:8000/client/log-info-instance,控制台会打印如下日志信息:

Step6:最后回到访问http://localhost:8848/nacos管理平台,我们能够看到服务提供者有两个实例数,而服务消费者有一个实例数,都注册至 Nacos 服务管理页面了:

6)为什么Nacos支持负载均衡?

  因为阿里后面技术整合的非常好,Spring Cloud Alibaba 技术会吸收前面 Spring Cloud Netflix 技术的优点,所以天生默认自带负载均衡功能。我们打开 IDEA 找到最右侧 Gradle 依赖:

只要是使用过 Netflix Ribbon 都清楚,第一支持负载均衡(Load Balance),第二可以调用 RestTemplate,进行REST风格远程调用。

 

猜你喜欢

转载自www.cnblogs.com/wessonshin/p/12622335.html