Linux部署Nacos

此处演示Nacos在Linux(CentOS7)环境中单机版部署,此处演示1.3.0版本。

一、官网下载压缩包

https://github.com/alibaba/nacos/releases 在这里插入图片描述

二、解压压缩包

nacos-server-1.3.0.tar.gz上传到服务器的自定义目录中,并执行解压命令

tar -zxvf /xxxx/xxxx/xxxx/nacos-server-1.3.0.tar.gz

在这里插入图片描述

三、创建Nacos数据库

  • 注意nacos1.3.1以下版本不支持mysql8

  • 压缩包中sql脚本路径 /nacos/conf/nacos-mysql.sql

自己手动去创建nacos数据库,并执行官网的sql脚本建库建表

# 查看nacos-mysql.sql的表结构
cat /xxxx/xxxx/xxxx/nacos/conf/nacos-mysql.sql

建议直接下载脚本到数据库中执行。 在这里插入图片描述

四、 修改Nacos的配置文件

打开配置项比编辑mysql配置

# 修改Nacos服务的数据库连接
vim /xxxx/xxxx/xxxx/nacos/conf/application.properties

在这里插入图片描述

五、启动Nacos

# 进去bin目录
cd /xxxx/xxxx/xxxx/nacos/bin

# 执行单机版启动命令
# ubuntu采用
bash /xxx/xxx/xxx/bin/startup.sh -m standalone
# linux的其他发行版采用
# sh /xxx/xxx/xxx/bin/startup.sh -m standalone

启动后可查看/xxx/xxx/nacos/logs/nacos.log文件 在这里插入图片描述

六、访问Nacos

建表时系统会添加一个默认账号 账号 nacos 密码 nacos

# 启动后访问自己ip
http://localhost:8848/nacos

在这里插入图片描述

七、常见异常处理(参考)

7.1 启动异常

原因jdk配置路径异常 在这里插入图片描述 解决方法:nacos启动脚本编辑jdk的安装目录

# 查看jdk安装目录
whereis java

# 编辑启动脚本startup.sh
# 注意JAVA_HOME目录一定要到jdk的安装根目录中,并且后缀不能添加多余的"/"
vim /xxx/xxx/xxx/bin/startup.sh

在这里插入图片描述 在这里插入图片描述


简介 从spring开始,所有的配置文件都放在项目中,如果需要修改配置文件内容,则需要登陆服务器重启服务。想象一下如果你有一百台服务的需要修改,那是不可想象的工作量。

目前已有的配置中心

携程开源的Apollo:数据保存在mysql中,支持命名空间和分发更新配置 springcloud 中的springcloud config:必须使用git保存配置信息 阿里的开源Nacos 其他项目未关注 最次的就是springcloud config 必须从git,svn才能更新

Nacos 有三大主要功能:

服务发现和服务健康监测 Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO 或HTTP&API查找和发现服务。 Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。

动态配置服务 动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。 动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。 配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。 Nacos 提供了一个简洁易用的UI (控制台样例 Demo) 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。

动态 DNS 服务 动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以 DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。 Nacos 提供了一些简单的 DNS APIs TODO 帮助您管理服务的关联域名和可用的 IP:PORT 列表.

服务及其元数据管理 Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。

在这里插入图片描述

Nacos 确实是极易上手,几乎免安装,只需要简单的解压包, 启动 server 即可,它除了提供配置中心还提供注册中心的作用,可以替代Eureka。 不足。但是官方特别强调了 Nacos v0.8.0 Production Ready 之前不建议在生产上大规模使用,建议使用之后版本在稳定性上要高很多。 Spring Cloud支持使用Eureka、Zookeeper、Consul实现服务发现的能力。Eureka 是其默认的也是推荐的服务注册中心组件。但从Eureka切换成Zookeeper、consul只需要改个依赖,加两行配置就可以了。

辟谣 Eureka没有闭源,是Eurkea 2.x分支不再维护! Spring Cloud并不强依赖Eureka,不要过分解读

简单入门 官方demo https://github.com/nacos-group/nacos-examples/blob/master/nacos-spring-boot-example 官方git上是有它的demo的,我这里有写了一下 本文配置中心demo源码如下: https://github.com/BambooZhang/springboot-study.git

服务中心安装和启动 1.JDK环境 2.直接去官网git上下载 tar.gz或者zip格式到本地。 https://github.com/alibaba/nacos

