WHY
没有配置之前,修改一个东西要修改代码。管理起来很乱。效率低下。扩展难。Ip密码等存储不安全
背景
配置,应用程序启动和运行时,读取的一些信息,动态调整程序行为,比如需要从哪里连接数据库,缓存多长时间过期等。具有以下特点:
只读,程序不允许更改配置
伴随应用的整个生命 周期
加载方式多样化,程序硬编码,环境变量,启动参数,配置文件(当前最流行),数据库(通常作为配置中心存储介质)
程序硬编码,难以维护,每次更新必修重新打包,真实开发并不推荐。
环境变量,分布式服务器之间不可复用。
启动参数,可读性查,尤其在配置项太多的时候,更是难以阅读。
基于这样的缺陷,配置文件成为了管理配置的不二之选,并且可以用数据库作为存储介质,加以妥善维护。
无论采用什么方式,配置需要管理。
过去传统的单体应用里,一个应用程序具有自己的配置文件,但当单体引用拆分成各个微服务后,配置文件也被拆开,并且拆开后,各个微服务配置文件之间,还会存在冗余。
因此,需要一个专门的服务器来统一管理配置文件,使得配置文件和具体服务在组织上解耦,实现配置文件的扩展和复用。
Nacos 配置中心,正是提供了这样的一个解决方案
WHAT
动态配置服务可以让您以中心化、外部化和动态化的方式管理所有的环境应用配置和服务配置,可以动态通过修改配置文件中的值,从而影响服务应用结果或者服务的运行。
动态配置消除了配置变更时更新部署应用和服务的需要,让配置管理变得更高效和敏捷。
配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。
配置中心是Nacos众多功能之一,为微服务模式的应用开发提供了配置统一化管理工具,是Nacos一个强大的卖点。本文将从诞生背景,类似方案对比,以及核心管理模型展开介绍,并在应用上,以spring-clound-alibaba为列介绍最核心的配置文件拉取。
相关方案
当前构建配置中心解决方案:
apollo,携程提供,功能最全面
spring cloud config,集成Netfix公司提出的配置中心技术,由于依赖git,所以性能很差
nacos,性能最好,功能略逊apollo,但针对大型应用开发仍然够用
功能对比:
性能对比:
Nacos配置管理模型
配置文件存放Nacos配置中心服务器,而配置管理模型,反映了各个应用服务拉取配置文件的方式。就是: Namaspace-> Group->DataId
DataId,标识一个配置文件,里面包含各个配置项的集合,可以用多种格式,比如yml, ymal, properties等。
group,就是配置文件的分类,分类采用的语意按实际情况而定,比如根据项目区分。
namespace,对group的分类,分类采用的语意按实际情况而定,通常采用隔离的语意,按照部署环境做划分。
一个通常的实践:
dataId,Group, Namespace均可以在nacos配置中心后台管理页面进行建立。
Nacos 典型应用
此处选择集成了nocas的相关实现方案的spring-clound-alibaba,其具有spring-boot开箱即用的优势,开发简单,规避实现nacos繁琐的技术细节,让开发者集中在nacos核心功能的应用开发上。
获取配置文件
各个服务的bootstrap.yml编写以下代码,用nacos的配置管理模型定位到配置文件,获的配置项,并在代码里用@Value注解获取配置项的值
其中,
server-addr: 必填
file-extension: 配置文件扩展名,必填
namespace: 非必填,默认是nacos配置中心public空间的id
group:非必填,默认是DEFAULT_GROUP
————————————————
版权声明:本文为CSDN博主「tuoxia7735」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/tuoxia7735/article/details/126263756
HOW
https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-config 实现配置的动态变更。
1/ spring-cloud-starter-alibaba-nacos-config
2/ 在bootstap.yml配置nacos server地址
之所以需要配置 spring.application.name ,是因为它是构成 Nacos 配置管理 dataId字段的一部分
name: @artifactId@ 动态生成
saas-network-pc-test.yml
3、通过springcloud注解@RefreshScore实现配置自动更新
@RestController
@RequestMapping(“/config”)
@RefreshScope
public class ConfigController {
@Value(“${useLocalCache:false}”)
private boolean useLocalCache;
@RequestMapping(“/get”)
public boolean get() {
return useLocalCache;
}
}
WHERE
Yml properties
-pc-service-test.ymlDEFAULT_GROUP
1、application.yml
spring:
profiles:
active: local #local dev test prod决定取得是哪个环境的配置
fuxi-plus: #远程fuxi变量
app-id: 123
app-key: abc
logging:
level:
com.alibaba.nacos: warn #日志等级配置为warn
2、pc-service-.yml
#数据源
spring:
datasource:
type: com.zaxxer…#springBoot默认采用HikariDataSource数据源
driver-class-name: com.mysql.cj.jdbc.Driver #新驱动类
username:
password:
url: jdbc:mysql://?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai
redis:
host:
port:
password:
sms:
login:
template-code: #登录短信code
redis-prefix: ‘adm:’
expire: 300
interval: 60
length: 6
aliyun: #服务器及镜像配置
access-key-id:
access-key-secret:
region-id: cn
sms-key-id:
sms-key-secret:
sms-key-region: cn-
oss:
endpoint: http://oss-cn.aliyuncs.com
bucket-name: -test
domain: https://-test.oss-cn…com
policy:
expire: 300
maxSize: 10
dir:
prefix: lego//images/
feign:
client:
config:
default:
connect-timeout: 100000 #连接超时
read-timeout: 100000 #读取超时
sys: http:/:80 #lego-merchant子服务
server:
task-url: http://:80 #子服务
brand-url: http://:80
report-url: http://:80
collect-url: http://:80
network-pc-url: http://:80 #自己服务
analysis-url: http://:31519
data: #远程数据地址调用
sscm-url: http://-test-.com
url: http://huawei-t.com
poi-url: http://:80/poi
city-url: http://:80/city
mall-url: http://:80/
model-url: http://:80/
scheduler-url: 123
brand-url: http://:80/
wm-url: http://:80/
shop-model-url: 23
#请求处理的超时时间 :8109
ribbon.ReadTimeout:
#请求连接的超时时间
ribbon.ConnectTimeout: 120000
upload: # 上传文件
file:
prefix: lego/dev/apk/
maxSize: 60
#mq topic tag
report:
config:
saasBrandTopic: -SAAS-
saasTopicTagRunReport: -BRAND
#报告钉钉消息密钥
brand:
config:
barndAuditTopic: -BRAND
barndAuditTag: -BRAND
dingTopic: TOPIC–
dingTag: DING–BRAND
brandReviewTopic: TOPIC–
brandReviewTag: TAG—AUDIT
#加密及屏蔽的环境
gateway.secret.key:
env.encrypt.profile: ,test
data-encode-service-addr: 😕/:80
report.clean.config:
fuxi-plus:
app-key: 123
app-id: 123
#mq服务器信息及消费标识
rocketmq:
accessKey:
secretKey:
nameSrvAddr:
consumerGroups:
corpid:
token:
aesKey:
mch:
ding:
encryptKey: +
dingAesKey:
dingToken:
3、bootstrap.yml
server:
port: #启动端口
spring:
application:
name: @artifactId@
cloud:
nacos:
discovery:
server-addr: #地址
register-enabled: true #开启注册中心
namespace: #命名空间
metadata:
preserved.heart.beat.interval: 5000
preserved.heart.beat.timeout: 5000
preserved.register.source: “”
preserved.ip.delete.timeout: 5000
config:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
file-extension: yml
#命名空间
namespace:
4、bootstrap-test.yml
部署Nacos的集群,其中NGINX的作用是分发请求到各个Nacos服务器,做到负载均衡。k8s使用TCP协议
nacos集群搭建
https://blog.csdn.net/qq_44027353/article/details/125828993
日志
nacos日志级别为warn
aop实现日志切面
Plain Text
@Slf4j
@Aspect
@Component
public class SaasSysLogAspect {
private static final int INPUT_PARAMS_MAX_LENGTH = 500;
@Pointcut("execution(public * com..*.controller.*.*(..))")
public void pointCut() {
}/*** 前置织入** @param joinPoint*/
@Before(value = "pointCut()")
public void before(JoinPoint joinPoint) {Object[] args = joinPoint.getArgs();String logContent = this.getRequestContent(args);if (StringUtils.isNotBlank(logContent)) {log.info(logContent);}
}
上一篇:算法的时间复杂度与空间复杂度介绍
下一篇:算法基础---搜索与图论