路桥区商用营销型网站建设wordpress如何查看并修改源代码
news/
2025/10/5 17:56:15/
文章来源:
路桥区商用营销型网站建设,wordpress如何查看并修改源代码,济南网站建设公司,宁波网站推广方式怎么样SpringCloud Alibaba 常用组件 一、基础结构搭建1.父工程创建2.子工程创建 二、Nacos#xff1a;注册中心1.服务端搭建2.注册中心-客户端搭建3.注册中心-管理页面4.注册中心-常用配置5.注册中心-核心功能总结 三、Nacos注册中心集成Load Balancer 、OpenFeign1.Nacos客户端集成… SpringCloud Alibaba 常用组件 一、基础结构搭建1.父工程创建2.子工程创建 二、Nacos注册中心1.服务端搭建2.注册中心-客户端搭建3.注册中心-管理页面4.注册中心-常用配置5.注册中心-核心功能总结 三、Nacos注册中心集成Load Balancer 、OpenFeign1.Nacos客户端集成负载均衡Load Balancer2.Nacos客户端集成OpenFeign3 OpenFien调用日志配置3 OpenFeign超时时间配置4 OpenFeign自定义拦截器配置 三、Nacos配置中心1.配置中心-客户端搭建2.配置中心-管理页面3.配置中心常用配置3.1 文件扩展名配置file-extension3.2 使用profile进行多环境文件配置3.3 配置更新禁用3.4 config的namespace和group3.5 指定配置文件: shared-configs3.5 指定配置文件: extension-configs3.6 配置文件变动热加载RefreshScope 四、总结 本文旨在总结Alibaba常用组件及技术关键点希望可以帮助到路过的朋友。Alibaba的cloud解决方案在github上是热度最高的一个cloud方案也是时下最为流行的解决方案所以他的原理和内幕还是值得我们一探的。这里不做微服务架构演进微服务基础知识等的普及如果需要可以进这里进行了解Springcloud netfilx常用组件
一、基础结构搭建
这里通过maven的父子工程来管理本次展示的demo。使用父子观察管理的好处是
1.代码集中方便集中管理下载2.集中化管理学习成本更低项目易于接受
1.父工程创建
使用IDEA。file–new–project–maven 来进行创建父工程父工程一定得是pom的这样我们编译时父工程才可以实现管理子工程的目的如果不是pom的我们是无法在父工程下正确创建子工程的。 本次demo采用集中的版本管理我们只需要限定以下三个版本即可只需要将他们放在dependencyManagement中进行指明版本同时声明type和scope就可以做到全局的组件版本控制了功能类似于parent标签不过parent只能声明一个父工程来管理版本依赖而放在dependencyManagement的dependency却可以支持多个。
SpringBoot 版本2.6.11SpringCloud 版本2021.0.4SpringCould Alibaba 版本2021.0.4.0
若是对alibaba与cloud和boot的版本对应关系不清晰可以看这里SpringCloud组件版本依赖关系
dependencyManagementdependenciesdependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-alibaba-dependencies/artifactIdversion${Spring-cloud-alibaba-version}/versiontypepom/typescopeimport/scope/dependencydependencies
/dependencyManagement下面是父工程的完整pom文件
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersion!--这里不使用parent来管理整体的jar的版本统一放在dependencymanager中进行管理--!--parent--!--groupIdorg.springframework.boot/groupId--!--artifactIdspring-boot-starter-parent/artifactId--!--version3.1.3.RELEASE/version--!--relativePath/ lt;!ndash; lookup parent from repository ndash;gt;--!--/parent--groupIdcom.cheng/groupIdartifactIdspring-cloud-alibaba-base/artifactIdpackagingpom/packagingversion1.0.0/versionmodulesmoduleorder-server/modulemodulestock-server/module/modulesnamespring-cloud-alibaba-base/namedescriptionalibaba父工程/descriptionpropertiesjava.version8/java.versionSpring-boot-version2.6.11/Spring-boot-versionSpirng-cloud-version2021.0.4/Spirng-cloud-versionSpring-cloud-alibaba-version2021.0.4.0/Spring-cloud-alibaba-version/propertiesdependencyManagement!--通过此模块来规范boot和cloud的所有组件版本所有的子工程将不需要考虑组件的版本问题--dependencies!--这种写法和写在parent中作用一样注意type和scope不可省略--!--这种写法的优点是可以声明多个父级的项目包版本依赖而parent只能由一个--!--这是springboot相关包的版本管理--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion${Spring-boot-version}/versiontypepom/typescopeimport/scope/dependency!--这是alibaba组件的版本管理--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-alibaba-dependencies/artifactIdversion${Spring-cloud-alibaba-version}/versiontypepom/typescopeimport/scope/dependency!--这是cloud的组件的版本管理也可以使用pring-cloud-dependencies-parent但是使用下面的更好--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-dependencies/artifactIdversion${Spirng-cloud-version}/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagement!--dependencies中的包会直接被子工程继承而dependencyManagement的包不手动引入则不会继承--dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build/project2.子工程创建
子工程创建都是一样的这里展示一个例子父工程右键–new–module–spring-initializr这里不使用spring-initializr使用maven也是可以的只是使用spring-initializr会方便一些无需我们自己创建启动类、配置文件等。若是你的IDEA比较新据我所知IDEA2021以下好像用不了还可以使用spring-initializr指定三方的脚手架三方脚手架地址推荐使用阿里的。https://start.aliyun.com这个脚手架对Springcloud组件支持的更友好也包含更多的阿里系的组件 注意社区版的IDEA不支持Spring Initializr功能 下面是子工程的pom文件
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdcom.cheng/groupIdartifactIdspring-cloud-alibaba-base/artifactIdversion1.0.0/version/parentgroupIdcom.cheng/groupIdartifactIdorder-server/artifactIdversion1.0.0/versionnameorder-server/namedescriptionDemo project for Spring Boot/descriptionpropertiesjava.version17/java.version/propertiesdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build/project
到这里就简单搭建了一个架子出来后面就是为每个服务进行引入不同的组件和依赖了。 若是感觉以上父子工程创建不够详细推荐看这里Maven创建父子工程详解
二、Nacos注册中心
Nacos是使用SpringCloud Alibaba的必用组件了他统一了Eureka和Config同时支持优雅的服务下线对服务进行管理可以很从容的实现服务替换。优点还有很多不一一列举了反正是肯定比eureka和config好用。上面我们已经指定了Alibaba的版本这个版本里限定的Nacos版本是2.0.4 所以这里的服务端、客户端我们都是用2.0.4的Nacos来进行搭建。下图是主流的注册中心
1.服务端搭建
这里服务端的搭建使用docker来进行安装这样会比较快和省事。这里采用的思路是先下载一个基础的nacos镜像不配置数据卷。下载完毕后将默认的配置文件cp出来进行更改然后删除原容器。从新启动一个新的镜像。 第一步下载基础镜像 docker run \
--name my-nacos -d \
-p 8848:8848 \
nacos/nacos-server:v2.0.4新建文件夹然后将镜像内的配置文件cp到我们的文件夹 mkdir -p /apps/nacos/logs/
mkdir -p /apps/nacos/conf/
cd /apps/nacos/conf/
docker cp my-nacos:/home/nacos/conf/application.properties ./第二步修改本地的配置文件 这个本地配置文件是指刚刚我们从容器内部cp出来的配置文件更改下面几项即可这里的数据库放在了第四步 注意spring.datasource.platform 这个配置项在后面的版本进行了变更变为了spring.sql.init.platform(好像是2.2.3开始变得) spring.datasource.platformmysql
db.num1
db.url.0jdbc:mysql://192.168.*.*:3306/nacos_config?characterEncodingutf8zeroDateTimeBehaviorconvertToNulluseSSLfalseallowMultiQueriestrueuseJDBCCompliantTimezoneShifttrueuseLegacyDatetimeCodefalseserverTimezoneAsia/Shanghai
db.user.0root
db.password.0root第三步: 重启nacos 注意这里是以单机模式来运行的重启完成后可以去看看日志是否启动正常了如果正常直接访问即可ip:8848/nacos 注意这里是无法直接访问的登录会提示用户名和密码错误nacos/nacosf12会看到具体错误请看后面的“登录报错”来进行解决。 docker run \
--name my-nacos -d \
-p 8848:8848 \
--env PREFER_HOST_MODEip --env MODEstandalone \
-v /apps/nacos/logs:/home/nacos/logs \
-v /apps/nacos/conf/application.properties:/home/nacos/conf/application.properties \
nacos/nacos-server:v2.0.4第四步数据库创建 下面是数据库、表不过还是推荐去官网下载包自己找防止sql有变化 官网下载地址https://github.com/alibaba/nacos/releases?page3 数据库脚本相对地址./nacos-server-1.4.1/nacos/conf/nacos-mysql.sql /******************************************/
/* 数据库全名 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,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的集群模式很简单只需要两步操作即可 1.保证多个结点的数据库配置一致配置文件一致nacos基于数据库实现 这个点无需多说保证一致即可2.更改配置信息这里使用的是docker可以直接在启动命令上进行变更 增加如下配置// 声明集群模式
--env MODEcluster
// 这个解决ip展示问题和集群无关
--networkhost
// 声明其他节点信息无需写自己的多节点逗号隔开
--env NACOS_SERVERS10.3.8.135:8848,10.3.8.136:8848更改后的完整命令如下// 节点1启动命令
docker run \
-p 8848:8848 \
--name my-nacos -d \
--networkhost \
--env PREFER_HOST_MODEip --env MODEcluster \
--env NACOS_SERVERS192.168.150.185:8848 \
-v /apps/nacos/logs:/home/nacos/logs \
-v /apps/nacos/conf/application.properties:/home/nacos/conf/application.properties \
nacos/nacos-server:v2.0.4// 节点2命令
docker run \
-p 8848:8848 \
--name my-nacos -d \
--networkhost \
--env PREFER_HOST_MODEip --env MODEcluster \
--env NACOS_SERVERS192.168.150.148:8848 \
-v /apps/nacos/logs:/home/nacos/logs \
-v /apps/nacos/conf/application.properties:/home/nacos/conf/application.properties \
nacos/nacos-server:v2.0.4搭建完成后进入nacos可以在集群管理中看到我们的集群 特别注意登录报错 注意nacos现在安装完毕以后是肯定登录不了的登录时f12 会提示这个错误caused: The specified key byte array is 0 bits which is not secure enough for any JWT HMAC-SHA algorithm.The JWT JWA Specification(RFC 7518, Section 3.2)states that keys used with HMAC-SHA algorithms MUST have a size256 bits(the key size must be greater 这需要我们为配置文件增加一个默认配置现在nacos官方删除了这个默认配置有安全隐患万一把地址暴露到公网别人用这个秘钥访问你就会有隐患所以需要我们自己添加到application.properties中不添加是登录不了的也无法使用。 # 秘钥可自行更改我试了2.0.4和1.4.6版本都是无法直接登录的demo测试日期2023.09 ,后面配置参数可能会变化如果不行建议官网查下参数
nacos.core.auth.default.token.secret.keySecretKey012345678901234567890123456789012345678901234567890123456789nacos官方文档nacos官方文档 这是官方文档位置我下载的是1.4.6和2.0.4也是没有这个参数的这个描述有点坑爹
2.注册中心-客户端搭建 第一步添加依赖 增加依赖项因为父工程已经声明了依赖版本所以这里直接添加依赖即可 !-- nacos注册中心客户端父工程引入了cloud的包管理这里无需声明具体包--
dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId
/dependency第二步修改配置文件 当前版本已无需在启动类增加注解EnableDiscoveryClient了当然加了也不会报错。我们只需要配置好配置文件就ok了。 server:port: 8001# nacos中的服务名默认读取的是spring.application.name
# 如果需要自定义则需要通过spring.cloud.nacos.discovery.service-name来指定
spring:application:name: order-servercloud:nacos:# 这里配置集群时启动时默认只会连接其中一个但是若是有节点挂掉可以自动切换到另外的结点server-addr: 192.168.150.185:8848,192.168.150.148:8848user-name: nacos # 这是默认值password: nacos # 这是默认值namespace: public # 这是默认值 以上是基础配置配置完成后启动服务即可成功注册 特别注意 1.可以不添加启动类注解EnableDiscoveryClient2.当前版本的nacos已默认不集成Ribbon之前版本默认集成Ribbon3.配置集群时虽然声明多个结点但启动项目只会往其中一个去注册只有注册的结点挂了才会自动切换到另一个结点4.真实场景中若是配置nginx的集群一般不会直接在配置文件中声明集群而是通过ngxin来做负载均衡实现集群nginx的负载这里就不介绍了。
3.注册中心-管理页面
1.命名空间和分组的概念 其实都是为了服务分组来设置出的概念主要是看怎么用nacos设计之初估计想的是命名空间作为环境区分分组用来作为服务区分但是在使用时因为不同环境都是搭建了不同的nacos服务所以一般我们不使用命名空间作为环境区分基本都是使用分组的概念来对服务进行区分。2.服务详情-保护阈值 这个的设定主要是为了做“雪崩保护”使用的。这个值只能设定在0-1之间。假如我们设定的是0.5假如我们有三个节点。那么若是当存活服务/总服务,的值小于0.5时就会触发雪崩保护雪崩保护会启用所有节点即使该节点不在线。雪崩保护主要是为了防止所有请求都打到一个结点上导致整个集群全部宕机的风险。前面说过nacos服务端30s收不到心跳会下线nacos客户端这个下线只会下线临时节点我们注册的结点信息都是临时节点若是想要服务一直存在我们可以注册非临时节点雪崩保护只有我们注册的是非临时节点才有可能触发。下面是非临时节点的注册方式spring:application:name: order-servercloud:nacos:# 这里配置集群时启动时默认只会连接其中一个但是若是有节点挂掉可以自动切换到另外的结点server-addr: 192.168.150.185:8848,192.168.150.148:8848discovery:ephemeral: false # 是否是临时实例,若是false,则即使服务端超过30s没有收到心跳也不会剔除而是永久存在3.服务想起-权重 这个就是负载的权重了权重值越高调用的次数就会越多粗略算法可以采用当前的权重除以所有节点的权重之和。4.服务下线 这里的服务下线大概20s之后会起作用nacos客户端会定时拉取服务端的列表下线后的服务虽然是健康的但是不会被nacos客户端拉取到本地。
4.注册中心-常用配置
下面是和nacos相关的一些常用配置了。大部分其实使用默认值即可无需更改
# nacos中的服务名默认读取的是spring.application.name
# 如果需要自定义则需要通过spring.cloud.nacos.discovery.service来指定
spring:application:name: order-servercloud:nacos:# 这里配置集群时启动时默认只会连接其中一个但是若是有节点挂掉可以自动切换到另外的结点server-addr: 192.168.150.185:8848,192.168.150.148:8848user-name: nacos # 这是默认值password: nacos # 这是默认值namespace: public # 这是默认值discovery:ephemeral: true # 是否是临时实例,若是false,则即使服务端超过30s没有收到心跳也不会剔除而是永久存在group: DEFAULT_GROUP # 默认值service: ${spring.application.name} # 默认值weight: 1 # 权重默认值1namespace: public # 命名空间默认值publicaccess-key: # 访问秘钥默认值空,只有部署在阿里云时才需要,上云就会用到secret-key: # 访问秘钥默认值空,只有部署在阿里云时才需要watch:enabled: true # 是否开启心跳监听默认值trueheart-beat-interval: 5000 # 心跳间隔默认值5000
5.注册中心-核心功能总结
服务注册这是基础功能没什么说的nacos会将注册的ip、端口等元数据信息存储在一个map中服务心跳nacos客户端默认每5s向服务端发送一次心跳防止被剔除服务同步nacos集群间会相互同步实例保证相互间信息一致性服务发现nacos客户端调用服务提供者时会向nacos服务端发送rest请求以获取服务列表并将其存储在本地同时本地会定时更新缓存的服务列表服务健康检查nacos服务端对于超过15秒没有做心跳的客户端会将其down如果30秒仍未收到则会强制下线 nacos注册中心工作流程 1.nacos客户端启动时注册自己到达nacos服务2.nacos客户端定时从服务端拉取服务列表缓存到本地定时更新3.nacos客户端调用服务提供者时是通过本地的注册表和负载均衡来调用远端服务的4.nacos客户端守护线程默认5s一次心跳发送给服务端5.nacos服务端守护线程默认15s收不到客户端心跳将客户端状态置为false30s收不到就会删除注册的实例
三、Nacos注册中心集成Load Balancer 、OpenFeign
1.Nacos客户端集成负载均衡Load Balancer
在nacos2.0.3之前他的客户端默认是集成了Ribbon的且Ribbon的配置也是打开的但是2.0.3之后就给关了。原因也是因为Ribbon已经闭源作为Ribbon的开发者网非已经不对他进行更新。
# 这是nacos2.0.3之后的默认配置在这之前nacos是默认集成ribbon且使用ribbon的
spring:cloud:loadbalancer:ribbon:enabled: false # 关闭ribbon 但是作为负载均衡组件其实就是那几种负载策略所以新的东西还是那几种轮询、随机、权重、hash、最少连接并且Ribbon的负载做的也挺好为什么不接着更新呢再写一个类似的感觉不是更消耗吗而且现在Springcloud官方推荐的Load Balancer到现在为止也就只支持两种负载还是最简单的轮询和随机。但是没得选啊我们只能用Load Balancer了。
1.第一步引入Load Balancer组件!-- 引入loadbalancer负载均衡父工程引入了cloud的包管理这里无需声明具体包--
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-loadbalancer/artifactId
/dependency2.在RestTemplate上增加LoadBalancer注解 因为默认情况下RestTemplate是没有实现的所以需要我们手动生成但是也无需提供任务参数直接默认构造即可。import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;/*** author pcc*/
Configuration
public class SysConfig {/*** 创建RestTemplate* param builder 构造器这个restTemplate主要是测试使用* 加入feign后将不在使用restTemplate进行测试* return*/BeanLoadBalancedpublic RestTemplate getRestTemplate(RestTemplateBuilder builder) {return builder.build();}
}这样其实基础使用就ok了就可以实现通过nacos中的服务名来调用服务提供者了同时还有负载均衡策略在里面。为什么加入LoadBalancer或者Ribbon就可以直接使用RestTemplate了呢因为无论是LoadBalancer还是Ribbon都是属于客户端负载均衡的策略而这类负载均衡都是通过将注册中心的实例拉取到本地以后才能进行计算负载的策略所以我们增加了负载均衡时他就会自动拉取我们的注册中心的实例从而就认识了我们写的RestTemplate中的服务名了如下
RequestMapping(/addOrder)
public void addOrder(){log.info(add order start );// 只有增加了负载均衡才能使用RestTemplate识别到注册中心的服务名restTemplate.getForObject(http://stock-server/stock/addStock,String.class);
}3.更换LoadBalancer的负载策略 LoadBalancer默认使用轮询的负载我们这里更换为随机的负载到目前为止只支持两种。我们需要自定义一个配置类该配置类用以生产一个负载均衡的对象然后将其交给LoadBalancerClients注解事实上如果我们不需要更换负载策略这个配置LoadBalancer是可以省略的如下import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;/*** author pcc* 注意类上别加configuration注解*/
public class RandomLoadBalancerConfig {Beanpublic ReactorLoadBalancerServiceInstance randomLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory){// 获取注册中心所有实例String property environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);// 对实例进行负载return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(property, ServiceInstanceListSupplier.class),property);}
}然后启动类上增加LoadBalancer的注解即可了import com.cheng.orderserver.config.RandomLoadBalancerConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClients;LoadBalancerClients(defaultConfiguration RandomLoadBalancerConfig.class)
SpringBootApplication
public class OrderServerApplication {public static void main(String[] args) {SpringApplication.run(OrderServerApplication.class, args);}}以上就是更换负载的全部操作了更改完成重启就会生效了。就使用上确实比Ribbon麻烦一些。不过无论是LoadBalancer还是Ribbon都是基于http的负载这个通讯效率其实是不高的在这个方面Dubbo是好很多的这个不做过多研究没必要如果想研究可以去深研负载均衡算法。
2.Nacos客户端集成OpenFeign
注册中心、负载均衡、远程调用这是实现微服务的最基础的三个组件使用了他们三个才能算是搭建了一个微型的服务其他组件都是为了让服务更好的运行来设计的只有他们三个是缺一不可最基础的三个也是最没有看头的三个nacos需要很少的配置就可以使用至于LoadBalancer可以直接引入包就会默认使用。也就OpenFeign场景会多些。先说下基础使用
1.引入jar包!--引入OpenFign父工程引入了cloud的包管理这里无需声明具体包--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactId/dependency2.写FeignClient接口类 这个类可以当成是一个Controller来写且必须和我们调用的接口的方法名、参数、返回等保持完全一致否则无法调通这里需要注意 name传入被调用服务的名称也就是注册中心中服务注册的名字path相当于类路径上的RequestMapping可以不写不写的话方法上就声明全路径 import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;/*** author pcc* name用以声明feign调用的服务这个必须与注册中心服务名保持一致* path控制器上的类路径,如果不写path在方法上写全路径也是一样的**/
FeignClient(name stock-server,path /stock)
public interface StockFeignController {RequestMapping(/addStock)void addStock();
} 3.启动类增加注解EnableFeignClientsimport com.cheng.orderserver.config.RandomLoadBalancerConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClients;
import org.springframework.cloud.openfeign.EnableFeignClients;EnableFeignClients
// 不加自定义负载这个配置就可以不要
LoadBalancerClients(defaultConfiguration RandomLoadBalancerConfig.class)
SpringBootApplication
public class OrderServerApplication {public static void main(String[] args) {SpringApplication.run(OrderServerApplication.class, args);}}4.使用和普通的注入到Spring容器中的接口一样使用import com.cheng.orderserver.feign.StockFeignController;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** author pcc*/
Slf4j
RestController
RequestMapping(/order)
public class OrderController {AutowiredStockFeignController stockFeignController;RequestMapping(/addOrder)public void addOrder(){log.info(add order start );// 添加完feign以后就不需要restTemplate了stockFeignController.addStock();}
}这样就实现了OpenFeign的简单使用当然了这支持最基础的功能使用下面来看一下略深一点的功能也都是生产会用到的一些场景。
3 OpenFien调用日志配置
在开发或者调试过程中有时候排查过程还是需要对Feign的调用过程进行打印的因此掌握他的日志配置还是很有必要的。这里可以分为全局和局部两种配置。不过无论是使用全局还是使用局部都有一个前提那就是更改Spring的默认日志级别我们知道Spring的默认日志级别是info级别的。但是OpenFeign的日志打印的都是debug所以我们必须调整Spring的展示日志级别我们才可以看到想看的日志不过调整的话我们也是可以局部调整的而不用全局调整。如下所示
# 日志级别配置
# 使用feign日志时必须要设置下面的配置注意下面配置是Spring的默认全局info我们这里可以
# 指定对应文件夹下的日志为debug这样就不会全局debug了这个配置指向哪个包哪个包就是debug了
# 也可以指向一个类
logging:level:
# com.cheng.orderserver.feign: debugcom.cheng: debug加上这个配置后指定包下面的日志界别就会变成debug了注意是当前包下的所有日志都是以debug级别进行输出。下面看下OpenFeign如何设置全局和局部的日志配置。 1.全局日志配置 全局日志配置我们只需要在配置了Spring的日志上面说的的基础上增加一个配置类即可如下 import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** author pcc*/
Configuration
public class FeignConfig {Beanpublic Logger.Level getLoggerLevel() {return Logger.Level.FULL;}
}下面是结果 2.局部日志配置-配置类 若是感觉全局日志太多我们可以只针对某一个feign调用类进行配置直接使用上一步的配置文件去掉他的Configuration注解有这个注解就会全局生效然后将其交给feign类的FeignClient注解即可。如下 import feign.Logger;
import org.springframework.context.annotation.Bean;/*** author pcc*/
public class FeignConfig {Beanpublic Logger.Level getLoggerLevel() {return Logger.Level.FULL;}
}下面是feign类配置 import com.cheng.orderserver.config.FeignConfig;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;/*** author pcc* name用以声明feign调用的服务这个必须与注册中心服务名保持一致* path控制器上的类路径,如果不写path在方法上写全路径也是一样的* configuration配置类可以配置一些公共的参数,只对当前类下的接口生效属于局部配置**/
FeignClient(name stock-server,path /stock,configuration FeignConfig.class)
public interface StockFeignController {RequestMapping(/addStock)void addStock();
}2.局部日志配置-配置文件 使用配置文件的话看着更清晰明了一些。上面我们设置的都是 Logger.Level.FULL这其实只是Feign日志的一种级别Feign其实有四个级别 ① NONE什么信息也不打用了等于没用② BASIC只打印基础信息如下图③ HEADERS只打印头部信息如下图线程场景中我们会在请求头传递一些token类的信息打印出来还是有用的④ FULL打印BASIC和HEADERS中的信息如下图就是FULL的展示信息 这里的局部配置的配置文件配置我们就用BASIC进行展示 feign:client:config:stock-server: # 这里是被调用的服务名注册中心里的名称loggerLevel: BASIC # 这里使用BASIC表示只打印请求方法名和URL不打印请求头和响应头 如上所示就是OpenFeign的日志配置的全部内容了一般调试信息或者排查问题是有用的。如果想要展示Feign的日志。也要严格限定只开启Feign目录下的debug日志不然Spring提供的debug日志可是很多的很容易把磁盘打满。此外还需要注意若是既配置了全局又配置了局部那以谁为准呢注意是以局部为准很多框架都是这种局部配置大于全局
3 OpenFeign超时时间配置
这里的配置也是分为全局和局部两种其实和上面是类似的全局的配置我们需要新增一个配置类使用上面的全局配置类就行就行了如实局部配置有两种选择一种是和上面一样放到feign类的FeignClient注解里一种是放到配置文件里都差不多。超时时间配置支持两项一个是connetct,一个是read的。
1.全局配置import feign.Logger;
import feign.Request;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** author pcc*/
Configuration
public class FeignConfig {/*** 设置feign的日志级别** FULL: 所有请求和响应* HEADERS: 请求和响应的头信息* BASIC: 请求方法、url、响应状态码和执行时间* NONE: 默认,啥也没有* return 日志级别*/Beanpublic Logger.Level getLoggerLevel() {return Logger.Level.FULL;}/**** 设置feign的请求和响应的超时时间* return 请求配置*/Beanpublic Request.Options options(){return new Request.Options(5000, 5000);}
}此外服务提供者的接口增加一个线程睡眠6秒测试下测试结果如下 2 局部配置-配置类 配置文件还是使用上面的文件只需要把Configuration去掉然后把配置类交给feign类即可这个和日志的配置是一样的都是引用同一个配置文件import feign.Logger;
import feign.Request;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** author pcc*/
//Configuration
public class FeignConfig {/*** 设置feign的日志级别** FULL: 所有请求和响应* HEADERS: 请求和响应的头信息* BASIC: 请求方法、url、响应状态码和执行时间* NONE: 默认,啥也没有* return 日志级别*/Beanpublic Logger.Level getLoggerLevel() {return Logger.Level.FULL;}/**** 设置feign的请求和响应的超时时间* return 请求配置*/Beanpublic Request.Options options(){return new Request.Options(5000, 5000);}
}然后我们在feign类上指明局部配置类注意局部配置优先级大于全局若同时配置的话局部配置生效。import com.cheng.orderserver.config.FeignConfig;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;/*** author pcc* name用以声明feign调用的服务这个必须与注册中心服务名保持一致* path控制器上的类路径,如果不写path在方法上写全路径也是一样的* configuration配置类可以配置一些公共的参数,只对当前类下的接口生效属于局部配置**/
FeignClient(name stock-server,path /stock,configuration FeignConfig.class)
//FeignClient(name stock-server,path /stock) // 取消feign的局部配置使用配置文件
public interface StockFeignController {RequestMapping(/addStock)void addStock();
}2 局部配置-配置文件 这种就不需要依赖配置文件了只需要提供yml中的配置信息即可如下feign:client:config:stock-server: # 这里是被调用的服务名注册中心里的名称# 注意日志配置必须配合Spring的日志配置才可以生效loggerLevel: BASIC # 这里使用BASIC表示只打印请求方法名和URL不打印请求头和响应头connectTimeout: 5000 # 连接超时时间默认10sreadTimeout: 5000 # 读取超时时间默认60s以上就是超时的配置了。
4 OpenFeign自定义拦截器配置
拦截器在java生态里都差不多都是对请求或者响应进行处理的这里是对OpenFeign的请求进行处理我们可以增加一些日志信息可以改变请求参数可以增加请求头信息等等。在实际应用中可能会存在使用该拦截器往请求头里进行信息设置从而追踪日志的调用链路的场景。因为分布式服务的调用日志时跨服务的怎么确定日志是哪一条就可以通过这种方式来实现当然市面上有比较好的解决方案有时候不需要我们自己做但原理都是类似的。这里同样是支持全局和局部配置的而且与上面的日志、超时配置其实都差不多。 1 全局配置 先要自己实现一个Interceptor自己的Interceptor需要实现OpenFeign的RequestInterceptor重写他的apply方法从这里可以看出OpenFeign底层还是RestTemplate。都是http请求。 import feign.RequestInterceptor;
import feign.RequestTemplate;
import lombok.extern.slf4j.Slf4j;import java.util.UUID;/*** author pcc*/
Slf4j
public class FeignInterceptor implements RequestInterceptor {Overridepublic void apply(RequestTemplate requestTemplate) {log.info(进入到了OpenFeign自定义拦截器了);requestTemplate.header(trace_id, UUID.randomUUID().toString());}
}声明好拦截器以后我们把他注入到Spring中就行这样机会全局生效了。 import com.cheng.orderserver.interceptor.FeignInterceptor;
import feign.Logger;
import feign.Request;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** author pcc*/
Configuration
public class FeignConfig {/*** 设置feign的日志级别** FULL: 所有请求和响应* HEADERS: 请求和响应的头信息* BASIC: 请求方法、url、响应状态码和执行时间* NONE: 默认,啥也没有* return 日志级别*/Beanpublic Logger.Level getLoggerLevel() {return Logger.Level.FULL;}/**** 设置feign的请求和响应的超时时间* return 请求配置*/Beanpublic Request.Options options(){return new Request.Options(5000, 5000);}/*** 配置feign的拦截器* 将其交给Spring即可*/Beanpublic FeignInterceptor feignInterceptor() {return new FeignInterceptor();}
}这样就会对所有的feign接口进行拦截了如下截图 2 局部配置-配置类 这里和上面两种说的局部配置没有区别就不重复演示了将配置类取消Configuration注解然后使用FeignClient指明配置类即可。 2 局部配置-配置文件 自己写拦截器这一步是无法省略的然后我们可以将拦截器交给指定的服务这样就只会拦截指定的服务了。 feign:client:config:stock-server: # 这里是被调用的服务名注册中心里的名称# 注意日志配置必须配合Spring的日志配置才可以生效loggerLevel: BASIC # 这里使用BASIC表示只打印请求方法名和URL不打印请求头和响应头connectTimeout: 5000 # 连接超时时间默认10sreadTimeout: 5000 # 读取超时时间默认60srequestInterceptors: # 请求拦截器可以添加多个com.cheng.orderserver.interceptor.FeignInterceptor # 这里指定的是拦截器的全限定名 像下面这样配置也是可以的 feign:client:config:stock-server: # 这里是被调用的服务名注册中心里的名称# 注意日志配置必须配合Spring的日志配置才可以生效loggerLevel: BASIC # 这里使用BASIC表示只打印请求方法名和URL不打印请求头和响应头connectTimeout: 5000 # 连接超时时间默认10sreadTimeout: 5000 # 读取超时时间默认60srequestInterceptors[0]: # 请求拦截器可以添加多个com.cheng.orderserver.interceptor.FeignInterceptor # 这里指定的是拦截器的全限定名 以上都是openfeign的扩展功能了在性能等上面其实没啥影响。都是写辅助功能。
三、Nacos配置中心
Nacos的服务端都是共用的这里就不重复进行展示了只说下配置中心客户端的具体情况
1.配置中心-客户端搭建
客户端搭建差不多都是三步走导入依赖配置文件使用。基本都差不多当然这里需要我们配置远端服务了。 1.导入依赖 这里依赖包注意是两个一个是nacos-config的一个是bootstrap的nacos-config的配置必须配置在bootstrap中否则不生效。所以我们需要导入两个包。注意要确认包导入完毕了不然启动肯定会报错找不到要解析的注意的配置信息。比如使用Value进行注入配置会告诉你这个配置信息解析不了。 !-- nacos配置中心客户端--
dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-config/artifactId
/dependency!-- 引入bootstrap依赖,不引入这个依赖是无法使用bootstrap配置文件的 --
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-bootstrap/artifactId
/dependency2.增加配置文件bootstrap.yml 添加如下配置这个配置其实在配置nacos配置中心时其实已经写过了与application.yml一样没有任何区别但是放到application.yml的话配置是不生效的。下面是直接从applicaion.yml复制过来的配置无需任何改动就可以使用 spring:application:name: order-server # nacos配置中心和注册中心默认都是用这个作为默认名称cloud:nacos:# 这里配置集群时启动时默认只会连接其中一个但是若是有节点挂掉可以自动切换到另外的结点# 这里只配置一个不然虚拟机ip一变没有配置静态ip集群多个结点就相互注册不到对方了所以用一个结点# server-addr: 192.168.150.187:8848,192.168.150.188:8848server-addr: 192.168.150.187:8848user-name: nacos # 这是默认值password: nacos # 这是默认值namespace: public # 这是默认值3.配置中心增加配置文件 这里需要注意 默认配置文件的后缀是properties若是不增加配置在服务端必须选择properties的类型配置文件不增加额外配置的话nacos默认的配置文件名是其中prefix默认取得是spring.application.namespring.profiles.active就是springboot支持的多文件配置不写的话默认就是空file-extension是nacos扩展名也就是文件后缀名的配置默认是properties。所以当我们不添加任何配置时默认是“服务名.properties”作为配置文件名spring.profiles.active不配置的话会包含前面的-一起省略。官方文档参考naocs官方文档-springcloud${prefix}-${spring.profiles.active}.${file-extension}所以这里我们在nacos配置中心的文件名应该叫order-server。文件类型选择properties 编辑完发布即可。 4.使用nacos配置信息 这里就是使用了使用的话还是很简单的和application.yml使用没有任何区别。这里使用Value进行注入验证 import com.cheng.orderserver.feign.StockFeignController;
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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** author pcc*/
Slf4j
RestController
RequestMapping(/order)
public class OrderController {AutowiredStockFeignController stockFeignController;Value(${name})String name;RequestMapping(/addOrder)public void addOrder(){log.info(add order start :{},name);stockFeignController.addStock();}
}下面是接口输出截图 到这里客户端的基础搭建就ok了我们已经可以读取到配置中心的文件了。然后就可以将本地的配置信息同步到nacos配置中心了。
2.配置中心-管理页面
其实都是写基础功能需要说的也不是很多 1.Data Id data id就是配置文件的名称客户端默认是spring.application.name 也可以手动指定。不指定默认就是spring.application.name一般都是使用默认没人去更改这个。 2.namespace 和 group 这个和注册中心的概念是一样的都是为了做区分的怎么使用都是看自己一般场景使用namespace作为环境隔离使用group作为应用隔离dataid 作为服务隔离。不过实际场景中很少有人将生产和测试使用同一套nacos。所以命名空间一般都是不使用或者就是建造一个自己用的命名空间。group就要看情况了若是一个中台有很多应用。是可以使用group进行区分应用的再用dataid来区分同应用下的不同服务。 3.编辑、克隆、导出、导入 这些都是基本配置可以更方便的进行配置信息的管理没啥好说的 4.历史版本 这个可以对文件的历史版本 回溯并还原历史版本。类似git的功能。这个还是有用的 5.监听查询 这里需要注意并不是说有服务在使用这个配置文件监听查询中就可以看到对应服务的测试服务启动和配置变更时都会服务均未正常出现在监听列表内可能是bug。
3.配置中心常用配置
nacos有两个默认配置文件也就是说我们不添加任何配置的话nacos也会去服务端寻找这两个配置文件进行加载在指定的命名空间和分组下。注意这里指的都是服务端的文件名和文件是yml配置文件还是properties配置文件没有任何关系。那是哪两个呢
1.${spring.application.name}2.${spring.application.name}.${file-extension}
若是我们服务名是order-server则nacos客户端默认会去服务端加载这两个配置文件order-server、order-server.properties注意这里是找的是文件名这里的properties是指文件名的后缀与文件的配置格式是不是properties没有关系也就是说你可以在nacos服务端起个order-server.properties的名字dataid然后里面是yml配置文件这也是ok的。虽然可以但是别这么干很容易让接收项目的兄弟吐槽你不专业一般保持一致方便区分。特别需要注意的是若是在order-server、order-server.properties都添加了相同的配置则使用的是order-server.properties的配置。order-server.properties的优先级更高。 下面是不添加任何配置时服务启动的日志 可以看到nacos为我们默认加载这两个文件如果加载不到也不会报错的只是会在之前的日志里提示空文件。那这个默认后缀properties是如何来的呢请看下面10.1
3.1 文件扩展名配置file-extension
服务端默认使用properties作为服务扩展名若是想要变更则客户端必须进行指定指定的话使用该配置进行指定下面是不增加这个配置时的客户端启动的日志
可以发现nacos客户端会扫描两个服务端的配置文件一个是order-server另一个是order-server.properties。下面新增file-extension的配置注意位置此时切记不可以在config下重新声明namespace这会导致无法正常寻找到配置文件。namespace和user-name、password都应该声明在nacos下而不是config下。此外还需要注意file-extension修改的是dataid的名字与文件内部是yml和properties都没有关系内部文件的类型我们可以随便指定但是一般为了可维护性更高会保持一致。
# 已省略与此处关系不大的配置
spring:cloud:nacos:config:
# namespace: public # 这里不可以重复这么些写了就无法正常加载配置文件file-extension: yaml # 默认是properties若是yaml需要配置这个这里我虽然增加了file-extension的配置但是我在服务端并没有增加这个文件所以提示加载不到。当我们提供了这个文件后就不会有这个提示了 这个日志文件告诉我们nacos客户端会从哪些服务端配置文件加载配置 注意这个配置是针对默认配置文件${spring.application.name}.${file-extension}和${spring.application.name}-${spring.profiles.active}.${file-extension}有用若是使用指定dataid方式进行加载时则无需遵循这个规则这个后面10.5细说。 特別注意查阅资料说config下支持namesapce的配置但是亲测这里配置命名空间以后服务是无法读取到对应的配置信息的所以若是需要更改namespace还是在nacos配置属性中更改不要在config中更改这里nacos客户端2.0.4
3.2 使用profile进行多环境文件配置
这是何种场景下使用的呢若是对所有配置文件不区分环境都放在了一起就像写SpringBoot项目时不使用配置中心一样此时我们需要声明
application-dev.ymlapplication-uat.ymlapplication-prd.yml
多个环境的不同文件然后使用
spring:profiles:active: dev # 这个配置声明在application和bootstrap都是可以的bootstrap优先级高这个配置来指明当前使用的到底是哪个文件但是使用nacos完全没有必要这么写的。一般不同环境的配置文件在nacos服务端是不会放一起的都是使用不同的nacos集群。所以这个场景一般不这么用不过nacos是支持这种配置的以防止有些人就是想要放一起。前面说过nacos加载的配置文件默认是
${prefix}-${spring.profiles.active}.${file-extension}当我们增加了如上的配置以后nacos默认会读取以下三个配置文件假设file-extension是yaml
order-server 这是默认读取也是nacos默认的配置文件无需任何配置会直接读取该配置文件order-server.yaml 这个也会默认读取注意文件后缀order-server-dev.yaml 若是新增了profile的配置就会根据环境读取对应的配置文件了这里dataid必须完全匹配才可以包括后缀所以服务端应该有这个文件
重启服务验证下是不是读的这些配置文件 可以看到正常去加载这些配置文件了配置文件的使用都是一样的就不具体说了唯一需要特殊说明的是他们的配置优先级。在Springcloud中bootstrapapplication-profileapplication这里基本是一样的。他们三个是 order-server-dev.yaml order-server.yaml order-server 建议不要这么使用因为nacos一般根据集群区分环境而不是都放到一个nacos服务端这样不是好的配置文件管理方式。那我们该怎么管理不同的环境下不同的地址呢我们一般是通过本地的profile配置文件来管理而不是远端放到一起。假如我们存在三个环境dev、uat、prd。则我们需要本地提供这么三个文件
bootstrap-dev.ymlbootstrap-uat.ymlbootstrap-prd.yml
这里需要注意三点
1.为什么使用bootstrap-dev.yml而不是使用application-dev.yml 因为nacos配置中心客户端的信息必须配置在bootstrap中配置在application中不会生效所以必须使用bootstrap-dev.yml其他同理。2.我们不同环境地址放到对应的文件中即可 不同环境的服务启动服务时可以通过传入profile的参数来指定使用的配置文件(或者将这个信息配置到服务器上也是可以的)传入的配置优先级大于配置文件中默认指定的。如下# 使用-- 来覆盖配置信息使用-- 必须参数放在jar后面
java -jar ./order-server.jar --spring.profiles.activedev
# 使用-D 来覆盖配置信息这种写法优先级更高且位置没有要求
java -jar -Dspring.profiles.activedev ./order-server.jar3.bootstrap-dev.yml等文件中不可重复声明spring.profiles.active 这里不可以重复声明否则SpringBoot无法正常加载配置
3.3 配置更新禁用
nacos客户端默认每10ms去服务端查看下配置有无变更通过比对MD5的值来进行校验。变更的话就会进行重新拉取。这个操作默认是开启的使用nacos的原因一部分也是因为他的动态感知能力所以一般不会有人去禁用这个的除非是一些服务配置不希望随便被更改的这些都是些特殊场景了。
# 已省略关系不大配置
spring:cloud:nacos:config:
# namespace: public # 这里不可以重复这么些写了就无法正常加载配置文件file-extension: yaml # 默认是properties若是yaml需要配置这个refresh-enabled: true # 默认是true,nacos每10ms去服务端比对信息有误变化这个场景想要验证需要配合RefreshScope注解来实现这个注解下面会详细说下他的作用就是将使用了配置中心的属性或者对象放到一个context中一旦配置中心改变就会热加载这个配置。当上面的配置未配置时我们使用这个RefreshScope是可以是实现热加载的但是加了refresh-enabledfalse以后就不会有热加载了。原因就是因为nacos客户端不会再每10ms去服务端比对信息变化了。
3.4 config的namespace和group
查阅资料说config下支持namesapce的配置但是亲测这里配置命名空间以后服务是无法读取到对应的配置信息的所以若是需要更改namespace还是在nacos配置属性中更改不要在config中更改这里nacos客户端2.0.4
spring:cloud:nacos:namespace: dev # 这是默认值config:
# namespace: dev # 这里不可以重复这么些写了就无法正常加载配置文件若是在config中进行更改namespace则无法正常加载配置信息。不过在config中声明group却是可以正常加载的。nacos服务端允许同namespace下存在不同group的同名文件。 这种是可以正常加载到配置信息的。
3.5 指定配置文件: shared-configs
项目中肯定会碰到有一些公共配置信息是需要我们进行共享的对于这部分信息若是在每个配置文件都配置一遍则是很low的一个动作而且一旦发生变更我们需要每个配置文件都去改一下一旦漏了一个就是事故了。所以主流的配置中心都有这个功能就是共享配置文件用以配置一些所有服务或者多个服务共享的信息。nacos里可以通过shared-configs来进行配置共享信息。注意
1.shared-configs的文件名后缀不受上面说的file-extension配置的限制可以自由指定2.shared-configs的group默认是DEFAULT_GROUP也不受config配置下的group的限制虽然这个shared-configs放在了config下。3.shared-configs默认不动态加载服务端变更必须更改默认值为true4.shared-configs支持多个默认配置文件多个默认配置文件的加载顺序是按照声明的顺序加载的若是多个文件存在相同配置则后加载的会进行覆盖之前已经加载的信息5.shared-configs的优先级很低假如服务是order-server优先级是这样的bootstraporder-server-dev.ymlorder-server.ymlorder-servershared-configs
假如有一个公共的配置文件叫common.yaml 应该像如下进行配置
# 已省略关系不大的配置
spring:cloud:nacos:config:shared-configs:- data-id: common.yaml # 这里配置多个可以配置多个配置文件但是要保证文件名不能重复refresh: true # 默认是fase也就是不会动态去刷新配置文件group: DEFAULT_GROUP # 默认值shared-configs是一个数组Springboot中数组的配置支持两种一种是- 来进行配置元素一种是使用下标来配置来配置使用下标应该这么写
spring:cloud:nacos:config:shared-configs[0]:data-id: common.yaml # 这里配置多个可以配置多个配置文件但是要保证文件名不能重复refresh: true # 默认是fase也就是不会动态去刷新配置文件group: DEFAULT_GROUP # 默认值使用验证与之前都没有区别不重复举例了。
3.5 指定配置文件: extension-configs
extension-configs和shared-configs基本一样包括上面说的shared-configs的内容都适用于extension-configs。他们区别主要是加载优先级不一样。加载优先级 extension-configs shared-configs 。而 extension-configs 与其他文件相比同样是最低的。 使用和shared-configs没有任何区别这里简单举例
# 已省略关系不大的配置
spring:cloud:nacos:config:shared-configs[0]:data-id: common.yaml # 这里配置多个可以配置多个配置文件但是要保证文件名不能重复refresh: true # 默认是fase也就是不会动态去刷新配置文件group: DEFAULT_GROUP # 默认值extension-configs:- data-id: common2.yaml # 同样也可以配置多个但是要保证文件名不能重复refresh: true # 默认是fase也就是不会动态去刷新配置文件group: DEFAULT_GROUP # 默认值3.6 配置文件变动热加载RefreshScope
配置文件配置的信息他的变化是可以被服务实时感知到的前面也说了nacos客户端每10ms会去服务端做一次配置文件MD5的比对若是发现变更了则会从新拉取配置信息到本地。但是我们虽然拉到本地了但是Spring加载信息的动作只会执行一次所以我们一般使用Value获取的信息并无法直接随着我们的变更而变更。此时我们就需要RefreshScope注解了
RefreshScope用于类上整个类下从nacos获取的配置信息都会动态更新RefreshScope用于方法动态刷新的范围是方法 使用的话也很简单直接放在类上或者方法上即可。
Slf4j
RestController
RequestMapping(/order)
RefreshScope
public class OrderController {
}如此当nacos服务端配置变动时信息就会实时更新到Value上了。RefreshScope是config提供的注解而不是nacos的nacos是按照这一标准进行实现了。
四、总结
Nacos作为当下最流行的注册中心和配置中心的解决方案是必须掌握的一项技能本文旨在总结基础的使用从Nacos注册中心开始继承RestTemplate实现负载然后使用OpenFeign代替RestTemplate等。后面对配置中心的使用进行了进一步总结比较需要关注的是多文件配置以及共享文件配置的shared-configs、extension-configs以及支持动态刷新配置到已加载配置的变量或者对象中的配置RefreshScope。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/928548.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!