springcloud -nacos注册中心实战

一、nacos 功能简介

1.1.什么是Nacos?

官方简介:一个更易于构建云原生应用的动态服务发现(Nacos Discovery )、服务配置(Nacos Config)和服务管理平台。

Nacos的关键特性包括:

  • 服务发现和服务健康监测
  • 动态配置服务
  • 动态DNS服务
  • 服务及其元数据管理

1.2 Nacos的核心功能:

  • 服务注册:Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务,提供自身的元数据,比如ip地址、端口等信息。Nacos Server接收到注册请求后,就会把这些元数据信息存储在一个双层的内存Map中。
  • 服务心跳:在服务注册后,Nacos Client会维护一个定时心跳来持续通知Nacos Server,说明服务一直处于可用状态,防止被剔除。默认5s发送一次心跳。
  • 服务同步:Nacos Server集群之间会互相同步服务实例,用来保证服务信息的一致性。
  • 服务发现:服务消费者(Nacos Client)在调用服务提供者的服务时,会发送一个REST请求给Nacos Server,获取上面注册的服务清单,并且缓存在Nacos Client本地,同时会在Nacos Client本地开启一个定时任务定时拉取服务端最新的注册表信息更新到本地缓存。
  • 服务健康检查:Nacos Server会开启一个定时任务用来检查注册服务实例的健康情况,对于超过15s没有收到客户端心跳的实例会将它的healthy属性置为false(客户端服务发现时不会发现),如果某个实例超过30秒没有收到心跳,直接剔除该实例(被剔除的实例如果恢复发送心跳则会重新注册)。

二、2.Nacos Server 单机部署配置

官方部署文档
https://www.nacos.io/zh-cn/docs/next/v2/guide/admin/deployment

2.1. 相关文件

安装包下载地址:https://github.com/alibaba/Nacos/releases
官方文档: https://nacos.io/zh-cn/docs/deployment.html
版本关系说明: https://github.com/alibaba/spring-cloud-alibaba/wiki/版本说明

  1. Nacos单机部署
    下载 nacos-server-2.3.0.tar.gz, 单机部署
unzip nacos-server-$version.zip 或者 tar -xvf nacos-server-$version.tar.gz
cd nacos/bin
sh startup.sh -m standalone

2.2. 配置流程

修改bin/startup.cmd文件信息,默认是集群模式,需修改为单机模式
在这里插入图片描述
启动成功页面
在这里插入图片描述
登录页面(默认用户名,密码:nacos)
在这里插入图片描述

2.3 Nacos Server 配置文件修改

官方文档配置参数
https://www.nacos.io/zh-cn/docs/next/v2/guide/admin/system-configurations

2.3.1 可选操作:端口修改,数据源设置—>config/application.properties文件

在这里插入图片描述

2.3.2 通过数据库方式集成 sql文件位置

在这里插入图片描述

三、服务端部署

1. 引入pom文件

  <!-- pom必须引入actuator,所有需要被监控的服务都要引入actuator-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>

2. 启动类上添加@EnableDiscoveryClient注解,此注解可以省略


@SpringBootApplication
@EnableDiscoveryClient
public class InuranceManageApplication {
    public static void main(String[] args) {
        SpringApplication.run(InuranceManageApplication.class, args);

    }
}

3. yml配置文件中配置nacos注册中心地址

server:
  port: 8005
  servlet:
    context-path: /insurance
spring:
  application:
    name: insurance-name
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

4. 启动insurance-nmanager服务,nacos管理端界面查看insurance-nmanager是否注册成功

在这里插入图片描述

5.nacos 开启鉴权服务

nacos 在未开启鉴权的情况下直接输入nacso访问地址即可访问nacos 管理界面,存在安全问题,因此需要开启nacos鉴权;

5.1 nacos开启鉴权

nacos开启密码验证,需要修改nacos目录下配置文件: conf/application.properties。

5.1.1开启鉴权

nacos.core.auth.enabled:是否开启鉴权功能。
nacos.core.auth.server.identity.key:配置自定义身份识别的key。
nacos.core.auth.server.identity.value:配置自定义身份识别的value。
nacos.core.auth.plugin.nacos.token.secret.key:默认鉴权插件用于生成用户登陆临时accessToken所使用的密钥。

