销项税和进项导入是在国税网站做吗,wordpress 怎么迁移,虚拟主机 两个网站,浙江省城乡住房建设部网站文章目录 一、统一配置管理二、微服务配置拉取三、配置热更新四、多环境共享配置五、Nacos 集群搭建1. 集群结构2. 初始化数据库3. 搭建集群 六、Nginx 反向代理七、启动项目测试 一、统一配置管理 案例练习的时候我们只有两个微服务#xff0c;管理起来非常简单#xff0c;但… 文章目录 一、统一配置管理二、微服务配置拉取三、配置热更新四、多环境共享配置五、Nacos 集群搭建1. 集群结构2. 初始化数据库3. 搭建集群 六、Nginx 反向代理七、启动项目测试 一、统一配置管理 案例练习的时候我们只有两个微服务管理起来非常简单但在真正的项目中将会出现大量的微服务当一些核心配置发生改变的时候我们就需要修改所有与它相关的微服务且不得不重启这样带来的代价是非常大的。所以我们希望这些配置文件能够实现统一的管理并且保证更改热更新无需重启即可生效。 此时我们需要一个配置管理服务将核心的经常需要改动的配置放上去微服务启动的时候就可以去读取该配置再与本地的配置相结合作为完整配置去使用。当这些核心配置需要改动的时候直接在配置管理服务中去改动就 OK 了改完之后它就会立即通知微服务完成配置的读取。 不管是注册中心还是配置管理服务它们都是由 Nacos 实现的所以配置管理服务也是在 Nacos 控制台设置的
① 点击配置列表中的加号添加配置 ② 填写配置表单Data ID 其实就是配置文件的名称该名称不能冲突一般的命名格式为服务名-生产环境.后缀名userserver-dev.yaml ③ 编写配置内容并发布注意这里的内容并不是啥都往上写我们只写核心的、有热更新需求的配置 二、微服务配置拉取
配置获取步骤如下 项目启动 → 读取 Nacos 中的配置文件 → 读取本地配置文件 → 创建 spring 容器 → 加载 bean
Nacos 中的配置文件与本地配置文件相结合组成最终的配置文件
项目启动后我们需要知道去哪里读取 Nacos 配置文件当然是 Nacos要读取的又是哪个文件落实到文件名而这些信息其实都被提前配到了一个叫 bootstrap.yml 文件中。
bootstrap.yml 是引导类配置文件它的优先级高于 application.yml 文件所以我们可以把 Nacos 地址以及文件的相关信息都写到 bootstrap.yml 里面完成 Nacos 配置的读取而后与本地文件相结合。
① 引入 Nacos 的配置管理客户端依赖
dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-config/artifactId
/dependency② 在 userserver 中的 resource 目录中添加一个 bootstrap.yml 文件并编写 Nacos 地址和远程文件相关信息服务名称开发环境文件后缀名其实就是远程配置文件的 Data ID
spring:application:name: userserver #服务名称profiles:active: dev #开发环境cloud:nacos:server-addr: localhost:8848 #Nacos地址config:file-extension: yaml #文件后缀名 ③ 把 application.yml 中重复的配置删掉服务名称和 Nacos 地址 ④ 在 UserController 中编写测试代码试一下是否配置成功Value 注解读取配置 Spring Cloud 新版本默认将 Bootstrap 禁用所以还需要引入 spring-cloud-starter-bootstrap 依赖到父工程中否则会报错旧版本可忽略这一步
dependency!-- 新版本默认将 Bootstrap 禁用需引入依赖 --groupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-bootstrap/artifactId
/dependency⑤ 启动项目并访问 三、配置热更新 上面的图片可以看到当前时间已经显示出来了也就是说我们的 Nacos 生效了那么热更新呢我们接下来可以试一下配置自动刷新 我们把远程配置修改一下并发布刷新浏览器发现它并没有热更新还是以前的配置这是为什么呢 Nacos 中的配置文件变更后微服务无需重启就可以感知不过需要通过下面两种配置实现
① 方式一在 Value 注入的变量所在类上添加属性刷新的注解 RefreshScope ② 方式二使用 ConfigurationProperties 注解可以完成配置的自动更新
package com.zxe.userserver.pojo;import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;Component
ConfigurationProperties(prefix pattern)
public class PatternProperties {private String dateformat;public String getDateformat() {return dateformat;}public void setDateformat(String dateformat) {this.dateformat dateformat;}
} 推荐使用方式二因为 ConfigurationProperties 本身就可以自动更新无需再添加其他注解
四、多环境共享配置 什么情况下会遇到微服务的配置共享呢比如某属性它在开发、生产、测试等环境下的值是一样的这就没必要在每个环境中都写一遍了代码冗余而且如果要改动每个配置文件都得改这样显然是不合理的。我们想要只配置一次该属性不管环境怎么变该配置始终能被加载这就是多环境配置共享。 我们之前的 Nacos 远程配置文件是 userserver-dev.yamldev 是跟环境相关的。而多环境配置不需要环境相关信息所以这里的文件名应该是 userserver.yaml当微服务启动的时候userserver-dev.yaml 和 userserver.yaml 都会被读取前者只在 dev 环境下加载而后者在任何环境中都会被加载因此多环境共享配置可以写入这个文件里面。
① 新建配置并发布DataID 为 userserver.yaml ② 编写测试代码实体类新增 envSharedValue 属性 ③ 便于测试我们先在 dev 环境下启动一个服务修改环境后再启动一个服务观察控制台输出可以看到userserver.yaml 的配置内容会同时在这两个环境中显示这就是多环境共享配置 配置文件的优先级 服务名-生产环境.yaml 服务名.yaml 本地配置 优先级远程大于本地具体大于共享
五、Nacos 集群搭建
1. 集群结构 实际上Nacos 的工作量远不止这些所以为了减小 Nacos 的压力我们一定为它配置集群模式此处用 Nginx 来做负载均衡。 假设 A 为消费者B 为生产者在集群模式下A 需要拉取 B就会向 Nacos 发起拉取请求此请求会被 Nginx 拦截走做负载均衡即从 Nacos 集群中挑选一个节点出来最终我们就是从该结点上拉取服务列表的在该列表内部继续做负载均衡挑选出一个具体的实例去处理真正的请求。 2. 初始化数据库
Nacos默认数据存储在内嵌数据库中不属于生产可用的数据库。其实数据库也应该用主从模式的高可用数据库集群为了节省时间这里我们以单点的数据库为例。
首先新建一个数据库命名为 nacos而后导入下面的 SQL
/** Copyright 1999-2018 Alibaba Group Holding Ltd.** Licensed under the Apache License, Version 2.0 (the License);* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an AS IS BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*//******************************************/
/* 数据库全名 nacos_config */
/* 表名称 config_info */
/******************************************/
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,encrypted_data_key text NOT NULL COMMENT 秘钥,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 租户字段,encrypted_data_key text NOT NULL 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(20) 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 租户字段,encrypted_data_key text NOT NULL 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); 3. 搭建集群
条件有限我们只能在一台电脑上部署 Nacos 节点。
① 进入 Nacos 的 conf 目录修改配置文件 cluster.conf.example重命名为 cluster.conf ② 打开 cluster.conf修改 IP 地址和端口号这里三个节点均为本机所以 IP 是你自己本机的 IP 地址不方便展示我这里用127.0.0.1代替如果在生产环境中应该是三台真实机器的 IP 地址注意 2.0 版本以上的 Nacos 端口号一定不能是连续的数字否则到后面启动的时候会报错
cmd → ipconfig 查看注意这里的 IP 必须是外网 IP如果使用内网 IP 就会出现服务列表在各 Nacos 节点上不同步的问题
127.0.0.1:2222
127.0.0.1.3333
127.0.0.1.4444③ 编辑 application.properties 文件打开数据源去掉前面的注释符号告诉 Nacos 我们用的是 mysql 集群打开数据库数量我们只有一台 mysql打开数据库配置修改自己的数据库名、账号和密码 ④ 将 Nacos 文件夹复制三份分别命名为 nacos1、nacos2、nacos3 ⑤ 分别修改三个文件夹中的 application.properties填写各自的端口号 ⑥ 分别启动三个 Nacos 节点
startup.cmd如果你的 Nacos 版本是 2.0 以上的那么这时当你在启动第二个节点的时候就会报错低版本不影响不报错的可直接跳过这里报错信息如下 简单的来说就是端口被占用了由于Nacos 2.0 版本新增了 gRPC 通讯方式导致自身还需要两个端口 9848 和 9849这就要保证 8848、9848、9849 是空闲的。 而这两个端口号是怎么来的呢我们都知道原端口号是 8848那么 9848 和 9849 其实就是原端口号加 1000 和 1001 的结果如果节点配置的是连续的端口号比如1111、1112、1113那么当第二个节点启动的时候9848 和 9849 这两个端口一定是被第一个节点占用的所以在前面 cluster.conf 中配置端口的时候端口号至少应该隔一个位置。
六、Nginx 反向代理
Nginx 下载点击这里 ① 编辑 conf 目录下的 nginx.conf将配置代码粘贴到 http 花括号里面
同样这里的 127.0.0.1 也要替换成你的外网 IP 地址
upstream nacos-cluster {server 127.0.0.1:2222;server 127.0.0.1:3333;server 127.0.0.1:4444;
}server {listen 80;server_name localhost;location /nacos {proxy_pass http://nacos-cluster;}
}只要访问到 localhost/nacos 路径就会被 Nginx 代理到 http://nacos-cluster 集群然后做负载均衡最终选择一个节点出来去处理请求。
② Nacos 2.0 以上版本还需配置 grpc 协议依然是在 nginx.conf 文件里面粘贴以下代码
注意不要粘在 http 里面!
# nacos的grpc协议配置
stream {upstream nacoscluster-grpc{# nacos2版本grpc端口与要比主端口多1000server 127.0.0.1:3222 weight1;server 127.0.0.1:4333 weight1;server 127.0.0.1:5444 weight1;}server{listen 1080;proxy_pass nacoscluster-grpc;}
}③ 在 nginx.exe 所在目录下 cmd 打开黑窗口start nginx.exe 启动 Nginx ④ Nginx 启动成功之后打开浏览器并访问 localhost/nacos代理成功我们看到的 Nacos 只有一个实际上 Nginx 已经在 Nacos 集群中做了负载均衡 七、启动项目测试
① Nacos 地址已经不再是 8848 了Nginx 里面配的是 80所以代码里面的 Nacos 端口也要改成 80 ② 启动服务测试一下多刷新几次 Nacos 控制台可以看到我们的服务已经注册进去了 ③ 接下来可以新建一个配置文件测试以下共享配置是否也可以生效 ④ 这个配置其实已经存到 nacos 数据库里面了这就是 Nacos 数据的持久化