技术标签: 微服务 配置 dubbo Dubbo Nacos 热部署
假设Nacos服务已经搭建完成
9d0c9401-f575-4427-a982-eb8637a652b0
为区别命名空间的ID,自动生成。<!-- nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.file-extension=yml
spring.application.name=service-config
spring.cloud.nacos.config.namespace=9d0c9401-f575-4427-a982-eb8637a652b0
# 项目启动nacos配置信息打印级别,info会打印出配置信息
logging.level.com.alibaba.cloud.nacos.client.NacosPropertySourceBuilder=warn
@RestController
@RefreshScope
public class TestNacosController {
@Value("${top.fsn.id}")
private String id;
@RequestMapping("test")
public String test() {
return id;
}
}
该注解支持动态更新配置文件中数据,无需重启服务。另外,该注解及实现方式也是SpringCloud下,通过拓展Spring下的Scope(作用域)接口进行实现。其注解代码如下:
ScopedProxyMode
(就姑且叫代理模型吧)对象。关于代理模型有如下四种类型(实际就三种)。@Target({
ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Scope("refresh")
@Documented
public @interface RefreshScope {
/**
* @see Scope#proxyMode()
* @return proxy mode
*/
ScopedProxyMode proxyMode() default ScopedProxyMode.TARGET_CLASS;
}
public enum ScopedProxyMode {
/**
* Default typically equals {@link #NO}, unless a different default
* has been configured at the component-scan instruction level.
*/
// 与NO类型一样,表示不使用代理
DEFAULT,
/**
* Do not create a scoped proxy.
* <p>This proxy-mode is not typically useful when used with a
* non-singleton scoped instance, which should favor the use of the
* {@link #INTERFACES} or {@link #TARGET_CLASS} proxy-modes instead if it
* is to be used as a dependency.
*/
NO,
/**
* Create a JDK dynamic proxy implementing <i>all</i> interfaces exposed by
* the class of the target object.
*/
// 使用 jdk dynamic proxy(基于接口的代理)
INTERFACES,
/**
* Create a class-based proxy (uses CGLIB).
*/
// 使用 CGLIB 做代理(基于目标类)
TARGET_CLASS;
}
public class RefreshScope extends GenericScope implements ApplicationContextAware,
ApplicationListener<ContextRefreshedEvent>, Ordered
eagerlyInitialize
初始化。这个方法有一处不明白,讲道理,这个void方法,如果是我写,判断bean不为null,我直接return了,还getClass干嘛。。但是最近看过why大佬的一篇关于return null文章,顿时茅塞顿开。
if (bean != null) {bean.getClass();}
# AbstractBeanFactory#doGetBean
Object scopedInstance = scope.get(beanName, () -> {
beforePrototypeCreation(beanName);
# GenericScope #get
@Override
public Object get(String name, ObjectFactory<?> objectFactory) {
BeanLifecycleWrapper value = this.cache.put(name,
new BeanLifecycleWrapper(name, objectFactory));
this.locks.putIfAbsent(name, new ReentrantReadWriteLock());
try {
return value.getBean();
}
catch (RuntimeException e) {
this.errors.put(name, e);
throw e;
}
}
private ConcurrentMap<String, ReadWriteLock> locks = new ConcurrentHashMap<>();
NacosContextRefresher#registerNacosListenersForApplications
其中 tenant=9d0c9401-f575-4427-a982-eb8637a652b0,即命名空间随出来的字符串标识
public void addListeners(String dataId, String group, List<? extends Listener> listeners) {
group = null2defaultGroup(group);
CacheData cache = addCacheDataIfAbsent(dataId, group);
for (Listener listener : listeners) {
cache.addListener(listener);
}
}
```cpp
public CacheData addCacheDataIfAbsent(String dataId, String group, String tenant) throws NacosException {
// ...
synchronized (cacheMap) {
CacheData cacheFromMap = getCache(dataId, group, tenant);
if (null != cacheFromMap) {
cache = cacheFromMap;
// reset so that server not hang this check
cache.setInitializing(true);
} else {
cache = new CacheData(configFilterChainManager, agent.getName(), dataId, group, tenant);
// fix issue # 1317
if (enableRemoteSyncConfig) {
String[] ct = getServerConfig(dataId, group, tenant, 3000L);
cache.setContent(ct[0]);
}
}
Map<String, CacheData> copy = new HashMap<String, CacheData>(this.cacheMap.get());
copy.put(key, cache);
cacheMap.set(copy);
}
LOGGER.info("[{}] [subscribe] {}", agent.getName(), key);
MetricsMonitor.getListenConfigCountMonitor().set(cacheMap.get().size());
return cache;
}
class LongPollingRunnable implements Runnable {
// ...
@Override
public void run() {
// ...
try {
// check failover config
// ...
// check server config
// ...
}
}
话说这种设计方式有点绕。。。
public ClientWorker(final HttpAgent agent, final ConfigFilterChainManager configFilterChainManager,
final Properties properties) {
this.agent = agent;
this.configFilterChainManager = configFilterChainManager;
// Initialize the timeout parameter
init(properties);
this.executor = Executors.newScheduledThreadPool(1, new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(r);
t.setName("com.alibaba.nacos.client.Worker." + agent.getName());
t.setDaemon(true);
return t;
}
});
this.executorService = Executors
.newScheduledThreadPool(Runtime.getRuntime().availableProcessors(), new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(r);
t.setName("com.alibaba.nacos.client.Worker.longPolling." + agent.getName());
t.setDaemon(true);
return t;
}
});
this.executor.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
try {
checkConfigInfo();
} catch (Throwable e) {
LOGGER.error("[" + agent.getName() + "] [sub-check] rotate check error", e);
}
}
}, 1L, 10L, TimeUnit.MILLISECONDS);
}
1.startswith判断字符串是否以某个字符或字符串开头#! /usr/bin/env python# -*- coding: utf-8 -*-str1 = "sdssd"#判断str1是否以sds开头,结果返回Trueprint str1.startswith("sds")#判断str1是否以s开头,结果返回Trueprint str1.startswith("s"...
导读:「眼界大开 声临其境」技术系列课第三期。网易易盾资深计算机视觉算法工程师胡宜峰带来了主题为《视频深度伪造检测技术在内容安全领域的探索与实践》技术分享。讲师简介:胡宜峰,网易易盾资深计算机视觉算法工程师,主要负责图像和视频 AI 算法在内容安全领域的研发、落地和优化。在违禁、涉政、暴恐内容识别、logo 识别、图像检索、视频深度鉴伪等多个领域有丰富的研发和项目落地经验。AI 技术应用的「双刃剑」效应AI 是近些年热度颇高的词汇,并实实在在地渗入了生活的方方面面,如:AI+安.
代码可理解性/可读性***代码的可理解性、可读性,需要考虑以下几个方面: 是否遵循特定的命名规范?是否足够的注释/说明?是否足够的内聚性?方法是否太长或太短、是否容易理解? 代码的命名:是否具有自描述性?不看注释就可以理解其含义 是否足够简洁?太长的变量名降低效率 度量方式:所有标识符的平均长度、代码复杂度、代码行数、注释的密度(%)***可读性的重要性:相比...
概述Prometheus是一个开源的服务监控系统,它通过HTTP协议从远程的机器收集数据并存储在本地的时序数据库上。它提供了一个简单的网页界面、一个功能强大的查询语言以及HTTP接口等等。Prometheus通过安装在远程机器上的exporter来收集监控数据,这里用到了以下两个exporter:node_exporter – 用于机器系统数据 mysqld_exporter – 用于M...
winsocket通信原始套接字sock_rawping程序实现
oracle vm virtualbox centos7 安装oracle 19c RAC来公司已经一个多星期了,因为之前在学校学的是开发,所以运维对于我来说上手比较难,上来就是安装oracle19c,刚听到安装数据库时,感觉很开心,因为之前安装一个软件步骤特别简单,然而事与愿违,你想的终究不是你能得到的,哈哈哈。在此过程中遇到了各种各样的错误,N次百度,N次请求导师帮助,下面是我在本次安装的步骤及遇到的错误。 希望能让大家在安装过程中少走弯路。一、环境准备网上都有下载链接,很简单。oracle
[NOIP2016]换教室 D1 T3Description对于刚上大学的牛牛来说, 他面临的第一个问题是如何根据实际情况中情合适的课程。在可以选择的课程中,有2n节课程安排在n个时间段上。在第 i ( 1≤ i≤n)个时同段上, 两节内容相同的课程同时在不同的地点进行, 其中, 牛牛预先被安排在教室 ci上课, 而另一节课程在教室 di进行。在不提交任何申请的情况下...
相信很多人对win10的系统自动更新功能很烦,有时候更新的最新驱动不一定适用本机系统,所以在这里小编为大家解决永久关闭系统更新功能。1.打开系统注册表编辑使用快捷键windows+R 打开cmd命令框,输入regedit进入注册表编辑进入注册表之后按照小编图片步骤寻找HKEY_LOCAL_MACHINE中的SYSTEM中的ControlSet001中的Services如图所示:然后往下拉,找到wuauserv选项中的Parameters点击后在右侧找到该选项并右键选择***修改***在
全局Toast/Loading问题在Flutter开发中,全局的Toast/Loading很狗血,实现已有的实现方法都不是很人性化。最近在Dio做请求拦截器的时候Overlay一直获取不到context,每个页面进入都存一遍很不方便,如果在MaterialApp中存context,那么调用Navigator.of(context).pushReplacementNamed等removeUtils...
这篇文章主要介绍了VSCode 格式化缩进代码的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。1)文件 —> 首选项因为 VsCode 默认启用了根据文件类型自动设置tabsize的选项,在设置中添加:"editor.detectIndentation": false2)编辑器配置在项目文件中新建 .editorc...
转载网址:http://ltian.javaeye.com/写本文的目的不是为了炫耀技术,而是为了坚定大家采用FLex+Java开发企业级应用的信心。这是我们为供电企业开发的核心软件——电力营销系统。系统目前情况(截止2009-4月)已经正式运行5个月(从2008年12月1日开始上线)。在4月28日,第二个用户已经开始正式使用这个用电营销系统。这个系统采用Flex作为展现层开发技术,J