赞
踩
先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
builder.setNamespace(namespace).setAppName(config.getAppname())
.setInstanceId(config.getInstanceId())
.setAppGroupName(config.getAppGroupName())
.setDataCenterInfo(config.getDataCenterInfo())
.setIPAddr(config.getIpAddress()).setHostName(config.getHostName(false))
.setPort(config.getNonSecurePort())
.enablePort(InstanceInfo.PortType.UNSECURE,
config.isNonSecurePortEnabled())
.setSecurePort(config.getSecurePort())
.enablePort(InstanceInfo.PortType.SECURE, config.getSecurePortEnabled())
.setVIPAddress(config.getVirtualHostName())
.setSecureVIPAddress(config.getSecureVirtualHostName())
.setHomePageUrl(config.getHomePageUrlPath(), config.getHomePageUrl())
.setStatusPageUrl(config.getStatusPageUrlPath(),
config.getStatusPageUrl())
.setHealthCheckUrls(config.getHealthCheckUrlPath(),
config.getHealthCheckUrl(), config.getSecureHealthCheckUrl())
.setASGName(config.getASGName());
…省略…
//添加元数据信息
// Add any user-specific metadata information
for (Map.Entry<String, String> mapEntry : config.getMetadataMap().entrySet()) {
String key = mapEntry.getKey();
String value = mapEntry.getValue();
// only add the metadata if the value is present
if (value != null && !value.isEmpty()) {
builder.add(key, value);
}
}
//构建服务注册实例对象
InstanceInfo instanceInfo = builder.build();
//设置服务租约对象
instanceInfo.setLeaseInfo(leaseInfoBuilder.build());
return instanceInfo;
这里创建了2个对象
通过InstanceInfo.Builder 构建 InstanceInfo
通过LeaseInfo.Builder 构建LeaseInfo
com.netflix.appinfo.LeaseInfo
该对象用来描述服务的续约信息
,比如约定的心跳周期,租约有效期,最近一次续约时间等,也是通过InstanceInfoFactory.create
来创建(见上面)源码如下
@JsonRootName(“leaseInfo”)
public class LeaseInfo {
public static final int DEFAULT_LEASE_RENEWAL_INTERVAL = 30;
public static final int DEFAULT_LEASE_DURATION = 90;
// Client settings
//客户端:续约间隔周期时间 30/s 心跳机制
private int renewalIntervalInSecs = DEFAULT_LEASE_RENEWAL_INTERVAL;
//客户端:续约有效时长超过 90s续约失败(服务端会剔除该实例)
private int durationInSecs = DEFAULT_LEASE_DURATION;
// Server populated
//服务端: 服务端设置该租约第一次续约时间
private long registrationTimestamp;
//服务端: 服务端设置该租约最后一次续约时间
private long lastRenewalTimestamp;
//服务端: 服务端设置该租约被剔除时间
private long evictionTimestamp;
//服务端: 服务端设置该服务上线 up 时间
private long serviceUpTimestamp;
这些参数用来维持续约心跳,心跳周期,续约有效期,最近一次续约时间,最后一次续约时间
等
org.springframework.cloud.client.ServiceInstance
服务发现的抽象接口,约定了服务发现的实例应用有哪些通用的信息,是spring cloud对service discovery的实例信息的抽象接口,该接口可以适配多种注册中心如:Eureka,Zookepper,Consul ,源码如下
/**
Represents an instance of a Service in a Discovery System
@author Spencer Gibb
*/
public interface ServiceInstance {
/**
服务ID
*/
String getServiceId();
/**
服务主机
*/
String getHost();
/**
服务端口
*/
int getPort();
/**
是否开启https
*/
boolean isSecure();
/**
服务的URI地址
*/
URI getUri();
/**
实例的元数据信息
*/
Map<String, String> getMetadata();
/**
*/
default String getScheme() {
return null;
}
}
com.netflix.appinfo.InstanceInfo.InstanceStatus
用来表示服务实例的状态,状态有:UP上线,DOWN下线,STARTING运行中,OUT_OF_SERVICE下线,UNKNOWN未知
@ProvidedBy(EurekaConfigBasedInstanceInfoProvider.class)
@Serializer(“com.netflix.discovery.converters.EntityBodyConverter”)
@XStreamAlias(“instance”)
@JsonRootName(“instance”)
public class InstanceInfo {
…省略…
public enum InstanceStatus {
UP, // Ready to receive traffic
DOWN, // Do not send traffic- healthcheck callback failed
STARTING, // Just about starting- initializations to be done - do not
// send traffic
OUT_OF_SERVICE, // Intentionally shutdown for traffic
UNKNOWN;
public static InstanceStatus toEnum(String s) {
if (s != null) {
try {
return InstanceStatus.valueOf(s.toUpperCase());
} catch (IllegalArgumentException e) {
// ignore and fall through to unknown
logger.debug(“illegal argument supplied to InstanceStatus.valueOf: {}, defaulting to {}”, s, UNKNOWN);
}
}
return UNKNOWN;
}
}
com.netflix.discovery.shared.Application
Application : 一个Application代表一个应用,里面包含了应用实例列表,即:包含了多个InstanceInfo
实例,源码如下
/**
包含了应用实例列表
The application class holds the list of instances for a particular
application.
@author Karthik Ranganathan
*/
@Serializer(“com.netflix.discovery.converters.EntityBodyConverter”)
@XStreamAlias(“application”)
@JsonRootName(“application”)
public class Application {
private static Random shuffleRandom = new Random();
private String name;
@XStreamOmitField
private volatile boolean isDirty = false;
@XStreamImplicit
private final Set instances;
//无序状态实例列表
private final AtomicReference<List> shuffledInstances;
//map缓存服务ID 对应 实例关系
private final Map<String, InstanceInfo> instancesMap;
…省略…
/**
翻译:添加实例信息
Add the given instance info the list.
@param i
the instance info object to be added.
*/
public void addInstance(InstanceInfo i) {
instancesMap.put(i.getId(), i);
synchronized (instances) {
instances.remove(i);
instances.add(i);
isDirty = true;
}
}
/**
翻译:移出实例信息
Remove the given instance info the list.
@param i
the instance info object to be removed.
*/
public void removeInstance(InstanceInfo i) {
removeInstance(i, true);
}
/**
翻译:获取实例信息列表
Gets the list of instances associated with this particular application.
Note that the instances are always returned with random order after
shuffling to avoid traffic to the same instances during startup. The
shuffling always happens once after every fetch cycle as specified in
{@link EurekaClientConfig#getRegistryFetchIntervalSeconds}.
@return the list of shuffled instances associated with this application.
*/
@JsonProperty(“instance”)
public List getInstances() {
return Optional.ofNullable(shuffledInstances.get()).orElseGet(this::getInstancesAsIsFromEureka);
}
/**
通过id获取实例信息
Get the instance info that matches the given id.
@param id
the id for which the instance info needs to be returned.
@return the instance info object.
*/
public InstanceInfo getByInstanceId(String id) {
return instancesMap.get(id);
}
…省略…
该类中还提供了一些列方法:
void addInstance(InstanceInfo i
添加实例,
void removeInstance(InstanceInfo i)
移出实例,
List<InstanceInfo> getInstances()
获取实例列表,
InstanceInfo getByInstanceId(String id)
通过id获取实例
com.netflix.discovery.shared.Applications
这个是服务注册列表对象,该类包装了由eureka服务器返回的所有注册表信息,源码如下:
/**
翻译:该类包装了由eureka服务器返回的所有注册表信息
翻译: EurekaClientConfig#getRegistryFetchIntervalSeconds() 方法从 Eureak Server获取服务注册列表,然后对服务进行过滤,
按照(EurekaClientConfig#shouldFilterOnlyUpInstances())的规则过滤上线的服务
Note that the registry information is fetched from eureka server as specified
in {@link EurekaClientConfig#getRegistryFetchIntervalSeconds()}. Once the
information is fetched it is shuffled and also filtered for instances with
{@link InstanceStatus#UP} status as specified by the configuration
{@link EurekaClientConfig#shouldFilterOnlyUpInstances()}.
@author Karthik Ranganathan
*/
@Serializer(“com.netflix.discovery.converters.EntityBodyConverter”)
@XStreamAlias(“applications”)
@JsonRootName(“applications”)
public class Applications {
private static class VipIndexSupport {
final AbstractQueue instances = new ConcurrentLinkedQueue<>();
final AtomicLong roundRobinIndex = new AtomicLong(0);
final AtomicReference<List> vipList = new AtomicReference<List>(Collections.emptyList());
public AtomicLong getRoundRobinIndex() {
return roundRobinIndex;
}
public AtomicReference<List> getVipList() {
return vipList;
}
}
private static final String STATUS_DELIMITER = “_”;
private String appsHashCode;
private Long versionDelta;
@XStreamImplicit
//注册成功的服务的集合
private final AbstractQueue applications;
//注册成功的服务的集合,名字和服务对应关系
private final Map<String, Application> appNameApplicationMap;
private final Map<String, VipIndexSupport> virtualHostNameAppMap;
private final Map<String, VipIndexSupport> secureVirtualHostNameAppMap;
/**
创建一个新的空的Eureka应用程序列表。
*/
public Applications() {
this(null, -1L, Collections.emptyList());
}
/**
这里是把注册成功的服务实例保存起来 registeredApplications是注册成功的实例
Note that appsHashCode and versionDelta key names are formatted in a
custom/configurable way.
*/
@JsonCreator
public Applications(@JsonProperty(“appsHashCode”) String appsHashCode,
@JsonProperty(“versionDelta”) Long versionDelta,
@JsonProperty(“application”) List registeredApplications) {
this.applications = new ConcurrentLinkedQueue();
this.appNameApplicationMap = new ConcurrentHashMap<String, Application>();
this.virtualHostNameAppMap = new ConcurrentHashMap<String, VipIndexSupport>();
this.secureVirtualHostNameAppMap = new ConcurrentHashMap<String, VipIndexSupport>();
this.appsHashCode = appsHashCode;
this.versionDelta = versionDelta;
//添加到 队列中 applications 和 appNameApplicationMap map中
for (Application app : registeredApplications) {
this.addApplication(app);
}
}
…省略…
/**
添加应用
Add the application to the list.
@param app
the <em>application</em> to be added.
*/
public void addApplication(Application app) {
appNameApplicationMap.put(app.getName().toUpperCase(Locale.ROOT), app);
addInstancesToVIPMaps(app, this.virtualHostNameAppMap, this.secureVirtualHostNameAppMap);
applications.add(app);
}
/**
获取所有注册成功的应用
Gets the list of all registered applications from eureka.
@return list containing all applications registered with eureka.
*/
@JsonProperty(“application”)
public List getRegisteredApplications() {
return new ArrayList(this.applications);
}
/**
根据名字获取注册成功的应用
Gets the list of all registered applications for the given
application name.
@param appName
the application name for which the result need to be fetched.
@return the list of registered applications for the given application
name.
*/
public Application getRegisteredApplications(String appName) {
return appNameApplicationMap.get(appName.toUpperCase(Locale.ROOT));
}
//总共有多个个实例
public int size() {
return applications.stream().mapToInt(Application::size).sum();
}
//把应用的顺序打乱
public void shuffleInstances(boolean filterUpInstances) {
shuffleInstances(filterUpInstances, false, null, null, null);
}
该类中制定了一些应用操作方法,主要如下
public void addApplication(Application app):
添加一个应用
public List<Application> getRegisteredApplications():
获取所有注册的应用
public Application getRegisteredApplications(String appName):
根据名字获取注册的应用
public int size()
:实例总和
实例管理器,在EurekaClientAutoConiguration中根据EurekaInstanceConfig和InstanceInfo创建得到ApplicationInfoManager,它的作用主要是来操作 InstanceInfo
, 主要提供了对服务实例状态的设置,eureka状态改变的监听,以及instanceinfo,LeaseInfo租约信息刷新
等等。
@Singleton
public class ApplicationInfoManager {
private static final Logger logger = LoggerFactory.getLogger(ApplicationInfoManager.class);
private static final InstanceStatusMapper NO_OP_MAPPER = new InstanceStatusMapper() {
@Override
针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。
上述的面试题答案都整理成文档笔记。 也还整理了一些面试资料&最新2021收集的一些大厂的面试真题(都整理成文档,小部分截图)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
tanceInfo , 主要提供了对服务实例
状态的设置,eureka状态改变的监听,以及instanceinfo,LeaseInfo租约信息刷新`等等。
@Singleton
public class ApplicationInfoManager {
private static final Logger logger = LoggerFactory.getLogger(ApplicationInfoManager.class);
private static final InstanceStatusMapper NO_OP_MAPPER = new InstanceStatusMapper() {
@Override
针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。
[外链图片转存中…(img-ZSRgIi1p-1713673160360)]
上述的面试题答案都整理成文档笔记。 也还整理了一些面试资料&最新2021收集的一些大厂的面试真题(都整理成文档,小部分截图)
[外链图片转存中…(img-iHX5uj2M-1713673160361)]
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-xcGbjpAE-1713673160361)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。