注意 配置自定义身份识别的key(不可为空)和value(不可为空),
所有集群均需要配置相同的server.identity信息,否则可能导致服务端之间数据不一致或无法删除实例等问题。
nacos.core.auth.server.identity.key=example
nacos.core.auth.server.identity.value=example

在这里插入图片描述

在开启nacos 鉴权访问后,再次刷新登录页面发现登录就需要输入用户名、密码;可以输入默认的用户名密码可以登录 nacos/nacos,进去后可以改用户名和密码

在这里插入图片描述
在应用程序启动后会报(type=Forbidden, status=403).

user not found! 无法进行服务注册启动!

5.1.2springboo配置鉴权用户名密码

这时候需要在springboot应用中配置nacos的登录的用户名密码

server:
  port: 8005
  servlet:
    context-path: /insurance
spring:
  application:
    name: insurance-nmanage
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        #登录用户名
        username: nacos
         #登录用户名密码
        password: nacos
        #命名空间
        namespace: 68e11817-64b3-441b-9d7b-8872b81cad05
        #用户组
        group: insurance-dev

配置成功后即可启动成功
在这里插入图片描述
如果需要使用nacos的配置中心的话,在开启鉴权的情况下页可以使用
spring.cloud.nacos.config.username=用户名
spring.cloud.nacos.config.password=密码
配置nacos的配置页面登录用户密码,都是同一个名户名密码

如果注册显示注册成功,Nacos管理界面里服务列表就是看不到注册上去的服务,配置文件也没有成功加载,那么问题出在哪呢?

进入 Nacos 管理界面。 进入 【空间命名】 菜单,检查【命名空间id】是否和配置
spring.cloud.nacos.discovery.namespace 以及
spring.cloud.nacos.config.namespace 一致。
修改配置或者重新创建正确的命名空间,注意命名空间id。如果出现以下日志,说明从nacos加载配置文件成功:

目前测试开启权限后,注册中心配置在bootstrap.yml文件中,启动会报错,会获取不到服务实例列表报403
,找不到用户,在注册中心服务列表中看不到注册成功的服务列表;

创建命名空间
在这里插入图片描述

注册成功后
在这里插入图片描述

四、SDK 接口实战

4.1 将服务地址信息注册到Nacos Server中

4.1.1 作用

将服务地址信息注册到Nacos Server中

4.1.2 调用API

API:/nacos/v1/ns/instance (POST)

void registerInstance(String serviceName , String ip , int port) throws NacosException;
 
void registerInstance(String serviceName, String ip,int port,String clusterName) throws NacosException;
 
void registerInstance(String serviceName,Instance instance) throws NacosException;

serviceName:服务名称,相当于配置文件中的spring.application.name
ip:服务实例ip
port:服务实例port
clusterName:集群名称,标识当前服务实例属于哪个集群
instance:实例属性,其实就是把上面的参数封装成一个对象

4.1.3 接口调用方式实战

package product.inurance.manage.web;

import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.PropertyKeyConst;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingFactory;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.pojo.Instance;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import sun.security.pkcs11.wrapper.Constants;

import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

@RestController
@RequestMapping("/manage")
@Slf4j
public class InuranceManageController {

    @RequestMapping("/register/instance")
    public String RegisterManage(){
        NamingService naming= null;
        try {
            //客户端简单鉴权实现或者采用阿里阿里云鉴权实现
            Properties properties = clientAuthSimple();
            //实例信息
            Instance instance = new Instance();
            //实例IP,提供给消费者进行通信的地址
            instance.setIp("127.0.0.1");
            //端口,提供给消费者访问的端口
            instance.setPort(8005);
            //权重,当前实例的权限,浮点类型(默认1.0D)
            instance.setWeight(2);
            Map<String, String> map = new HashMap<String, String>();
          /*  //netType:网络类型,这里设置的值为external(外网)
            map.put("netType", "external");
            //version Nacos版本,这里为2.0
            map.put("version", "2.0");
            instance.setMetadata(map);*/

            //关键代码 创建自己的实例
            NamingService namingService = NacosFactory.createNamingService(properties);
            namingService.registerInstance("inuraceManage.manage.test", "insurance-dev", instance);

           // naming.registerInstance("nacos_name","192.168.80.1",8080,"DEFAULT");
        } catch (NacosException e) {
           log.error(e.getMessage(),e);
        }
        return "success";
    }


