Java最全Hystrix 实战经验分享,看完必懂

面试结束复盘查漏补缺

每次面试都是检验自己知识与技术实力的一次机会,面试结束后建议大家及时总结复盘,查漏补缺,然后有针对性地进行学习,既能提高下一场面试的成功概率,还能增加自己的技术知识栈储备,可谓是一举两得。

以下最新总结的阿里P6资深Java必考题范围和答案,包含最全MySQL、Redis、Java并发编程等等面试题和答案,用于参考~

重要的事说三遍,关注+关注+关注!

历经30天,说说我的支付宝4面+美团4面+拼多多四面,侥幸全获Offer

image.png

更多笔记分享

历经30天,说说我的支付宝4面+美团4面+拼多多四面,侥幸全获Offer

本文已被CODING开源项目:【一线大厂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个章节的知识。

image

image

image

image

关于阿里内部都在强烈推荐使用的“K8S+Docker学习指南”—《深入浅出Kubernetes:理论+实战》、《权威指南-第一本Docker书》,看完之后两个字形容,爱了爱了!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

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书》,看完之后两个字形容,爱了爱了!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 28
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值