windows安装方式 解压后,直接双击starup.bat

centos

 unzip nacos-server-$version.zip 或者 tar -xvf nacos-server-$version.tar.gz
cd nacos/bin
#启动
sh startup.sh -m standalone

启动成功后 访问http://localhost:8848/nacos/index.html即可看到如下管理界面

springboot客户端

新建一个springboot工程,我这里直接拷贝了一个springboot项目,修改文件名和工程名以及pom

pom如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>springboot</groupId>
  <artifactId>springboot-nacos</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>springboot-nacos :: 整合 nacos配置中心</name>

  <!-- Spring Boot 启动父依赖 -->
  <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.0.3.RELEASE</version>
  </parent>

  <properties>
      <nacos-config-spring-boot.version>0.2.1</nacos-config-spring-boot.version>
  </properties>

  <dependencies>

      <!-- Spring Boot Web 依赖 -->
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
      </dependency>

      <!-- Spring Boot Test 依赖 -->
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-test</artifactId>
          <scope>test</scope>
      </dependency>


      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-actuator</artifactId>
      </dependency>

      <!-- nacos 依赖 -->
      <dependency>
          <groupId>com.alibaba.boot</groupId>
          <artifactId>nacos-config-spring-boot-starter</artifactId>
          <version>${nacos-config-spring-boot.version}</version>
      </dependency>


      <!-- Junit -->
      <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.12</version>
      </dependency>
  </dependencies>
</project>
package org.spring.springboot;

import com.alibaba.nacos.api.config.annotation.NacosValue;
import com.alibaba.nacos.spring.context.annotation.config.NacosPropertySource;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import static org.springframework.web.bind.annotation.RequestMethod.GET;

/**
* Spring Boot 应用启动类
*
* Created by bambo on 19/2/7.
*/
// Spring Boot 应用的标识
@SpringBootApplication
@RestController
@NacosPropertySource(dataId = "bamboo.test", autoRefreshed = true)
public class Application {

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

   @NacosValue(value = "${service.name:1}", autoRefreshed = true)
   private String serverName;

   @RequestMapping(value = "/test", method = GET)
   @ResponseBody
   public String get() {
       return serverName;
  }


}

配置文件 application.properties

nacos.config.server-addr=127.0.0.1:8848

配置中心配置

这里直接配置管理新增,注意默认group不变哦

在这里插入图片描述

保存发布,然后启动springboot服务,访问http://localhost:8080/test可以看到结果如下,说明成功了,如果修改这个值再发布,刷新url值也会更接着变化。自动刷新的基本功能就实现了

bamboo

扩展知识 其他配置信息

客户端配置文件类型设置 在bootstrap.properties文件中 spring.cloud.nacos.config.file-extension=properties,yml,yaml 属性声明从配置中心中读取的配置文件格式 该配置的缺省值为properties,即默认是读取properties格式的配置文件。当客户端没有配置该属性,并且在nacos server添加的是yml格式的配置文件,则给客户端会读取不到配置文件,导致启动失败。 非properties配置格式,必须添加如下配置才可生效

spring.cloud.nacos.config.file-extension=yml

根据profile设置不同的环境配置

springboot中我们可以通过配置spring.profiles.active 实现在开发、测试、生产环境下采用不同的配置文件 同样,我们同科可以在nacos server分别创建

${application.name}-dev.properties
${application.name}-test.properties
${application.name}-prod.properties

然后通过命令启动jar时 设置spring.profiles.active来实现不同环境下使用不同的配置文件。

java -jar nacos-client-0.0.1-SNAPSHOT.jar --spring.profiles.active=test

同样也适用于yml/yaml文件,只是客户端设置spring.cloud.nacos.config.file-extension=yaml具体可见上一个说明

自定义group 在同一个group下,配置文件名不能重复,所以当需要创建文件名称相同的两个配置文件时,将两个配置文件创建在不同的group下即可。当我们再同一个group下创建一个已有的配置文件时,nacos会将其视为配置文件的修改,而不是新建。 因此我们可以把group作为一个project名称,相当于pom中的artifactId来标示不同的工程,每个工程拥有不同的配置文件即可。 在这里插入图片描述

但是如果创建了新的group那么客户端需要显式的配置group信息否则默认DEFAULT_GROUP空间中会出现找不到或者配置信息不符合你真实想法的情况。

#spring.cloud.nacos.config.file-extension=yaml
spring.cloud.nacos.config.group=bamboo_group