    /**
     *  //客户端简单鉴权实现
     * @return
     */
    private Properties clientAuthSimple() {
        //Nacos Server连接信息
        Properties properties = new Properties();
        //Nacos服务器地址
        properties.put(PropertyKeyConst.SERVER_ADDR, "127.0.0.1:8848");
        //连接Nacos服务的用户名
        properties.put(PropertyKeyConst.USERNAME, "nacos");
        //连接Nacos服务的密码
        properties.put(PropertyKeyConst.PASSWORD, "nacos");

        properties.put(PropertyKeyConst.NAMESPACE, "68e11817-64b3-441b-9d7b-8872b81cad05");
        return properties;
    }

    /**
     *  阿里云方式鉴权
     * @return
     */
    private Properties clientAuthAlibab() {
        //Nacos Server连接信息
        Properties properties = new Properties();
        //Nacos服务器地址
        properties.put(PropertyKeyConst.SERVER_ADDR, "127.0.0.1:8848");
        //连接Nacos服务的用户名
        properties.put(PropertyKeyConst.ACCESS_KEY, "nacos");
        //连接Nacos服务的密码
        properties.put(PropertyKeyConst.SECRET_KEY, "nacos");
        properties.put(PropertyKeyConst.NAMESPACE, "68e11817-64b3-441b-9d7b-8872b81cad05");
        return properties;
    }
}

NamingService naming=NamingFactory.createNamingService(System.getProperty("serveAddr"));
naming.registerInstance("nacos_name","192.168.80.1",8080,"DEFAULT");

注册成功后

在这里插入图片描述
如果在注册的时候不指定group,则出现结果2

 namingService.registerInstance("inuraceManage.manage.test", instance);

4.1.4 实例信息详解

  1. Nacos Server连接信息:

从上述中我们可以看到有关于Nacos Server连接信息是存储在Properties中,

  • Server地址:Nacos服务器地址,属性的key为serverAddr;
  • 用户名:连接Nacos服务的用户名,属性key为username,默认值为nacos;
  • 密码:连接Nacos服务的密码,属性key为password,默认值为nacos;

实例信息:从上述测试中我们可以看到注册实例信息用instance进行承载,而实例信息又分为两部分,一个是基础实例信息,一个是元数据信息

  1. 实例基础信息:
  • instanceId:实例的唯一ID;
  • ip:实例IP,提供给消费者进行通信的地址;
  • port: 端口,提供给消费者访问的端口;
  • weight:权重,当前实例的权限,浮点类型(默认1.0D);
  • healthy:健康状况,默认true;
  • enabled:实例是否准备好接收请求,默认true;
  • ephemeral:实例是否为瞬时的,默认为true;
  • clusterName:实例所属的集群名称;
  • serviceName:实例的服务信息;
  1. 元数据
    元数据类型为HashMap,从当前Demo我们能够看到的数据只有两个
  • netType:网络类型,这里设置的值为external(外网)
  • version Nacos版本,这里为2.0
4.1.4.1 Instance类中还可以看到一些默认信息
  //心跳间隙的key,默认为5s,也就是默认5秒进行一次心跳
    public long getInstanceHeartBeatInterval() {
        return getMetaDataByKeyWithDefault(PreservedMetadataKeys.HEART_BEAT_INTERVAL,
                Constants.DEFAULT_HEART_BEAT_INTERVAL);
    }

    //心跳超时的key,默认为15s,也就是默认15秒收不到心跳,实例将会标记为不健康;
    public long getInstanceHeartBeatTimeOut() {
        return getMetaDataByKeyWithDefault(PreservedMetadataKeys.HEART_BEAT_TIMEOUT,
                Constants.DEFAULT_HEART_BEAT_TIMEOUT);
    }

    //实例IP被删除的key,默认为30s,也就是30秒收不到心跳,实例将会被移除;
    public long getIpDeleteTimeout() {
        return getMetaDataByKeyWithDefault(PreservedMetadataKeys.IP_DELETE_TIMEOUT,
                Constants.DEFAULT_IP_DELETE_TIMEOUT);
    }

    //实例ID生成器key,默认为simple;
    public String getInstanceIdGenerator() {
        return getMetaDataByKeyWithDefault(PreservedMetadataKeys.INSTANCE_ID_GENERATOR,
                Constants.DEFAULT_INSTANCE_ID_GENERATOR);
    }

