【alibaba-cloud】nacos详解

本文详细介绍了Nacos作为服务注册与发现、配置管理平台的使用方法,包括安装配置、服务注册与发现流程、配置中心功能应用及动态刷新配置等关键操作。通过具体示例展示了如何在Spring Boot项目中整合Nacos,实现服务治理和配置文件的集中管理。

Nacos 支持基于 DNS 和基于 RPC 的服务发现(可以作为springcloud的注册中心)、动态配置服务(可以做配置中心)、动态 DNS 服务。

nacos的安装(windows和liunx的单机和集群)

https://blog.youkuaiyun.com/wangyunzhao007/article/details/106872831

nacos的配置中心

配置中心,顾名思义,就是我们可以把我们的配置都放置在nacos。

启动nacos后,我们输入地址http://127.0.0.1:8848/nacos/,账号和密码都是nacos。

点击配置列表,然后点击右边的加号,我们会看到下图,我们可以吧我们的配置文件写到下图,还可以选择不同的样式。

以yaml为例子,我写了一个简单的配置,data ID的名字不是随便命名的,pro代表profiles.profiles

这样就弄好一个配置了,接下怎么使用呢。

1.引入的pom依赖

        <!--  springboot 整合web组件-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--nacos整合注册中心-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>0.2.2.RELEASE</version>
        </dependency>
        <!--nacos整合config-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>0.2.2.RELEASE</version>
        </dependency>

2.测试接口:这个用到我们刚刚配置好的mayikt.name

package com.mayikt.service;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RefreshScope
@SpringBootApplication
public class NacosController {
    @Value("${mayikt.name}")
    private String userName;

    @RequestMapping("/getConfig")
    public String getConfig() {
        return userName;
    }

}

3.添加启动项

@SpringBootApplication
@RefreshScope  //加上这个注解才能动态的刷新nacos配置文件的值
public class AppNacosClient {
    public static void main(String[] args) {
        SpringApplication.run(AppNacosClient.class);
    }
}

4.写bootstrap.yml

spring:
  application:
    ###服务的名称
    name: mayikt-nacos-client
  cloud:
    nacos:
      discovery:
        ###nacos注册地址
        server-addr: 127.0.0.1:8848
        enabled: true
      config:
        ###配置中心连接地址
        server-addr: 127.0.0.1:8848
        ###分组
        group: DEFAULT_GROUP
        ###类型
        file-extension: yaml
  profiles:
    C: pro

然后调用测试接口:得到了配置文件的信息。

nacos的服务注册和发现

新建一个父工程,下面有两个子工程,

父工程的pom依赖,子工程不需要

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.0.RELEASE</version>
    </parent>

    <dependencies>
        <!--  springboot 整合web组件-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>0.2.2.RELEASE</version>
        </dependency>
    </dependencies>

服务的注册方 member

接口:

@RestController
public class MemberService {
    @Value("${server.port}")
    private String serverPort;

    @GetMapping("/getUser")
    public String getUser(Integer userId){

        return "hello world!端口号为" + serverPort;
    }
}

启动项

@SpringBootApplication
public class MemberApplication {
    public static void main(String[] args) {
        SpringApplication.run(MemberApplication.class);
    }
}

application.yml

spring:
  application:
    ###服务名称
    name: meitemk-member
  cloud:
    nacos:
      discovery:
        ###注册地址
        server-addr: 127.0.0.1:8848
server:
  port: 8081

服务的发现或使用方

接口:不同的获取服务的方法和负载均衡实现
 

package com.mayimk.service;

import com.mayimk.loadbalance.LoadBalancer;
import com.sun.jndi.toolkit.url.Uri;
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.Primary;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.net.URI;
import java.util.List;
@RestController
public class OrderService1 {
    @Autowired
    private DiscoveryClient discoveryClient;

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private LoadBalancer loadBalancer;