自定义 namespace 命名空间

相应的如果是服务,我们一般是按照一个服务一个隔离空间的,比如公司有两个不同的业务项目都有amdin服务,那么为了避免不会发生冲突,服务配置中就使用命名空间作为隔离开来。

在这里插入图片描述 上图我创建了一个private服务命名空间,这样只有配置了该命名空间的服务客户端才会找到,否则就找不到了

# 根据自己nacos server生成的命名空间ID进行修改
spring.cloud.nacos.config.namespace=fd69214f-54f1-47e8-affb-d19bc6616c13

注:该配置必须放在 bootstrap.properties 文件中。此外 spring.cloud.nacos.config.namespace的值是 namespace 对应的 id,id 值可以在 Nacos 的控制台获取。并且在添加配置时注意不要选择其他的 namespace,否则将会导致读取不到正确的配置。

服务中心使用mysql保存数据 在0.7版本之前,在单机模式时nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力,具体的操作步骤:

1.安装数据库,版本要求:5.6.5+ 2.初始化mysql数据库,数据库初始化文件:nacos-mysql.sql 3.修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。

具体操作: 1.在mysql server 新建数据库:nocas(名字自己随意) 2.在nacos server的 conf目录下找到nacos-mysql.sql 文件,并在创建的nacos数据库下执行表nacos-mysql.sql中的SQL语句 3.修改nacos server application.properties配置文件,修改后如下图所示

# spring

server.contextPath=/nacos
server.servlet.contextPath=/nacos
server.port=8848

spring.datasource.platform=mysql

db.num=1
db.url.0=jdbc:mysql://数据库IP:端口号/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=数据库用户名
db.password=数据库密码

4.重启Nacos server并添加配置文件,就可以看到mysql数据库数据表中出现了自己的配置文件内容

注:由嵌入式数据库切换为mysql数据库后,数据并不能自动转移到mysql中,导致之前的配置文件丢失

注 :当然为了可用性较高,生产使用建议至少主备模式,或者采用高可用数据库。

配置中心的高可用集群 nacos server的集群部署

集群部署架构图 官方的推荐部署架构图: [外链图片转存失败(img-x4go827X-1568616387514)(https://nacos.io/img/deployDnsVipMode.jpg)] 推荐用户把所有服务列表放到一个vip(虚拟IP,主机宕机后可以自动漂移到备用机器上)下面,然后挂到一个域名下面 http://ip1:port/openAPI 直连ip模式,机器挂则需要修改ip才可以使用。 http://VIP:port/openAPI 挂载VIP模式,直连vip即可,下面挂server真实ip,可读性不好。 http://nacos.com:port/openAPI 域名+VIP模式,可读性好,而且换ip方便,推荐模式

具体操作实践 注:目前器群模式下不采用mysql作为配置文件的存储方式,所以需要先配置为采用mysql数据源模式,我在上一篇博客中已经说明了,这里不再介绍,直接配置集群。

步骤如下:

1.conf文件夹下的文件如下图所示,其中下载的压缩包解压出来是没有cluster.conf的,通过复制cluster.conf-example并修改文件名得来。 修改cluster.conf,将部署nacos server的三台服务器ip地址写上即可 三台服务器cluster.conf文件相同,都是协商这三个IP地址即可

#it is ip
#example
114.116.137.***
132.232.159.***
47.107.122.***

2.分别启动三台nacos server 修改客户端,在客户端的bootstrap.properties文件中修改server的IP地址 注:修改成自己的三台服务器ip地址,用逗号分隔

spring.cloud.nacos.config.server-addr=114.116.137.***:8848,132.232.159.***:8848,47.107.122.***:8848
``

启动客户端 发现可以正常启动



## 更多功能
关于如何在这些生态中使用 Nacos,请参考以下文档:

Nacos与Spring Cloud一起使用
Nacos与Kubernetes一起使用
Nacos与Dubbo一起使用
Nacos与gRPC一起使用
Nacos与Istio一起使用

指定spring.profile.active和配置文件的DataID来使不同环境下读取不同的配置 默认空间+默认分组+新建dev和test两个DataID

  • 新建dev配置DataID

  • 新建test配置DataID

 

  • img

通过spring.profile.active属性就能进行多环境下配置文件的读取

img

 

img

posted on 2022-08-11 08:56  root-123  阅读(1569)  评论(0编辑  收藏  举报