Nacos注册中心及配置管理服务

Nacos安装

下载安装包

在Nacos的GitHub页面,提供有下载链接,可以下载编译好的Nacos服务端或者源代码
GitHub主页:https://github.com/alibaba/nacos
GitHub的Release下载页:https://github.com/alibaba/nacos/releases
Nacos注册中心及配置管理服务_第1张图片点击tags显示各种版本,进行下载即可
Nacos注册中心及配置管理服务_第2张图片
在点击tags后,在页面的最下方是下载的安装包
Nacos注册中心及配置管理服务_第3张图片

windows版本安装

1、解压缩到任意非中文目录下,bin:启动脚本 conf:配置文件
Nacos注册中心及配置管理服务_第4张图片
2、端口配置
Nacos的默认端口是8848,如果你电脑上的其它进程占用了8848端口,请先尝试关闭该进程。
如果无法关闭占用8848端口的进程,也可以进入nacos的conf目录,修改application.properties配置文件中的端口:
Nacos注册中心及配置管理服务_第5张图片
3、启动:进入bin目录,双击startup.cmd也可直接在上方目录中进入cmd输入startup.cmd -m standalone命令打开。standalone代表单机模式,还有集群模式
Nacos注册中心及配置管理服务_第6张图片
4、访问:http://192.168.192.1:8848/nacos/index.html这里的地址就是上图中Console的地址
Nacos注册中心及配置管理服务_第7张图片
默认账号和密码都是nacos,进入后:windows版本就安装成功
Nacos注册中心及配置管理服务_第8张图片

Linux版本安装

1、Nacos依赖于JDK运行,索引Linux上也需要安装JDK才行
2、将下载好的nacos-server-1.4.1.tar.gz上传至服务器/usr/local/src目录下
3、tar -zxvf nacos-server-1.4.1.tar.gz解压安装包
Nacos注册中心及配置管理服务_第9张图片
4、端口配置与windows一样
5、在nacos/bin目录中,输入sh startup.sh -m standalone命令启动nacos

Nacos快速入门

Nacos是SpringCloudAlibaba的组件,而SpringCloudAlibaba也遵循SpringCloud中定义的服务注册、服务发现规范。因此使用Nacos和使用Eureka对于微服务来说,并没有太大区别。
主要差异:依赖不同,服务地址不同

引入依赖

在cloud-demo父工程的pom文件中的中引入SpringCloudAlibaba的依赖:


    com.alibaba.cloud
    spring-cloud-alibaba-dependencies
    2.2.6.RELEASE
    pom
    import

首先注释掉eureka的依赖
然后在user-service和order-service中的pom文件中引入nacos-discovery依赖


    com.alibaba.cloud
    spring-cloud-starter-alibaba-nacos-discovery

配置nacos地址

首先注释掉eureka的地址
在user-service和order-service的application.yml中添加nacos地址:

spring:
  cloud:
    nacos:
      server-addr: localhost:8848

重启user-service和order-service服务

重启微服务后,登录nacos管理页面,可以看到微服务信息
Nacos注册中心及配置管理服务_第10张图片

Nacos服务分级存储模型

一个服务可以有多个实例,例如我们的user-service,可以有:127.0.0.1:8081127.0.0.1:8082127.0.0.1:8083,假如这些实例分布于全国各地的不同机房,例如8081为上海机房,8082为上海机房,8083为杭州机房
Nacos就将同一机房内的实例 划分为一个集群
也就是说,user-service是服务,一个服务可以包含多个集群,如杭州、上海,每个集群下可以有多个实例,形成分级模型,如图:

Nacos注册中心及配置管理服务_第11张图片

服务跨集群调用问题

服务调用尽可能选择本地集群的服务,跨集群调用延迟较高
本地集群不可访问时,再去访问其他机集群
Nacos注册中心及配置管理服务_第12张图片
现在集群属性为默认,也就是没有集群
Nacos注册中心及配置管理服务_第13张图片

配置服务集群属性