为什么要说这个呢?从这些参数中我们就可以了解到,我们服务的心跳间隙是多少以及超时时间,传递什么参数配置什么参数,以此来了解我们的实例是否健康。同时我们也可以看到一个比较关键且核心的类,是真正创建实例的类 ——NamingService

4.1.4.1 NamingService

NamingService是Nacos对外提供的一个统一的接口,当我们点进去查看,可以看到大概一下几个方法,这些方法提供了不同的重载方法,方便我们用于不同的场景。

//服务实例注册
void registerInstance(...) throws NacosException;

//服务实例注销
void deregisterInstance(...) throws NacosException;

//获取服务实例列表
List<Instance> getAllInstances(...) throws NacosException;

//查询健康服务实例
List<Instance> selectInstances(...) throws NacosException;

//查询集群中健康的服务实例
List<Instance> selectInstances(....List<String> clusters....)throws NacosException;

//使用负载均衡策略选择一个健康的服务实例
Instance selectOneHealthyInstance(...) throws NacosException;

//订阅服务事件
void subscribe(...) throws NacosException;

//取消订阅服务事件
void unsubscribe(...) throws NacosException;

//获取所有(或指定)服务名称
ListView<String> getServicesOfServer(...) throws NacosException;

//获取所有订阅的服务
List<ServiceInfo> getSubscribeServices() throws NacosException;
 
//获取Nacos服务的状态
String getServerStatus();
 
//主动关闭服务
void shutDown() throws NacosException;

详见:https://www.cnblogs.com/mingyueyy/p/16226792.html

五、OpeAPI

官方API接口文档

https://nacos.io/zh-cn/docs/open-api.html

https://www.nacos.io/zh-cn/docs/next/v2/guide/user/open-api

5.1 未开启鉴权时,控制台不需要登录

获取配置的OpenAPI如下:

v1版本的API:
curl -X GET 'http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.example&group=com.alibaba.nacos'
v2版本的API(推荐):
curl -X GET 'http://127.0.0.1:8848/nacos/v2/cs/config?dataId=nacos.example&group=DEFAULT_GROUP&namespaceId=public'

如果curl 的错误如ip、password等属性无法识别的时候,将网址的单引号改成双引号后正常运行

5.2 开启鉴权

使用nacos鉴权插件
修改application.properties中的配置信息为:

### If turn on auth system:
nacos.core.auth.system.type=nacos
nacos.core.auth.enabled=true
nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789

文档中提供的密钥为公开密钥,在实际部署时请更换为其他密钥内容,防止密钥泄漏导致安全风险。
在2.2.0.1版本后,社区发布版本将移除以文档如下值作为默认值,需要自行填充,否则无法启动节点。
密钥需要保持节点间一致,长时间不一致可能导致403 invalid token错误。
鉴权开关是修改之后立马生效的,不需要重启服务端。上面的token.secret.key是攻动态修改token.secret.key时,请确保token是有效的,如果修改成无效值,会导致后续无法登录,请求访问异常

5.4 开启Token缓存功能

无论是客户端SDK还是OpenAPI,在调用login接口获取accessToken之后,携带accessToken访问服务端,服务端解析Token进行鉴权。解析的动作比较耗时,如果想要提升接口的性能,可以考虑开启缓存Token的功能,用字符串比较代替Token解析。

开启方式:

nacos.core.auth.plugin.nacos.token.cache.enable=true

5.5 开启服务身份识别功能

开启鉴权功能后,服务端之间的请求也会通过鉴权系统的影响。考虑到服务端之间的通信应该是可信的,因此在1.2~1.4.0版本期间,通过User-Agent中是否包含Nacos-Server来进行判断请求是否来自其他服务端。

