网站维护预算,移动互联网开发官网,seo优化价格,wordpress 中英文站点目录
一#xff1a;Nacos配置管理
1. 统一配置管理
2. 配置热更新
3. 配置共享
4. 搭建Nacos集群 tips#xff1a;前些天突然发现了一个巨牛的人工智能学习网站#xff0c;通俗易懂#xff0c;风趣幽默#xff0c;忍不住分享一下给大家#xff0c;感兴趣的同学可以进…目录
一Nacos配置管理
1. 统一配置管理
2. 配置热更新
3. 配置共享
4. 搭建Nacos集群 tips前些天突然发现了一个巨牛的人工智能学习网站通俗易懂风趣幽默忍不住分享一下给大家感兴趣的同学可以进行学习人工智能学习网站 一Nacos配置管理 Nacos除了可以做注册中心前面已经讲了同样可以做配置管理来使用! 1. 统一配置管理 当微服务部署的实例越来越多达到数十、数百时逐个修改微服务配置就会让人抓狂而且很容易出错。我们需要一种统一配置管理方案可以集中管理所有实例的配置。 Nacos一方面可以将配置集中管理另一方可以在配置变更时及时通知微服务实现配置的热更新 如何在nacos中管理配置呢
登录nacos的控制界面 然后在弹出的表单中填写配置信息 注意这里项目的核心配置application.yml不是全都一下子都放到nacos配置管理只有需要热更新的配置才有放到nacos管理的必要。基本不会变更的一些配置还是保存在微服务本地aaplication.yml当中比较好。 从微服务拉取配置 注在没有Nacos时项目启动后直接读取本地的application.yml配置。 注有了Nacos微服务要拉取nacos中管理的配置并且与本地的application.yml配置合并才能完成项目启动 思考 Nacos去哪读取读取谁 注在读取Nacos的配置文件时要知道Nacos的服务地址而Nacos的服务地址又是在application.yml中进行配置的这就形成了一个死循环所以要先提前知道Nacos的地址才行这样才能读取到Nacos的配置文件。因此spring引入了一种新的配置文件bootstrap.yaml文件会在application.yml之前被读取流程如下 所以关于Nacos的配置信息应该都放到bootstrap.yaml配置当中具体流程如下
第一步引入Nacos的配置管理客户端依赖 注Nacos作为注册中心引入的是nacos-discovery依赖作为配置管理引入的是nacos-config依赖。 !-- nacos 配置管理依赖--
dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-config/artifactId
/dependency
第二步在user-service中的resource目录添加一个bootstrap.yml文件这个文件是引导文件优先级高于application.yml 注下面的三要素的结合实际上就是与前面的Nacos管理配置的Data ID相对应。 spring:application:name: user-service #服务名称三要素之一profiles:active: dev #环境三要素之二cloud:nacos:server-addr: localhost:8848 # nacos地址config:file-extension: yaml # 文件后缀名三要素之三
验证到底没有没有拉取成功呢我们就获取一下里面的配置属性 注前面几节我们使用了dev命名空间这里需要把order-servicenamespace属性配置删除掉不然跨空间访问是不行的。 package cn.itcast.user.web;import cn.itcast.user.pojo.User;
import cn.itcast.user.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;Slf4j
RestController
RequestMapping(/user)
public class UserController {// 使用Value注解访问配置的属性Value(${pattern.dateformat})private String dateformat;GetMapping(/now)public String now(){// 返回当前的时间return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));}}成功获取到格式化后的时间表明成功获取到配置 将配置交给Nacos管理的步骤
①在Nacos控制台中添加配置文件
②在微服务中引入nacos的config依赖
③在微服务中添加bootstrap.yml配置nacos地址、当前环境、服务名称、文件后缀名。这些决定了程序启动时去nacos读取哪个文件。 2. 配置热更新 我们最终的目的是修改Nacos中的配置后微服务中无需重启即可让配置生效也就是配置热更新。 要实现配置热更新可以使用两种方式 第一种方式在Value注入的变量所在类上添加注解RefreshScope刷新范围 第二种方式使用ConfigurationProperties注解建议使用的方式 新建一个类专门完成属性的加载此时先注入一个Java对象当中去 Java类与配置文件的属性进行绑定
package cn.itcast.user.config;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;Data
Component
ConfigurationProperties(prefix pattern) // 指定前缀
public class PatternProperties {private String dateformat;
}此时就不需要RefreshScope注解也不需要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 lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.*;import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;Slf4j
RestController
RequestMapping(/user)
// RefreshScope
public class UserController {/* Value(${pattern.dateformat})private String dateformat;*/// 注入Java类Autowiredprivate PatternProperties properties;GetMapping(/now)public String now(){// 返回当前的时间return LocalDateTime.now().format(DateTimeFormatter.ofPattern(properties.getDateformat())); // 调用类的get方法拿到值}}总结
Nacos配置更改后微服务可以实现热更新方式 ①通过Value注解注入结合RefreshScope来刷新这种方式是取出配置的属性直接使用。 ②通过ConfigurationProperties注入自动刷新这种方式是先把配置的属性与一个Java类绑定然后使用Java类调属性的方式。 注意事项 ①不是所有的配置都适合放到配置中心维护起来比较麻烦 ②建议将一些关键参数需要运行时调整的参数放到nacos配置中心一般都是自定义配置 3. 配置共享
多环境配置共享 例对于一个配置在开发、测试和上线都需要的配置只需要写一份即可然后进行共享 微服务启动时会从nacos读取多个配置文件 ①[spring.application.name]-[spring.profiles.active].yaml例如user-service-dev.yaml ②[spring.application.name].yaml例如user-service.yaml。 无论profile如何变化[spring.application.name].yaml这个文件一定会加载因此多环境共享配置可以写入这个文件 第一步添加一个环境共享配置 在nacos中添加一个user-service.yaml文件这个文件默认就会被加载进去的。 第二步在user-service中读取共享配置
在user-service服务中修改PatternProperties类读取新添加的属性 注这个类实际上封装的是user-service-dev.yaml和user-serviceyaml配置的总和 package cn.itcast.user.config;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;Data
Component
ConfigurationProperties(prefix pattern) // 指定前缀
public class PatternProperties {private String dateformat;// 添加新的属性private String envShareValue;
}在user-service服务中修改UserController添加一个方法
package cn.itcast.user.web;import cn.itcast.user.config.PatternProperties;
import cn.itcast.user.pojo.User;
import cn.itcast.user.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.*;import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;Slf4j
RestController
RequestMapping(/user)
public class UserController {// 注入Java类Autowiredprivate PatternProperties properties;// 多环境共享测试GetMapping(/prop)public PatternProperties prop(){return properties;}}第三步运行两个UserApplication使用不同的profile 1前面我们配置的是dev环境所以此时能读取到user-service-dev.yaml配置拿到的是dateformat属性和 user-service.yaml配置拿到的是envSharedValue属性此时两个值都能读取到。 2此时把环境改为test重新启动一个实例对于Nacos控制中心并没有进行test环境的任何配置此时dateformat属性的结果应该null。但是user-service.yaml配置默认还是能拿到的此时envShareValue属性的值还是能正常拿到的。 思考当Nacos、服务本地application.yaml同时出现相同属性时优先级有高低之分 1首先远程的Nacos的配置 大于 服务本地的而配置 2在全是Nacos的配置下user-service-dev.yaml 大于 user-service.yaml 服务名-profile.yaml 服务名称.yaml 本地配置 服务会从nacos读取的配置文件
①[服务名]-[spring.profile.active].yaml具体环境配置
②[服务名].yaml默认配置多环境共享使用
③优先级[服务名]-[环境].yaml [服务名].yaml 本地配置 4. 搭建Nacos集群
Nacos生产环境下一定要部署为集群状态所以接下来就学习一下集群部署 其中包含3个nacos节点然后一个负载均衡器代理3个Nacos。这里负载均衡器可以使用nginx计划的集群结构 三个nacos节点的地址
节点ipportnacos1192.168.150.18845nacos2192.168.150.18846nacos3192.168.150.18847
第一步 搭建数据库nacos初始化数据库表结构
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)
) ENGINEInnoDB DEFAULT CHARSETutf8 COLLATEutf8_bin COMMENTconfig_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)
) ENGINEInnoDB DEFAULT CHARSETutf8 COLLATEutf8_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)
) ENGINEInnoDB DEFAULT CHARSETutf8 COLLATEutf8_bin COMMENTconfig_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)
) ENGINEInnoDB DEFAULT CHARSETutf8 COLLATEutf8_bin COMMENTconfig_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)
) ENGINEInnoDB DEFAULT CHARSETutf8 COLLATEutf8_bin COMMENTconfig_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)
) ENGINEInnoDB DEFAULT CHARSETutf8 COLLATEutf8_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)
) ENGINEInnoDB DEFAULT CHARSETutf8 COLLATEutf8_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)
) ENGINEInnoDB DEFAULT CHARSETutf8 COLLATEutf8_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)
) ENGINEInnoDB DEFAULT CHARSETutf8 COLLATEutf8_bin COMMENTtenant_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在GitHub上有下载地址Tags · alibaba/nacos · GitHub可以选择任意版本下载。 第三步配置Nacos集群
①进入nacos的conf目录修改配置文件cluster.conf.example重命名为cluster.conf 然后添加内容
#IP地址和端口号
172.16.43.49:8845
172.16.43.49:8846
172.16.43.49:8847②修改application.properties文件添加数据库配置
# 第33行去掉注释表示使用mysql的集群
spring.datasource.platformmysql
#第36行去掉注释表示集群的数量
db.num1
# 第39行开始配数据库的信息
db.url.0jdbc:mysql://127.0.0.1:3306/nacos?characterEncodingutf8connectTimeout1000socketTimeout3000autoReconnecttrueuseUnicodetrueuseSSLfalseserverTimezoneUTC
db.user.0root
db.password.0123456
第四步启动
将nacos文件夹复制三份分别命名为nacos1、nacos2、nacos3 然后分别修改三个文件夹中的application.properties配置不同的端口号
nacos1:
server.port8845
nacos2:
server.port8846
nacos3:
server.port8847
然后分别启动三个nacos节点
startup.cmd #不需要-m参数默认就是集群的方式启动 第五步nginx反向代理
下载并解压到任意非中文目录下 ①修改conf/nginx.conf文件配置如下
#以下配置只要放到http下面都可以
upstream nacos-cluster {# 集群中的nacosserver 127.0.0.1:8845;server 127.0.0.1:8846;server 127.0.0.1:8847;
}server {# 反向代理的内容listen 80; # 以后不需要8848直接80就可以server_name localhost;location /nacos { # 只要访问这个路径就能代理到上面的集群当中proxy_pass http://nacos-cluster;}
}
启动nginx 在浏览器访问http://localhost/nacos即可 代码中bootstrap.xml文件配置 把8848改成80
spring:cloud:nacos:server-addr: localhost:80 # Nacos地址
添加配置 这个配置就会自动存入数据库当中