    @Autowired
    private LoadBalancerClient loadBalancerClient;
    @RequestMapping("/orderToMeber1")
    public Object orderToMeber(){
        //1.根据服务名称从注册中心获取集群列表地址
        List<ServiceInstance> instances = discoveryClient.getInstances("meitemk-member");
        //2.列表中任意选取一个,实现本地的rpc调用  采用负载均衡算法实现
        ServiceInstance serviceInstance = loadBalancer.getSingleAddres(instances);
        URI recMemberUrl = serviceInstance.getUri();
        String result = restTemplate.getForObject(recMemberUrl +"/getUser", String.class);
        System.out.println(serviceInstance.getPort());
        return "订单调用返回结果:"+ result;
    }

    //使用rabbion实现负载均衡
    @RequestMapping("/orderToRibbonMeber")
    public Object orderToRibbonMeber(){
        String result = restTemplate.getForObject("http://meitemk-member/getUser", String.class);
        return "订单调用返回结果:"+ result;
    }

    /**
     *
     * @return
     */
    //cloud根据服务id实现负载均衡
    @RequestMapping("/loadBalanceClientvMember")
    public Object LoadBalanceClientvMember(){
        ServiceInstance result = loadBalancerClient.choose("meitemk-member");
        return result;
    }
}

本地负载均衡策略需要的代码:

package com.mayimk.loadbalance;

import org.springframework.cloud.client.ServiceInstance;

import java.util.List;

public interface LoadBalancer {

    /**
     * 从注册中心集群列表中获取单个地址
     * @param serviceInstances
     * @return
     */
    ServiceInstance getSingleAddres(List<ServiceInstance> serviceInstances);
}
package com.mayimk.loadbalance;

import org.springframework.cloud.client.ServiceInstance;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

@Component
public class RotationLoadBalancer implements LoadBalancer {
    private AtomicInteger atomicInteger = new AtomicInteger(0);

    @Override
    public ServiceInstance getSingleAddres(List<ServiceInstance> serviceInstances) {
        //从零开始计数
        int index = atomicInteger.incrementAndGet() % serviceInstances.size();
        ServiceInstance serviceInstance = serviceInstances.get(index);
        return serviceInstance;
    }
}

启动项

@SpringBootApplication
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class);
    }

    /**
     * 加上@LoadBalanced,注解就可以实现我们本地的负载均衡
     * @return
     */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

application.yml 

spring:
  application:
    ###服务名称
    name: meitemk-order
  cloud:
    nacos:
      discovery:
        ###注册地址
        server-addr: 127.0.0.1:8848
server:
  port: 8082

 然后我们启动两个子项目,然后修改member的端口号,将member再次启动,就会有两个不同端口号member。

我们可以看到nacos的服务列表中油member的服务实例有两个,然后order也注册到这里,也拉取了服务。我们可以调用order中的接口,接口调用了member中getUser接口,同时使用了负载均衡。

 

测试其中使用了rabbin方式的负载均衡,测试结果如下:

 、

代码资源下载地址:

https://download.youkuaiyun.com/download/wangyunzhao007/12540939

 

 

 

 

 