但这种实现由于过于简单且固定,导致可能存在安全问题。因此从1.4.1版本开始,Nacos添加服务身份识别功能,用户可以自行配置服务端的Identity,不再使用User-Agent作为服务端请求的判断标准。

### 开启鉴权
nacos.core.auth.enabled=true

### 关闭使用user-agent判断服务端请求并放行鉴权的功能
nacos.core.auth.enable.userAgentAuthWhite=false

### 配置自定义身份识别的key(不可为空)和value(不可为空)
nacos.core.auth.server.identity.key=example
nacos.core.auth.server.identity.value=example

identity.key和identity.value不可为空,可以是任意值。
所有集群均需要配置相同的server.identity信息,否则可能导致服务端之间数据不一致或无法删除实例等问题。
单机模式只需要保证非空即可

5.6. 开启鉴权后获取配置的Open API

首先需要使用用户名和密码登陆nacos。

curl -X POST '127.0.0.1:8848/nacos/v1/auth/login' -d 'username=nacos&password=nacos'

未发现v2版本的login 的API.
若用户名和密码正确,返回信息如下:

{"accessToken":"eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTYwNTYyOTE2Nn0.2TogGhhr11_vLEjqKko1HJHUJEmsPuCxkur-CfNojDo","tokenTtl":18000,"globalAdmin":true}

接下来进行配置信息或服务信息时,应当使用该accessToken鉴权,在url后添加参数accessToken=a c c e s s T o k e n , 其中 {accessToken},其中accessToken,其中{accessToken}为登录时返回的token信息,例如

v1版本的API:
curl -X GET '127.0.0.1:8848/nacos/v1/cs/configs?accessToken=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTYwNTYyMzkyM30.O-s2yWfDSUZ7Svd3Vs7jy9tsfDNHs1SuebJB4KlNY8Q&dataId=nacos.example.1&group=nacos_group'
v2版本的API(推荐):
curl -X GET '127.0.0.1:8848/nacos/v2/cs/config?accessToken=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTYwNTYyMzkyM30.O-s2yWfDSUZ7Svd3Vs7jy9tsfDNHs1SuebJB4KlNY8Q&dataId=nacos.example.1&group=nacos_group'

5.6.1 带上用户名、密码进行openAPI的调用

或者直接带上用户名密码进行OpenAPI 接口的调用

curl -X POST "http://127.0.0.1:8848/nacos/v1/ns/instance?port=8848&healthy=true&ip=11.11.11.11&weight=1.0&serviceName=nacos.test.3&encoding=GBK&namespaceId=68e11817-64b3-441b-9d7b-8872b81cad05" -d     "username=nacos&password=nacos"

在这里插入图片描述
可以看到新的实例
在这里插入图片描述

5.6.2 带上accessToken鉴权进行 openAPI的调用

  1. 进行登录获取accessToken
curl -X POST "127.0.0.1:8848/nacos/v1/auth/login" -d "username=nacos&password=nacos"

返回

{“accessToken”:“eyJhbGciOiJIUzM4NCJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTcxNTg4ODYxOX0.xEGtv5pDGRBgxHvlc8TZOuI4O6FvQFpluwmVmcRM36HVy4QY6wtBTMaVLxLR_4R9”,“tokenTtl”:18000,“globalAdmin”:true,“username”:“nacos”}

2.携带accessToken 进行openAPI的调用

curl -X POST "http://127.0.0.1:8848/nacos/v1/ns/instance?port=8848&healthy=true&ip=11.11.11.11&weight=1.0&serviceName=nacos.test.4&encoding=GBK&namespaceId=68e11817-64b3-441b-9d7b-8872b81cad05&accessToken=eyJhbGciOiJIUzM4NCJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTcxNTg5MDA5MH0._mQhl1YCcMU9a27Q7eY8cBFrrIGlifBWzBBC6q3M75y8_nAa89pb97XlEe0RHzmX"

在这里插入图片描述
调用成功后
在这里插入图片描述

六、 nacos 鉴权插件使用

https://www.nacos.io/zh-cn/docs/next/v2/plugin/auth-plugin

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值