// 核心作用
// 导入具体的DiscoveryClient实现,例如: NacosDiscoveryClient
// DiscoveryClient: 可以获取所有实例信息,实例ID列表
@EnableDiscoveryClient
public class App {
}
@Import(EnableDiscoveryClientImportSelector.class)
public @interface EnableDiscoveryClient {
// 如果为true, ServiceRegistry将自动注册本地服务器
boolean autoRegister() default true;
}
@Order(Ordered.LOWEST_PRECEDENCE - 100)
public class EnableDiscoveryClientImportSelector extends SpringFactoryImportSelector<EnableDiscoveryClient> {
@Override
public String[] selectImports(AnnotationMetadata metadata) {
// 从Spring.factories文件中加载EnableDiscoveryClient类型的数据导入
String[] imports = super.selectImports(metadata);
// 获取EnableDiscoveryClient注解信息
AnnotationAttributes attributes = AnnotationAttributes.fromMap(metadata.getAnnotationAttributes(getAnnotationClass().getName(), true));
// 获取自动注册标识
boolean autoRegister = attributes.getBoolean("autoRegister");
// 如果是自动注册
if (autoRegister) {
// 导入工厂类以及自动注册的配置类
List<String> importsList = new ArrayList<>(Arrays.asList(imports));
/**
* {@link AutoServiceRegistrationConfiguration}
*/
importsList.add("org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationConfiguration");
imports = importsList.toArray(new String[0]);
} else {
// 如果不是自动注册
Environment env = getEnvironment();
if (env instanceof ConfigurableEnvironment configEnv) {
LinkedHashMap<String, Object> map = new LinkedHashMap<>();
// 设置自动注册的属性值为false
map.put("spring.cloud.service-registry.auto-registration.enabled", false);
// 将该属性添加到上下文环境对象中
MapPropertySource propertySource = new MapPropertySource("springCloudDiscoveryClient", map);
configEnv.getPropertySources().addLast(propertySource);
}
}
return imports;
}
// 开启标识: spring.cloud.discovery.enabled,默认为true
@Override
protected boolean isEnabled() {
return getEnvironment().getProperty("spring.cloud.discovery.enabled", Boolean.class, Boolean.TRUE);
}
// 存在默认的工厂类,能处理该注解,说明存在默认处理DiscoveryClient的类
// 默认为: SimpleDiscoveryClient,如果导入了其他的DiscoveryClient依赖,那么就会存在对应的DiscoveryClient实现
// 例如: Nacos -> NacosDiscoveryClient
@Override
protected boolean hasDefaultFactory() {
return true;
}
}
public abstract class SpringFactoryImportSelector<T> implements DeferredImportSelector, BeanClassLoaderAware, EnvironmentAware {
// Bean的类加载器
private ClassLoader beanClassLoader;
// 处理的注解类型(@EnableDiscoveryClient)
private Class<T> annotationClass;
// 上下文环境对象
private Environment environment;
protected SpringFactoryImportSelector() {
// 类中的泛型注解信息(@EnableDiscoveryClient)
this.annotationClass = (Class<T>) GenericTypeResolver.resolveTypeArgument(this.getClass(), SpringFactoryImportSelector.class);
}
@Override
public String[] selectImports(AnnotationMetadata metadata) {
// 如果没有开启,不处理
if (!this.isEnabled()) {
return new String[0];
}
// 获取注解的属性信息
AnnotationAttributes attributes = AnnotationAttributes.fromMap(metadata.getAnnotationAttributes(this.annotationClass.getName(), true));
/**
* 例如: 类似与这种效果,但是也可以通过其他方式,核心就是导入DiscoveryClient的实现
* <pre>
* org.springframework.cloud.client.discovery.EnableDiscoveryClient=\
* org.springframework.cloud.client.discovery.noop.NoopDiscoveryClientAutoConfiguration,\
* org.springframework.cloud.client.discovery.simple.SimpleDiscoveryClientAutoConfiguration,\
* org.springframework.cloud.netflix.eureka.EurekaDiscoveryClientConfiguration,\
* org.springframework.cloud.consul.discovery.ConsulDiscoveryClientConfiguration,\
* com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientConfiguration,\
* org.springframework.cloud.zookeeper.discovery.ZookeeperDiscoveryClientConfiguration,\
*</pre>
*/
// 从Spring.factories文件中加载EnableDiscoveryClient为Key的自动配置类
List<String> factories = new ArrayList<>(new LinkedHashSet<>(SpringFactoriesLoader.loadFactoryNames(this.annotationClass, this.beanClassLoader)));
// 如果为空并且不包含默认的处理DiscoveryClient的工厂类,抛出异常,意思是: 找到注解找不到DiscoveryClient实现
if (factories.isEmpty() && !hasDefaultFactory()) {
throw new IllegalStateException("Annotation @" + getSimpleName() + " found, but there are no implementations. Did you forget to include a starter?");
}
// 应该只有一个DiscoveryClient,但可能不止一个处理DiscoveryClient的工厂
if (factories.size() > 1) {
this.log.warn("More than one implementation " + "of @" + getSimpleName() + " (now relying on @Conditionals to pick one): " + factories);
}
// 导入从Spring.factories文件中加载EnableDiscoveryClient类型的数据
return factories.toArray(new String[factories.size()]);
}
// 给子类重写
// 默认不存在工厂类,无法处理该注解
protected boolean hasDefaultFactory() {
return false;
}
protected abstract boolean isEnabled();
}
@Configuration(proxyBeanMethods = false)
// 导入自动注册的配置类
@EnableConfigurationProperties(AutoServiceRegistrationProperties.class)
// spring.cloud.service-registry.auto-registration.enabled开启则导入AutoServiceRegistrationProperties配置类,默认为true
@ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled", matchIfMissing = true)
public class AutoServiceRegistrationConfiguration {
}
// 导入了依赖,会自动注册DiscoveryClient的实现,下面是各种实现之一
// org.springframework.cloud.client.discovery.EnableDiscoveryClient=\
// org.springframework.cloud.client.discovery.noop.NoopDiscoveryClientAutoConfiguration,\
// org.springframework.cloud.client.discovery.simple.SimpleDiscoveryClientAutoConfiguration,\
// org.springframework.cloud.netflix.eureka.EurekaDiscoveryClientConfiguration,\
// org.springframework.cloud.consul.discovery.ConsulDiscoveryClientConfiguration,\
// com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientConfiguration,\
// org.springframework.cloud.zookeeper.discovery.ZookeeperDiscoveryClientConfiguration,\
// 解析DiscoveryClient配置类,以Nacos为例
@Configuration(proxyBeanMethods = false)
// 对应的spring.cloud.discovery.enabled属性配置为true,才会加载,默认值都为true
@ConditionalOnDiscoveryEnabled
// 对应的spring.cloud.discovery.blocking.enabled属性配置为true,才会加载,默认值都为true
@ConditionalOnBlockingDiscoveryEnabled
// 对应的spring.cloud.nacos.discovery.enabled属性配置为true,才会加载,默认值都为true
@ConditionalOnNacosDiscoveryEnabled
// SimpleDiscoveryClientAutoConfiguration和CommonsClientAutoConfiguration需要在当前类加载之前加载
// 因为这两个配置是默认的提供的实现配置
@AutoConfigureBefore({SimpleDiscoveryClientAutoConfiguration.class, CommonsClientAutoConfiguration.class})
// NacosDiscoveryAutoConfiguration需要在当前类加载之后再进行加载
@AutoConfigureAfter(NacosDiscoveryAutoConfiguration.class)
public class NacosDiscoveryClientConfiguration {
// 导入Nacos的服务发现客户端实现
@Bean
public DiscoveryClient nacosDiscoveryClient(NacosServiceDiscovery nacosServiceDiscovery) {
return new NacosDiscoveryClient(nacosServiceDiscovery);
}
// 导入Nacos的监控类
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(value = "spring.cloud.nacos.discovery.watch.enabled", matchIfMissing = false)
public NacosWatch nacosWatch(NacosServiceManager nacosServiceManager, NacosDiscoveryProperties nacosDiscoveryProperties) {
return new NacosWatch(nacosServiceManager, nacosDiscoveryProperties);
}
// 网关心跳检测的事件发布器
// 使用定时线程池,在固定的时间间隔,发送心跳包
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(value = "spring.cloud.gateway.discovery.locator.enabled", matchIfMissing = false)
public GatewayLocatorHeartBeatPublisher gatewayLocatorHeartBeatPublisher(NacosDiscoveryProperties nacosDiscoveryProperties) {
return new GatewayLocatorHeartBeatPublisher(nacosDiscoveryProperties);
}
}
@Configuration(proxyBeanMethods = false)
@ConditionalOnDiscoveryEnabled
@ConditionalOnNacosDiscoveryEnabled
public class NacosServiceAutoConfiguration {
@Bean
public NacosServiceManager nacosServiceManager() {
return new NacosServiceManager();
}
}
@Configuration(proxyBeanMethods = false)
@ConditionalOnDiscoveryEnabled
@ConditionalOnNacosDiscoveryEnabled
public class NacosDiscoveryAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public NacosDiscoveryProperties nacosProperties() {
return new NacosDiscoveryProperties();
}
@Bean
@ConditionalOnMissingBean
public NacosServiceDiscovery nacosServiceDiscovery(NacosDiscoveryProperties discoveryProperties, NacosServiceManager nacosServiceManager) {
return new NacosServiceDiscovery(discoveryProperties, nacosServiceManager);
}
}
// Nacos服务发现
public class NacosServiceDiscovery {
// Nacos服务发现配置属性
private NacosDiscoveryProperties discoveryProperties;
// Nacos服务管理器
private NacosServiceManager nacosServiceManager;
public NacosServiceDiscovery(NacosDiscoveryProperties discoveryProperties, NacosServiceManager nacosServiceManager) {
this.discoveryProperties = discoveryProperties;
this.nacosServiceManager = nacosServiceManager;
}
// 根据实例ID返回所有的实例对象
public List<ServiceInstance> getInstances(String serviceId) throws NacosException {
String group = discoveryProperties.getGroup();
List<Instance> instances = namingService().selectInstances(serviceId, group, true);
// 将Nacos的实例信息转换为SpringCloud规定的实例信息
return this.hostToServiceInstanceList(instances, serviceId);
}
// 返回所有的实例名称
public List<String> getServices() throws NacosException {
String group = discoveryProperties.getGroup();
ListView<String> services = namingService().getServicesOfServer(1, Integer.MAX_VALUE, group);
return services.getData();
}
// 将Nacos的实例信息转换为SpringCloud规定的实例信息
public static List<ServiceInstance> hostToServiceInstanceList(List<Instance> instances, String serviceId) {
List<ServiceInstance> result = new ArrayList<>(instances.size());
// 遍历Nacos的实例信息
for (Instance instance : instances) {
// 将Nacos的实例信息转换为SpringCloud规定的实例信息
ServiceInstance serviceInstance = this.hostToServiceInstance(instance, serviceId);
if (serviceInstance != null) {
result.add(serviceInstance);
}
}
return result;
}
// 将Nacos的实例信息转换为SpringCloud规定的实例信息
public static ServiceInstance hostToServiceInstance(Instance instance, String serviceId) {
if (instance == null || !instance.isEnabled() || !instance.isHealthy()) {
return null;
}
NacosServiceInstance nacosServiceInstance = new NacosServiceInstance();
nacosServiceInstance.setHost(instance.getIp());
nacosServiceInstance.setPort(instance.getPort());
nacosServiceInstance.setServiceId(serviceId);
nacosServiceInstance.setInstanceId(instance.getInstanceId());
Map<String, String> metadata = new HashMap<>();
metadata.put("nacos.instanceId", instance.getInstanceId());
metadata.put("nacos.weight", instance.getWeight() + "");
metadata.put("nacos.healthy", instance.isHealthy() + "");
metadata.put("nacos.cluster", instance.getClusterName() + "");
if (instance.getMetadata() != null) {
metadata.putAll(instance.getMetadata());
}
metadata.put("nacos.ephemeral", String.valueOf(instance.isEphemeral()));
nacosServiceInstance.setMetadata(metadata);
if (metadata.containsKey("secure")) {
boolean secure = Boolean.parseBoolean(metadata.get("secure"));
nacosServiceInstance.setSecure(secure);
}
return nacosServiceInstance;
}
// 获取Nacos的名称服务对象,该对象负责管理所有的服务实例,包括注册,取消注册
private NamingService namingService() {
return nacosServiceManager.getNamingService();
}
}
// Nacos的服务发现客户端
public class NacosDiscoveryClient implements DiscoveryClient {
public static final String DESCRIPTION = "Spring Cloud Nacos Discovery Client";
// Nacos的服务发现
private NacosServiceDiscovery serviceDiscovery;
// 是否启用容错机制,默认为false
@Value("${spring.cloud.nacos.discovery.failure-tolerance-enabled:false}")
private boolean failureToleranceEnabled;
public NacosDiscoveryClient(NacosServiceDiscovery nacosServiceDiscovery) {
this.serviceDiscovery = nacosServiceDiscovery;
}
@Override
public String description() {
return DESCRIPTION;
}
@Override
public List<ServiceInstance> getInstances(String serviceId) {
try {
// 根据服务ID获取实例
return Optional.of(serviceDiscovery.getInstances(serviceId))
// 如果获取到了,缓存起来
.map(instances -> {
ServiceCache.setInstances(serviceId, instances);
return instances;
}).get();
} catch (Exception e) {
// 如果获取失败,开启了容错机制,从缓存中获取服务实例
if (failureToleranceEnabled) {
return ServiceCache.getInstances(serviceId);
}
// 如果没有开启容错,抛出异常
throw new RuntimeException("Can not get hosts from nacos server. serviceId: " + serviceId, e);
}
}
// 获取服务名称ID
@Override
public List<String> getServices() {
try {
// 从服务发现中获取所有的实例ID,并缓存起来
return Optional.of(serviceDiscovery.getServices()).map(services -> {
ServiceCache.setServiceIds(services);
return services;
}).get();
} catch (Exception e) {
// 获取的过程发生异常
// 如果开启了容器机制,返回缓存中的实例ID,否则返回空实例ID
log.error("get service name from nacos server failed.", e);
return failureToleranceEnabled ? ServiceCache.getServiceIds() : Collections.emptyList();
}
}
}
相关推荐
MBD-从一个示例看代码生成过程(rtw文件、TLC语言)
大概介绍了MBD代码生成流程,rtw文件、TLC语言
springcloud @EnableDiscoveryClient注解作用
相信熟悉Spring Cloud的读者对注解@EnableDiscoveryClient 及@EnableEurekaClient 并不陌生。 要想将一个微服务注册到Eureka Server(或其他服务发现组件,例如Zookeeper、Consul等),Eureka 2.0闭源之后,Consul慢慢会成为主流。 只需: 添加Eureka Client(或其他服务发现组件的Cl...
OFDM时频脉冲形状与子载波正交性的理解
从多载波调制的角度来理解子载波间正交,首先要明确OFDM默认的脉冲成型是时域矩形窗,时域上每个子载波 ej2πfnte^{j2πf_nt}ej2πfnt 都被一个矩形窗脉冲gT(t)g_T(t)gT(t)成型。其次,OFDM子载波间隔 等于 OFDM符号周期的倒数,这是子载波正交的条件。 根据时频脉冲形状,可以从时域上理解如左图(注意是矩形脉冲 乘 复指数),从频域上理解如右图(sinc脉冲 卷 频点)。
Spring Boot 中的 @EnableDiscoveryClient 注解
服务注册中心是微服务架构中的一个关键组件,它用于管理所有的服务实例。服务注册中心提供了一个服务注册表,其中包含了所有可用的服务实例信息,包括服务的名称、地址、端口等信息。当一个服务实例启动时,它会向注册中心注册自己的信息,当一个服务需要调用其他服务时,它可以通过服务注册中心获取到其他服务的信息,然后进行调用。
西门子与汇川伺服脉冲连接(速度模式)
如何使用西门子PLC与汇川伺服进行脉冲连接
从零开始:用AutoLisp为AutoCAD定制专属工具栏(2023最新版)
本文详细介绍了如何利用AutoLisp语言为AutoCAD定制专属工具栏,以提升绘图效率。内容涵盖从环境配置、AutoLisp基础语法到实战开发的全过程,指导用户编写自动化脚本、封装功能函数,并最终通过CUI编辑器创建和部署个性化工具栏按钮,是2023年CAD用户实现工作流自动化与个性化的实用指南。
SpringCloud(三):@EnableDiscoveryClient 注解如何实现服务注册与发现
@EnableDiscoveryClient 注解如何实现服务注册与发现@EnableDiscoveryClient 是如何实现服务注册的?@EnableDiscoveryClient 注解做了什么事?EnableDiscoveryClientImportSelector 类做了什么事?nacos 是如何根据标准去实现服务注册的?NacosDiscoveryAutoConfiguration类做了...
android 14.0 去掉usb授权提示框 默认给予权限
在14.0的系统rom产品开发中,在进行iot关于插入usb设备的开发过程中,在插入usb设备时会弹出usb授权提示框,也带来一些不便, 这个需要默认授予USB权限,插拔usb都不弹出usb弹窗所以这要从usb授权相关管理页默认给与usb权限,接下来分析下 相关的实现功能流程
@EnableDiscoveryClient注解
使用@EnableDiscoveryClient的好处在于,它具有一定的抽象性,可以与多种服务发现实现兼容,比如Eureka、Consul、Zookeeper等。当你在Spring Boot应用的主配置类上使用这个注解时,Spring Cloud会自动配置一个客户端,这个客户端能够与服务注册中心通信,获取服务实例的信息。在这个例子中,MyApplication 类启用了服务发现功能,使得应用能够参与到微服务架构中的服务发现流程中。3、通过服务名而不是硬编码的IP地址和端口来引用其他服务,提高服务间的解耦。
车载以太网-TC8测试
TC8测试的用例数量 TC8测试基本流程 TC8测试内容
特别章节-0.1 SolidWorks导出机械臂的URDF模型各个关节坐标系设置
通过Solidworks导出机械臂的URDF模型文件,建立机械臂的各个关节坐标系的规则以及注意点,详细步骤
SpringCloud服务发现注解之@EnableDiscoveryClient与@EnableEurekaClient
下文是从stackoverflow上面找到的对这两者的解释: There are multiple implementations of "Discovery Service" (eureka, consul, zookeeper). @EnableDiscoveryClient lives in spring-cloud-commons and picks the implementation...
【教程4>第2章>第19节】 GMSK解调系统的FPGA开发与matlab对比验证
MSK(Minimum Shift Keying,最小频移键控)和GMSK(Gaussian Minimum Shift Keying,高斯最小频移键控)都是数字调制技术,主要用于无线通信系统中将数字信号转换为模拟信号进行传输。它们都是连续相位移键控(Continuous Phase Shift Keying, CPK)的一种形式,意味着相邻码元之间没有相位跳变的突变,而是连续过渡,这有助于减少信号带宽和降低邻道干扰。GMSK的解调过程与MSK类似,我们这里还是采用和MSK解调一样的1bit解调方法。
springcloud注解@EnableDiscoveryClient与@EnableEurekaC
spring cloud中discovery service有许多种实现(eureka、consul、zookeeper等等),@EnableDiscoveryClient基于spring-cloud-commons, @EnableEurekaClient基于spring-cloud-netflix。 其实用更简单的话来说,就是如果选用的注册中心是eureka,那么就推荐@EnableEure...
jdk-8u144-linux-x64.tar.gz.
该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包
IDEA的使用指南
IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.
SpringCloud——Eureka源码分析
1.Eureka Client如何实现服务注册? 基于Spring Cloud的eureka的client端在启动类上加上@EnableDiscovertClient注解,就可以用NetFilx提供Eureka Client。下面以@EnableDiscoveryClient为入口,进行源码分析。 @EnableDiscoveryClient,通过源码发现这是一个标记注解 /** * Annotation to enable a DiscoveryClient implementation. *
大中型超市收银系统(可直接运行)
光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开
SpringCloud(9)之@EnableDiscoveryClient 注解如何实现服务注册与发现
一、前言 在新的2020年,Eureka社区网站已经公布了对Eureka2.0版本的更新,但是Eureka1.0版本仍然可以使用,那现在主流的服务注册中心看下图: 我们在每个引导类上都使用了@EnableDiscoveryClient这个注解,这个注解的作用是让该服务放注册中心注册和从注册中心获取其他服务。那它内部是如何实现的呢?今天我们就来聊聊@EnableDiscoveryClient注解是如何进行服务注册与服务发现。 二、@EnableDiscoveryClient 是如何实现服务注册 我
华为的C语言编程规范.pdf
华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。
@EnableDiscoveryClient和@EnableEurekaClient的区别
@EnableEurekaClient只适用于使用Eureka作为注册中心的场景,@EnableDiscoveryClient可以适用于其他注册中心的场景比如nacos等。 在Spring Cloud的Dalston及其之前的版本中: 1、从2014年的Spring Cloud 1.0.0.RC1版本开始,官方就推荐使用EnableDiscoveryClient来取代EnableEureka...
SpringCloud Alibaba 2021微服务实战十九 源码理解之@EnableDiscoveryClient 是如何实现服务注册的
@EnableDiscoveryClient 是如何实现服务注册的? 我们首先需要了解 Spring-Cloud-Commons 这个模块,Spring-Cloud-Commons 是 Spring-Cloud 官方提供的一套抽象层,类似于 JDBC 一样,提供了一套规范,具体的实现有实现厂商去根据标准实现, Spring-Cloud-Commons 共提供了6个模块标准规范。 actuator circuitbreaker discovery hypermedia loadbalancer servic
SpringCloud Eureka源码分析
一:注册服务 源码: 先从服务注册开始梳理,Eureka Client启动的时候就去Eureka Server注册服务。通过在启动类上添加@EnableDiscoveryClient这个注解,来声明这是一个Eureka Client。 以下是启动类代码: package com.example.eurekaclient; import org.springframework.boot.Sprin...
注解@EnableDiscoveryClient,@EnableEurekaClient的区别
在之前的一篇文章Spring Cloud feign使用中在使用服务发现的时候提到了两种注解,一种为@EnableDiscoveryClient,一种为@EnableEurekaClient,用法上基本一致,今天就来讲下两者,下文是从stackoverflow上面找到的对这两者的解释: There are multiple implementations of "Discovery Servic
Eureka源码解析
SpringCloud版本Greenwich.SR2 Eureka结构,关系 LookupServiceEurekaClientnetflix 的 DiscoveryClientEurekaDiscoveryClientDiscoveryClient LookupService中定义的方法 /** *通过appName获取Application */ Application getApplic...
spring cloud服务发现注解之@EnableDiscoveryClient与@EnableEurekaClient
在之前的一篇文章Spring Cloud feign使用中在使用服务发现的时候提到了两种注解,一种为@EnableDiscoveryClient,一种为@EnableEurekaClient,用法上基本一致,今天就来讲下两者,下文是从stackoverflow上面找到的对这两者的解释:There are multiple implementations of "Discovery Service"...
springcloud五大组件?注解_Spring Cloud 到底是怎么运行的?
导读,在这篇文章和大家一起通过梳理下Spring Cloud的运行原理来相对全面的了解下Spring Cloud。随着微服务架构在越来越多的公司得到实践和应用,基于Spring Cloud的这一套微服务生态框架体系,也在这个过程中得到大量的实践和运用。虽然目前Service Mesh的概念也越来越得到关注,但是目前微服务开源框架中运用的比较广泛的还是基于Spring Cloud的一套体系。从技术本...
SpringCloud源码学习(一) Eurake服务注册的实现细节
SpringCloud微服务治理模块Eurake是开发SpringCloud项目必须要面对的。我们都知道我们要想将我们的服务注册到Eurake注册中心就必须要在项目中加入相关的依赖jar...
Spring cloud中常用注解
Spring cloud中常用注解(新手) 一、@SpringBootApplication注解 该注解是springboot启动类,包括三个注解,他们的作用分别是: @Configuration:表示将该类作用springboot配置文件类 @EnableAutoConfiguration:表示程序启动时,自动加载springboot默认的配置 @...
4210



被折叠的 条评论
为什么被折叠?