1、修改user-service的application.yml文件,添加集群配置:

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ # 集群名称

咱就是说,UserApplication 和UserApplication2启动后就成为了HZ的集群,但是在启动UserApplication3之前将HZ改成SH那启动后的UserApplication3就是SH的集群了,这时如果重启UserApplication和UserApplication2他们也成为了SH集群。
Nacos注册中心及配置管理服务_第14张图片
Nacos注册中心及配置管理服务_第15张图片
Nacos注册中心及配置管理服务_第16张图片

NacosRule同集群优先的负载均衡

默认的ZoneAvoidanceRule并不能实现根据同集群优先来实现负载均衡。
因此Nacos中提供了一个NacosRule的实现,可以优先从同集群中挑选实例。
但我们最终需要实现的是OrderService远程调用UserService时,优先选择本地集群,因此我们还需要给OrderService也配置一个本地集群属性
Nacos注册中心及配置管理服务_第17张图片
这是可以看到OrderSerice也在HZ集群
Nacos注册中心及配置管理服务_第18张图片
修改负载均衡规则
修改order-service的application.yml文件,修改负载均衡规则:

userservice: # 给某个微服务配置负载均衡规则,这里是userservice服务
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则

Nacos注册中心及配置管理服务_第19张图片
这样在从浏览器从order service发送请求后,SH的没有被访问,优先选择本地集群,但是在本地集群中的访问是一种随机的访问。
当我们停掉本地的服务集群,就会出现一次跨集群访问的警告

NacosRule负载均衡策略

1、优先选择同集群服务实例列表
2、本地集群找不到提供者,才去其他集群寻找,并且会发出警告
3、确定了可用实例列表后,再采用随机负载均衡挑选实例

根据权重负载均衡

实际部署中会出现这样的场景:

服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求。

但默认情况下NacosRule是同集群内随机挑选,不会考虑机器的性能问题。
因此,Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高。
1、在nacos控制台,找到user-service的实例列表,点击编辑,即可修改权重:
Nacos注册中心及配置管理服务_第20张图片

实例的权重控制

Nacos控制台可以设置实例的权重值,0~1之间
同集群内的多个实例,权重越高被访问的频率越高
如果权重修改为0,则该实例永远不会被访问

环境隔离 - namespace

Nacos提供了namespace来实现环境隔离功能。
nacos中可以有多个namespace, namespace下可以有group、service等,不同namespace之间相互隔离,例如不同namespace的服务互相不可见
Nacos注册中心及配置管理服务_第21张图片

创建namespace

1、默认情况下,所有service、data、group都在同一个namespace,名为public:
Nacos注册中心及配置管理服务_第22张图片
2、新建命名空间
Nacos注册中心及配置管理服务_第23张图片
Nacos注册中心及配置管理服务_第24张图片
Nacos注册中心及配置管理服务_第25张图片

给微服务配置namespace

给微服务配置namespace只能通过修改配置来实现。

  cloud:
    nacos:
      server-addr: localhost:8848 #nacos服务地址
      discovery:
        cluster-name: HZ
        namespace: 8159c4ac-7682-4d6a-bf02-f74e30dcbaa9 #命名空间的ID

重启order-service后,访问控制台,可以看到下面的结果:
Nacos注册中心及配置管理服务_第26张图片
Nacos注册中心及配置管理服务_第27张图片
此时访问order-service,因为namespace不同,会导致找不到userservice,控制台会报错
Nacos注册中心及配置管理服务_第28张图片

Nacos环境隔离

1、namespace用来做环境隔离
2、每个namespace都有唯一的ID
3、不同的namespace下的服务不可见

Nacos与Eurake的区别

Nacos的服务实例分为两种类型:
临时实例:如果实例宕机超过一定时间,会从服务列表剔除,默认的类型。
非临时实例:如果实例宕机,不会从服务列表剔除,也可以叫永久实例。

配置一个服务实例为永久实例:

spring:
  cloud:
    nacos:
      discovery:
        ephemeral: false # 设置为非临时实例