<think> 我们正在讨论的是Spring Cloud Alibaba Nacos Config客户端连接Nacos Server是否需要配置账号密码的问题。 根据之前的讨论,我们知道Nacos Server可以开启鉴权(通过设置nacos.core.auth.enabled=true),此时客户端需要提供账号密码才能访问配置。 因此,回答这个问题需要分两种情况: 1.Nacos Server未开启鉴权时:客户端不需要配置账号密码。 2.Nacos Server开启鉴权时:客户端必须配置账号密码。 在Spring Cloud Alibaba Nacos Config中,配置账号密码的方式是在bootstrap.yml(或bootstrap.properties)中设置以下属性: spring.cloud.nacos.config.username: 你的用户名 spring.cloud.nacos.config.password: 你的密码 同时,引用[2]中提到,在Nacos 2.4.3版本中,默认是没有初始账号密码的,但开启鉴权后需要设置账号密码(可以通过数据库或者内置的鉴权系统)。 此外,引用[2]还提到了设置生成token的密钥(nacos.core.auth.plugin.nacos.token.secret.key)的配置,这是服务端的配置,与客户端无关。 所以,对于客户端(spring-alibaba-nacos-config)来说,是否需要配置账号密码,完全取决于Nacos服务端是否开启了鉴权。 下面我们详细说明配置方法: 情况一:Nacos服务端未开启鉴权(默认关闭) - 客户端只需配置服务器地址和应用名(服务名)即可,如引用[1]所示: spring: application: name: your-service-name cloud: nacos: server-addr: nacos-ip-addr:8848 情况二:Nacos服务端开启了鉴权(配置了nacos.core.auth.enabled=true) - 客户端除了配置服务器地址,还需要配置用户名和密码,例如: spring: cloud: nacos: server-addr: nacos-ip-addr:8848 username: nacos # 如果使用的是默认账号 password: nacos # 如果使用的是默认密码 # 注意:这里是在config下的配置,如果同时使用nacos作为服务发现,那么服务发现也需要配置用户名密码,属性为spring.cloud.nacos.discovery.username和password 另外,需要注意的是,在Nacos 1.x版本中,默认账号密码是nacos/nacos,但在2.4.3版本中,初始没有账号密码(如引用[2]所述),所以需要先通过其他方式(例如关闭鉴权进入控制台)创建账号,或者通过数据库初始化账号(如引用[2]中配置了数据库连接)。 总结:是否需要配置账号密码取决于Nacos服务端是否开启了鉴权。如果开启,则必须配置;否则,不需要。 下面生成相关问题。 </think>### Spring Cloud Alibaba Nacos Config 连接 Nacos Server 的认证配置详解 #### 是否需要配置账号密码? **取决于 Nacos 服务端是否开启鉴权**: 1. **服务端未开启鉴权**(默认状态) - 客户端**无需配置账号密码** - 连接配置示例: ```yaml spring: cloud: nacos: server-addr: 192.168.1.100:8848 # 仅需地址[^1] ``` 2. **服务端开启鉴权**(生产环境必须) - 客户端**必须配置账号密码** - 连接配置示例: ```yaml spring: cloud: nacos: server-addr: 192.168.1.100:8848 username: nacos # 必须配置 password: nacos # 必须配置 config: namespace: dev # 建议配置命名空间 ``` --- #### 服务端鉴权开启方法(Nacos 2.4.3+) 在 Nacos 的 `conf/application.properties` 中添加: ```properties # 开启鉴权[^2] nacos.core.auth.enabled=true # 设置 JWT 密钥(需≥32位Base64) nacos.core.auth.plugin.nacos.token.secret.key=VGhpc0lzTXlDdXN0b21TZWNyZXRLZXkwMTIzNDU2Nzg= ``` > ⚠️ **安全警告**: > - 必须修改默认密钥 `SecretKey012...`[^2] > - 初始无密码时需关闭鉴权访问控制台创建账号 > - 生成高强度密钥命令: > ```bash > openssl rand -base64 64 | tr -d '=' > ``` --- #### 典型连接失败场景分析 | 现象 | 原因 | 解决方案 | |------|------|----------| | `403 Forbidden` | 服务端开启鉴权但客户端未配账号 | 添加 `username/password` 配置 | | `401 Unauthorized` | 客户端密码错误/密钥不匹配 | 检查服务端密钥与客户端密码 | | 控制台无法登录 | 新版本无初始密码[^2] | 关闭鉴权访问 → 创建账号 → 重新开启鉴权 | --- ### 配置最佳实践 ```yaml spring: application: name: order-service # 服务名[^1] cloud: nacos: server-addr: nacos-prod.example.com:8848 username: ${NACOS_USER} # 建议使用环境变量 password: ${NACOS_PWD} # 避免密码硬编码 config: namespace: production # 隔离环境 file-extension: yaml # 配置格式 ``` --- ### 相关问题 1. 如何为 Nacos 生产环境生成安全的 JWT 签名密钥? 2. 在 Kubernetes 中如何安全地管理 Nacos 客户端密码? 3. Nacos 客户端连接失败时如何进行分层排查? 4. 如何为不同环境(开发/测试/生产)配置独立的 Nacos 命名空间? 5. Spring Cloud Alibaba 2022.x 版本中 Nacos 认证配置有哪些变化? [^1]: 基础连接仅需配置 `server-addr` 和 `application.name` [^2]: 需开启鉴权并设置强密码和
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值