面试结束复盘查漏补缺
每次面试都是检验自己知识与技术实力的一次机会,面试结束后建议大家及时总结复盘,查漏补缺,然后有针对性地进行学习,既能提高下一场面试的成功概率,还能增加自己的技术知识栈储备,可谓是一举两得。
以下最新总结的阿里P6资深Java必考题范围和答案,包含最全MySQL、Redis、Java并发编程等等面试题和答案,用于参考~
重要的事说三遍,关注+关注+关注!
更多笔记分享
如上面HystrixDynamicProperty类描述中说的那样,需要对callback进行保存,并在在收到配置中心属性变更时触发这些属性的callback方法,来实现属性的动态变更。这块逻辑可以参照观察者模式进行设计实现。
代码如下:
private abstract static class CustomDynamicProperty implements HystrixDynamicProperty, PropertyObserver {
protected final String name;
protected final T defaultValue;
protected List callbacks;
protected CustomDynamicProperty(String propName, T defaultValue) {
this.name = propName;
this.defaultValue = defaultValue;
PropertyObserverManager.add(this);
}
@Override
public String getName() {
return name;
}
@Override
public void addCallback(Runnable callback) {
if (callbacks == null)
callbacks = new ArrayList<>(1);
this.callbacks.add(callback);
}
@Override
public String keyName() {
return name;
}
@Override
public void update(PropertyItem item) {
if(getName().equals(item.getName())) {
for(Runnable r : callbacks) {
r.run();
}
}
}
}
private static class StringDynamicProperty extends CustomDynamicProperty {
protected StringDynamicProperty(String propName, String defaultValue) {
super(propName, defaultValue);
}
@Override
public String get() {
return ConfigManager.getString(name, defaultValue);
}
}
private static class IntegerDynamicProperty extends CustomDynamicProperty {
protected IntegerDynamicProperty(String propName, Integer defaultValue) {
super(propName, defaultValue);
}
@Override
public Integer get() {
String configValue = ConfigManager.get(name);
if(StringUtils.isNotEmpty(configValue)) {
return Integer.valueOf(configValue);
}
return defaultValue;
}
}
private static class LongDynamicProperty extends CustomDynamicProperty {
protected LongDynamicProperty(String propName, Long defaultValue) {
super(propName, defaultValue);
}
@Override
public Long get() {
String configValue = ConfigManager.get(name);
if(StringUtils.isNotEmpty(configValue)) {
return Long.valueOf(configValue);
}
return defaultValue;
}
}
private static class BooleanDynamicProperty extends CustomDynamicProperty {
protected BooleanDynamicProperty(String propName, Boolean defaultValue) {
super(propName, defaultValue);
}
@Override
public Boolean get() {
String configValue = ConfigManager.get(name);
if(StringUtils.isNotEmpty(configValue)) {
return Boolean.valueOf(configValue);
}
return defaultValue;
}
}
其中ConfigManager类暂时默认为配置中心配置管理类,提供参数获取与参数监听器等功能。而PropertyObserver类(keyName/update方法属于其定义)、PropertyObserverManager类就是参照观察者模式定义实现的,负责观察者的注册与通知管理,来完成动态属性与配置中心变更通知间的联动。这两个类实现比较简单就不展示描述。
2、定义HystrixDynamicProperties实现类
===============================
基于第1步定义的HystrixDynamicProperty扩展类完成HystrixDynamicProperties的自定义。代码如下:
public class DemoHystrixDynamicProperties implements HystrixDynamicProperties {
@Override
public HystrixDynamicProperty getString(String name, String fallback) {
return new StringDynamicProperty(name, fallback);
}
@Override
public HystrixDynamicProperty getInteger(String name, Integer fallback) {
return new IntegerDynamicProperty(name, fallback);
}
@Override
public HystrixDynamicProperty getLong(String name, Long fallback) {
return new LongDynamicProperty(name, fallback);
}
@Override
public HystrixDynamicProperty getBoolean(String name, Boolean fallback) {
return new BooleanDynamicProperty(name, fallback);
}
}
3、注册SPI实现类
==========
在META-INF/services/添加名为
com.netflix.hystrix.strategy.properties.HystrixDynamicProperties的文本文件,内容为第2步HystrixDynamicProperties自定义实现类全路径名。
2.8.2 基于默认Archaius进行扩展
======================
Hystrix默认通过Archaius实现参数动态获取,而Archaius自身也提供自定义的参数获取方式,分别是 PolledConfigurationSource接口 和AbstractPollingScheduler类,其中PolledConfigurationSource接口表示配置获取源,AbstractPollingScheduler类表示配置定时刷新机制。
实现步骤如下:
1、创建配置获取源:
==========
public class CustomCfgConfigurationSource implements PolledConfigurationSource {
private final static String CONFIG_KEY_PREFIX = “hystrix”;
@Override
public PollResult poll(boolean initial, Object checkPoint) throws Exception {
Map<String, Object> map = load();
return PollResult.createFull(map);
}
private Map<String, Object> load() throws Exception{
Map<String, Object> map = new HashMap<>();
Set keys = ConfigManager.keys();
for(String key : keys) {
if(key.startsWith(CONFIG_KEY_PREFIX)) {
map.put(key, ConfigManager.get(key));
}
}
return map;
}
}
其实现非常简单,核心实现就是poll方法,遍历配置中心中所有hystrix开头的配置参数并返回保存。
2、定义配置刷新方式:
===========
public class CustomCfgPollingScheduler extends AbstractPollingScheduler {
private final static Logger logger = LoggerFactory.getLogger(“CustomCfgPollingScheduler”);
private final static String CONFIG_KEY_PREFIX = “hystrix”;
@Override
public void startPolling(PolledConfigurationSource source, final Configuration config) {
super.startPolling(source, config);
//
ConfigManager.addListener(new ConfigListener() {
@Override
public void eventReceived(PropertyItem item, ChangeEventType type) {
String name = item.getName();
if(name.startsWith(CONFIG_KEY_PREFIX)) {
String newValue = item.getValue();
//新增&修改
if(ChangeEventType.ITEM_ADDED.equals(type) || ChangeEventType.ITEM_UPDATED.equals(type)) {
addOrChangeProperty(name, newValue, config);
}
//删除
else if(ChangeEventType.ITEM_REMOVED.equals(type)) {
deleteProperty(name, config);
}
else {
logger.error(“error config change event type {}.”, type);
}
}
}
});
}
private void addOrChangeProperty(String name, Object newValue, final Configuration config) {
if (!config.containsKey(name)) {
config.addProperty(name, newValue);
} else {
Object oldValue = config.getProperty(name);
if (newValue != null) {
if (!newValue.equals(oldValue)) {
config.setProperty(name, newValue);
}
} else if (oldValue != null) {
config.setProperty(name, null);
}
}
}
private void deleteProperty(String key, final Configuration config) {
if (config.containsKey(key)) {
config.clearProperty(key);
}
}
@Override
protected void schedule(Runnable pollingRunnable) {
//IGNORE OPERATION
}
@Override
public void stop() {
//IGNORE OPERATION
}
}
AbstractPollingScheduler类默认要求是定义一个定时任务实现定时刷新配置,而其方法schedule和stop方法就是分别对应启动定时任务和结束任务。
但对应实际项目,通过定时刷新的方式一是不太实时,二是每次都得全量检查配置中心是否有修改,逻辑复杂,所以此处改用 ConfigManager.addListener 增加配置中心监听来实现。
3、定义并初始化自动配置:
=============
DynamicConfiguration dynamicConfiguration = new DynamicConfiguration(new CustomCfgConfigurationSource(), new CustomCfgPollingScheduler());
ConfigurationManager.install(dynamicConfiguration);
最后只需要在容器启动时执行以上初始化脚本即可。
细心的同学可能发现上面步骤中第3步,最终“安装”install到Hystrix配置管理类中的是 DynamicConfiguration类实现,且第2步的定时刷新类也比较鸡肋,就想着能否继续简化上面方案,只需要实现一个自定义的"DynamicConfiguration"就包含配置源获取与监听配置修改功能,实现如下:
public class CustomCfgDynamicConfiguration extends ConcurrentMapConfiguration {
private final static Logger logger = LoggerFactory.getLogger(“CustomCfgDynamicConfiguration”);
private final static String CONFIG_KEY_PREFIX = “hystrix”;
public CustomCfgDynamicConfiguration() {
super();
load();
initEvent();
}
/**
- 从配置中心全量加载Hystrix配置参数信息
*/
private void load() {
Set keys = ConfigManager.keys();
for(String key : keys) {
if(key.startsWith(CONFIG_KEY_PREFIX)) {
map.put(key, ConfigManager.get(key));
}
}
}
/**
- 通过配置中心监听事件回调处理,针对Hystrix配置参数变更进行同步
*/
private void initEvent() {
ConfigManager.addListener(new ConfigListener() {
最后
权威指南-第一本Docker书
引领完成Docker的安装、部署、管理和扩展,让其经历从测试到生产的整个开发生命周期,深入了解Docker适用于什么场景。并且这本Docker的学习权威指南介绍了其组件的基础知识,然后用Docker构建容器和服务来完成各种任务:利用Docker为新项目建立测试环境,演示如何使用持续集成的工作流集成Docker,如何构建应用程序服务和平台,如何使用Docker的API,如何扩展Docker。
总共包含了:简介、安装Docker、Docker入门、使用Docker镜像和仓库、在测试中使用Docker、使用Docker构建服务、使用Fig编配Docke、使用Docker API、获得帮助和对Docker进行改进等9个章节的知识。
关于阿里内部都在强烈推荐使用的“K8S+Docker学习指南”—《深入浅出Kubernetes:理论+实战》、《权威指南-第一本Docker书》,看完之后两个字形容,爱了爱了!
artsWith(CONFIG_KEY_PREFIX)) {
map.put(key, ConfigManager.get(key));
}
}
}
/**
- 通过配置中心监听事件回调处理,针对Hystrix配置参数变更进行同步
*/
private void initEvent() {
ConfigManager.addListener(new ConfigListener() {
最后
权威指南-第一本Docker书
引领完成Docker的安装、部署、管理和扩展,让其经历从测试到生产的整个开发生命周期,深入了解Docker适用于什么场景。并且这本Docker的学习权威指南介绍了其组件的基础知识,然后用Docker构建容器和服务来完成各种任务:利用Docker为新项目建立测试环境,演示如何使用持续集成的工作流集成Docker,如何构建应用程序服务和平台,如何使用Docker的API,如何扩展Docker。
总共包含了:简介、安装Docker、Docker入门、使用Docker镜像和仓库、在测试中使用Docker、使用Docker构建服务、使用Fig编配Docke、使用Docker API、获得帮助和对Docker进行改进等9个章节的知识。
[外链图片转存中…(img-oa8qPArS-1715304406329)]
[外链图片转存中…(img-4g1b9jo1-1715304406330)]
[外链图片转存中…(img-cqzDIfOB-1715304406330)]
[外链图片转存中…(img-0mu09L5B-1715304406330)]
关于阿里内部都在强烈推荐使用的“K8S+Docker学习指南”—《深入浅出Kubernetes:理论+实战》、《权威指南-第一本Docker书》,看完之后两个字形容,爱了爱了!