Nacos与Eurake的共同点:

都支持服务的注册和服务拉取
都支持服务提供者心跳方式做健康检测

Nacos与Eurake的区别:

1、Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时模式采用主动检测模式
2、临时实例心跳不正常会被剔除,非临时实例不会被剔除
3、Nacos支持服务列表表更的消息推送模式,服务列表更新及时
4、Nacos集群采用AP(数据可用性)方式,当集群中存在非临时实例时,采用CP(数据的可靠性和一直性)模式,Eureka采用AP方式。

统一配置管理

Nacos除了可以做注册中心,同样可以做配置管理来使用
在搭建环境过程中,有两个微服务,每个微服务都有要数据库查询,并且服务之间会有相互调用的功能,为了完成相互调用,我们将服务注册到注册中心,消费者就可以在注册中心完成服务的发现完成服务的获取和负载均衡,完成远程调用,当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。并且其他的服务不用重启,这个修改可以立马生效,这样我们就需要一个配置管理的服务,用来记录微服务中的核心配置,在微服务启动的时候就会读取配置管理服务中的配置,在和本地的配置进行结合完成完整的配置。
Nacos注册中心及配置管理服务_第29张图片
Nacos一方面可以将配置集中管理,另一方面可以在配置变更时,计时通知微服务,实现配置的热更新。
Nacos注册中心及配置管理服务_第30张图片

在nacos中添加配置文件

Nacos注册中心及配置管理服务_第31张图片

1、启动Nacos进入配置管理页面
Nacos注册中心及配置管理服务_第32张图片
2、在弹出的表单中,填写配置信息:
核心的配置,需要热更新的配置才有放到nacos管理的必要,基本不会变的一些配置还时保存在微服务本地比较好

Nacos注册中心及配置管理服务_第33张图片
Nacos注册中心及配置管理服务_第34张图片

从微服务拉取配置

微服务要拉取nacos中管理的配置,并且与本地的application.yml配置合并,才能完成项目启动。
1、引人Nacos的配置管理客户端管理依赖,在userservice服务中,引入nacos-config的客户端依赖:


        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-config
        

2、在usrservice中的resource目录添加一个bootstrap.yml文件,这个文件是引导类,优先级高于application.yml,当然了这里也就不需要application中共同的配置

spring:
  application:
    name: userservice # 服务名称
  profiles:
    active: dev #开发环境,这里是dev 
  cloud:
    nacos:
      server-addr: localhost:8848 # Nacos地址
      config:
        file-extension: yaml # 文件后缀

3、读取nacos配置
在userservice中的UserController中添加业务逻辑,读取我们在nacous中设置的pattern.dateformat配置:

package cn.itcast.user.web;

import cn.itcast.user.pojo.User;
import cn.itcast.user.service.UserService;
import com.alibaba.nacos.api.config.annotation.NacosValue;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.web.bind.annotation.*;

import java.text.DateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @Value("${pattern.dateformat}")
    

    private String dateformat;

    @GetMapping("/now")
    public String now() {
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
    }


    /**
     * 路径: /user/110
     *
     * @param id 用户id
     * @return 用户
     */
    @GetMapping("/{id}")
    public User queryById(@PathVariable("id") Long id) {
        return userService.queryById(id);
    }
}

4、配置完成,可以看到在nacos中配置的文件已经被bootstrap.yam加载
Nacos注册中心及配置管理服务_第35张图片

配置热更新

我们最终的目的,是修改nacos中的配置后,微服务中无需重启即可让配置生效,也就是配置热更新
要实现配置热更新,可以使用两种方式:

修改配置文件userservice-dev.yam内容,希望页面信息立马发生变化
Nacos注册中心及配置管理服务_第36张图片
但实际没有发生变化
Nacos注册中心及配置管理服务_第37张图片

方式一:@RefreshScope

在@Value注入的变量所在类上添加注解@RefreshScope后重新启动服务可以看到年月日的信息,但是这次因为我们重启了,因此需要在userservice-dev.yaml中重新修改后/后刷新
Nacos注册中心及配置管理服务_第38张图片
Nacos注册中心及配置管理服务_第39张图片

