springcloud连接nacos时设置账户和密码_Code

一、Nacos Discovery简介

为什么叫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 服务配置中心 + Bus消息总线的组合。

 

二、安装并运行Nacos

去哪下载?

https://github.com/alibaba/Nacos,找到 http://nacos.io 链接进入 Nacos 官网:

springcloud连接nacos时设置账户和密码_spring_02

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

springcloud连接nacos时设置账户和密码_ide_03

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

springcloud连接nacos时设置账户和密码_ide_04

运行Nacos:

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

springcloud连接nacos时设置账户和密码_Code_05

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

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

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

springcloud连接nacos时设置账户和密码_spring_06

我使用的是 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配置文件

springcloud连接nacos时设置账户和密码_ide_07

springcloud连接nacos时设置账户和密码_ide_08

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

注意:如果不想使用 Nacos 服务注册和发现功能,则 properties 配置文件中设置 spring.cloud.nacos.discoveryfalse。或者使用 yaml 格式:

springcloud连接nacos时设置账户和密码_ide_07

springcloud连接nacos时设置账户和密码_ide_08

spring:
  cloud:
    nacos:
      discovery: false

View Code

3)启动类ProviderNacosApplication.java

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

springcloud连接nacos时设置账户和密码_ide_07

springcloud连接nacos时设置账户和密码_ide_08

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

springcloud连接nacos时设置账户和密码_ide_07

springcloud连接nacos时设置账户和密码_ide_08

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 服务管理页面了:

springcloud连接nacos时设置账户和密码_Code_15

此时,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配置文件

springcloud连接nacos时设置账户和密码_ide_07

springcloud连接nacos时设置账户和密码_ide_08

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

通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能。给 RestTemplate 实例添加 @LoadBalanced 注解,开启 @LoadBalanced 与 Ribbon 的集成:

springcloud连接nacos时设置账户和密码_ide_07

springcloud连接nacos时设置账户和密码_ide_08

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 {

    // 实例化一个RestTemplate Bean
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

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

}

View Code

4)Controller

springcloud连接nacos时设置账户和密码_ide_07

springcloud连接nacos时设置账户和密码_ide_08

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,控制台会打印如下日志信息:

springcloud连接nacos时设置账户和密码_Code_22

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

springcloud连接nacos时设置账户和密码_spring_23

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

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

springcloud连接nacos时设置账户和密码_spring_24

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