Nacos注册中心及配置管理服务_第40张图片
此次不重启服务器,直接刷新效果显著,已经实现热部署
Nacos注册中心及配置管理服务_第41张图片

方式二:@ConfigurationProperties

使用@ConfigurationProperties注解代替@Value注解。
1、在user-service服务中,添加一个类,读取patterrn.dateformat属性:

package cn.itcast.user.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@Data
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
    private String dateformat;
}

2、在UserController中使用这个类代替@Value:

package cn.itcast.user.web;

import cn.itcast.user.config.PatternProperties;
import cn.itcast.user.pojo.User;
import cn.itcast.user.service.UserService;
import com.alibaba.nacos.api.config.annotation.NacosValue;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.*;

import java.text.DateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

@Slf4j
@RestController
@RequestMapping("/user")
//@RefreshScope//属性刷新
public class UserController {

    @Autowired
    private UserService userService;
/*
    @Value("${pattern.dateformat}")
    //@NacosValue("{pattern.dateformat}")*/

    //private String dateformat;
    @Autowired
    private PatternProperties properties;


    @GetMapping("/now")
    public String now() {
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(properties.getDataformat()));
    }


    /**
     * 路径: /user/110
     *
     * @param id 用户id
     * @return 用户
     */
    @GetMapping("/{id}")
    public User queryById(@PathVariable("id") Long id) {
        return userService.queryById(id);
    }
}

4、运行结果
Nacos注册中心及配置管理服务_第42张图片

多环境配置共享

微服务启动时,会去nacos读取多个配置文件,例如:
[spring.application.name]-[spring.profiles.active].yaml,例如:userservice-dev.yaml
[spring.application.name].yaml,例如:userservice.yaml
[spring.application.name].yaml不包含环境,因此可以被多个环境共享。

下面通过案例来测试配置共享

添加一个环境共享配置

在nacos中添加一个userservice.yaml文件
Nacos注册中心及配置管理服务_第43张图片
Nacos注册中心及配置管理服务_第44张图片

在userservice中读取共享配置

1、在userservice服务中,修改PatternProperties类,读取新添加的属性:
Nacos注册中心及配置管理服务_第45张图片
2、在userservice服务中,修改UserController,添加一个方法:
Nacos注册中心及配置管理服务_第46张图片
3、运行两个User Application,使用不同的profile
修改User Application2这个启动项,改变其profile的值,
Nacos注册中心及配置管理服务_第47张图片
但是这个User Application在bootstrap.yaml中配置的环境是dev,所以它可以读到userservic-dev.yaml和userservice.yaml两个文件的值,User Application2在此时就是读不到userservic-dev.yaml这个文件的,
在这里插入图片描述

配置共享的优先级

当nacos、服务本地同时出现相同属性时,优先级有高低之分
Nacos注册中心及配置管理服务_第48张图片

Nacos集群管理

Nacos注册中心及配置管理服务_第49张图片
其中包含3个nacos节点,然后一个负载均衡器代理3个Nacos。这里负载均衡器可以使用nginx。

我们计划的集群结构:Nacos注册中心及配置管理服务_第50张图片
三个nacos节点的地址:
Nacos注册中心及配置管理服务_第51张图片

初始化数据库

Nacos默认数据存储在内嵌数据库Derby中,不属于生产可用的数据库。
首先新建一个数据库,命名为nacos,而后导入下面的SQL:

CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(255) DEFAULT NULL,
  `content` longtext NOT NULL COMMENT 'content',
  `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info_aggr   */
/******************************************/
CREATE TABLE `config_info_aggr` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(255) NOT NULL COMMENT 'group_id',
  `datum_id` varchar(255) NOT NULL COMMENT 'datum_id',
  `content` longtext NOT NULL COMMENT '内容',
  `gmt_modified` datetime NOT NULL COMMENT '修改时间',
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段';


/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info_beta   */
/******************************************/
CREATE TABLE `config_info_beta` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
  `content` longtext NOT NULL COMMENT 'content',
  `beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps',
  `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta';

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info_tag   */
/******************************************/
CREATE TABLE `config_info_tag` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
  `tag_id` varchar(128) NOT NULL COMMENT 'tag_id',
  `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
  `content` longtext NOT NULL COMMENT 'content',
  `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag';

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_tags_relation   */
/******************************************/
CREATE TABLE `config_tags_relation` (
  `id` bigint(20) NOT NULL COMMENT 'id',
  `tag_name` varchar(128) NOT NULL COMMENT 'tag_name',
  `tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`nid`),
  UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),
  KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation';

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = group_capacity   */
/******************************************/
CREATE TABLE `group_capacity` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群',
  `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
  `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
  `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
  `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值',
  `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
  `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_group_id` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表';

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = his_config_info   */
/******************************************/
CREATE TABLE `his_config_info` (
  `id` bigint(64) unsigned NOT NULL,
  `nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `src_user` text,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`nid`),
  KEY `idx_gmt_create` (`gmt_create`),
  KEY `idx_gmt_modified` (`gmt_modified`),
  KEY `idx_did` (`data_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造';


/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = tenant_capacity   */
/******************************************/
CREATE TABLE `tenant_capacity` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID',
  `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
  `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
  `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
  `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数',
  `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
  `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表';


CREATE TABLE `tenant_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `kp` varchar(128) NOT NULL COMMENT 'kp',
  `tenant_id` varchar(128) default '' COMMENT 'tenant_id',
  `tenant_name` varchar(128) default '' COMMENT 'tenant_name',
  `tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc',
  `create_source` varchar(32) DEFAULT NULL COMMENT 'create_source',
  `gmt_create` bigint(20) NOT NULL COMMENT '创建时间',
  `gmt_modified` bigint(20) NOT NULL COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`),
  KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info';

CREATE TABLE `users` (
	`username` varchar(50) NOT NULL PRIMARY KEY,
	`password` varchar(500) NOT NULL,
	`enabled` boolean NOT NULL
);

CREATE TABLE `roles` (
	`username` varchar(50) NOT NULL,
	`role` varchar(50) NOT NULL,
	UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE
);

CREATE TABLE `permissions` (
    `role` varchar(50) NOT NULL,
    `resource` varchar(255) NOT NULL,
    `action` varchar(8) NOT NULL,
    UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
);

INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);

INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');

下载nacos

参考本文开始

配置nacos

进入nacos的conf目录,修改配置文件cluster.conf.example,重命名为cluster.conf:
然后添加内容:

127.0.0.1:8845
127.0.0.1.8846
127.0.0.1.8847

Nacos注册中心及配置管理服务_第52张图片
然后修改application.properties文件,添加数据库配置

spring.datasource.platform=mysql

db.num=1

db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=123

启动

将nacos文件夹复制三份,分别命名为:nacos1、nacos2、nacos3
然后分别修改三个文件夹中的application.properties,
nacos1:server.port=8845

nacos2:server.port=8846

nacos3:server.port=8847
分别启动:startup.cmd

nginx反向代理

修改conf/nginx.conf文件

upstream nacos-cluster {
    server 127.0.0.1:8845;
	server 127.0.0.1:8846;
	server 127.0.0.1:8847;
}

server {
    listen       80;
    server_name  localhost;

    location /nacos {
        proxy_pass http://nacos-cluster;
    }
}

而后在浏览器访问:http://localhost/nacos即可。
代码中application.yml文件配置如下:

spring:
  cloud:
    nacos:
      server-addr: localhost:80 # Nacos地址

优化

1、实际部署时,需要给做反向代理的nginx服务器设置一个域名,这样后续如果有服务器迁移nacos的客户端也无需更改配置.
2、Nacos的各个节点应该部署到多个不同服务器,做好容灾和隔离

你可能感兴趣的:(Spring,Cloud,nginx,linux,服务器)