SpringCloud中如何进行接口调用?
小Demo提供者在新版本的SpringCloud中进行接口暴露是很简单的,只需要引入open feign的依赖,然后接口就可以被其它服务引用了。
1234<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
消费者使用这个接口的系统也要引入open feign,同时启动类中加上@EnableFeignClients注解,再写一个简单的接口就可以在其它类中注入这个类了。
12345@FeignClient("CloudClientB")public interface ClientProviderB { @GetMapping(value = "/hello") String hello();}
可以直接注入Bean进行调用:
123 ...
SpringCloud中EurekaServer的故障感知与实例摘除
前言Spring Cloud Eureka作为服务注册中心,可以实时感知服务实例的上线和下线。当服务实例发生故障时,Eureka会将其从服务列表中移除,防止请求被发送到已经故障的服务实例。
故障感知与实例摘除EurekaServer启动时会初始化一个定时任务,它每分钟执行一次EvictionTask。
12345678910protected void postInit() { renewsLastMin.start(); if (evictionTaskRef.get() != null) { evictionTaskRef.get().cancel(); } evictionTaskRef.set(new EvictionTask()); evictionTimer.schedule(evictionTaskRef.get(), serverConfig.getEvictionIntervalTimerInMs(), // 默认是1分钟 serverConfig.g ...
SpringCloud中心跳与Server的自我保护机制
EurekaClient与EurekaServer的心跳机制Spring Cloud的心跳机制主要是通过Eureka客户端定期向Eureka服务器发送心跳包来实现的。这个机制用于维护服务实例的健康状态,并保证服务注册表的准确性。
具体来说,每个Eureka客户端会每隔一段时间(默认为30秒)向Eureka服务器发送一个心跳包,告诉服务器它还活着。Eureka服务器在收到心跳包后,会更新服务实例的租约信息,延长其在服务注册表中的存活时间。
如果Eureka服务器在一段时间内(默认为90秒 + 补偿时间)没有收到某个服务实例的心跳包,那么它会认为这个服务实例已经出现故障,将其从服务注册表中移除。
Client端Client在启动时初始化了一个默认30秒被执行一次的任务:HeartbeatThread,在它内部的run()方法中,它会发起一次对Server端的续约请求,并更新自己的lastSuccessfulHeartbeatTimestamp。
123456789private class HeartbeatThread implements Runnable { publ ...
SpringCloud中的服务注册与服务发现机制
服务注册在以下几种情况中,Client会将自己注册到Server中:
启动时:当客户端应用启动并初始化Spring应用上下文后,如果它包含一个DiscoveryClient实例(例如EurekaDiscoveryClient),那么它会自动将自己注册到服务端。这是通过DiscoveryClient的@PostConstruct注解标记的方法完成的。
服务状态变化时:如果客户端应用的服务状态发生变化(例如,从DOWN状态变为UP状态),并且这个状态变化被一个StatusChangeListener监听到,那么客户端可能会重新将自己注册到服务端。这是通过StatusChangeListener的notify()方法完成的。
定期心跳失败后:客户端应用会定期向服务端发送心跳以维持其在服务端的注册状态。如果心跳失败(例如,因为网络问题或服务端故障),那么客户端可能会尝试重新将自己注册到服务端。
我们以服务启动时触发的注册行为为例,然后从Client和Server两段看下它的注册流程。
Client端在Client启动的过程中,Spring Boot通过自动装配机制将EurekaClient ...
SpringCloud是如何启动EurekaServer的
小Demo还是先建一个Demo工程,方便我们阅读源码。
新建一个Spring Boot项目,pom中添加以下信息:
123456789101112131415161718192021222324252627<properties> <java.version>17</java.version> <spring-cloud.version>2023.0.1</spring-cloud.version></properties><dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency> ...
SpringCloud概述
前言本次代码阅读,依旧是阅读最新版本源码。版本信息如下
JDK 17
Spring Boot 3.2.5
SpringCloud 2023.0.1
什么是SpringCloudSpring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理、服务发现、断路器、智能路由、微代理、控制总线、短寿命微服务和契约测试)。分布式系统的协调导致了锅板模式,使用Spring Cloud开发人员可以快速建立实现这些模式的服务和应用程序。它们可以在任何分布式环境中很好地工作,包括开发人员自己的笔记本电脑、裸机数据中心和托管平台(如Cloud Foundry)
SpringCloud与Spring Boot的关系Spring Cloud是一个用于构建分布式系统的开发工具集合,它提供了一系列的组件和模块,用于解决分布式系统中的常见问题,例如服务注册与发现、负载均衡、服务调用、配置管理等。而Spring Boot是一个用于简化Spring应用程序开发的框架,它提供了自动配置、快速启动等特性,使得开发者可以更加便捷地构建和部署Spring应用程序。
SpringCloud的特性 ...
Spring源码之一张图了解Bean的创建过程
前言上一章我们已经对IOC容器有了大致的了解,本章我们再用一张图了解下Spring中是如何创建一个普通Bean的。注意,这张图只表达了一个普通注解类作为被Spring创建Bean的过程,比如一个普通的Action类。
一张图了解Bean的创建过程推荐通过链接访问,可以看到更多的内容。
链接:https://www.processon.com/view/link/6649b73b42522905d011ec1a
Spring源码之IOC机制梳理
如何理解IOC在JAVA的古早时期,程序员自己既要定义对象,然后还要通过new的方式创建出对象。而在Spring中则我们只需要定义Bean,然后交给Spring来创建对象(从甲乙方的角度,定义对象是提需求的甲方,实现对象是执行的乙方。那么new的方式是即做甲方又做乙方。而Spring让程序员当了一回甲方)。
而这个动作就是IOC(Inversion of Control)控制反转。不过IOC不是一种具体的技术,而是一种设计思想,用来解决的是层和层之间, 类和类之间的耦合问题。
举个例子来说,现在有Cat、Dog两个类,Cat中引用了Dog类。如果这时Dog需要被替换为Pig类,我们会如何做呢?一点点改倒是可以,但如果Dog类被引用了100次,我们也要修改100次吗?
现在假设我们做如下调整,我们将Dog包装起来,然后Cat间接调用它;如果后面需要将Dog改为Pig,只要在包装类中奖Dog改为Pig就行,完全不需要修改Cat类中的引用了,而这就是控制反转。
Spring使用了IOC机制会将Cat、Dog等类的引用存在IOC中,Spring会帮我们维护好他们的生命周期,我们完全不用担心。
...
Spring Boot启动Tomcat原理
前言在Spring的时期如果我们想部署一个JAVA服务,通常是在服务器上安装一个Tomcat服务,然后将JAVA项目打好的war包丢到相应位置就好,麻烦且容易出错。所以Spring Boot中简化了这个操作,可以直接启动一个项目而不用单独部署Tomcat,那么Spring Boot是如何实现这一切的呢?
自动引入Tomcat依赖Tomcat也是基于JAVA开发的,它本质上也是一个jar包,所以Spring Boot为它添加了默认依赖,当我们创建一个web项目时会自动将tomcat的依赖引入进来。
1234<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency>
然后点进去spring-boot-starter-web,可以看到它引入了spring-boot-starter-tomcat依赖,所以后面也就可以使用Tomcat的 ...
SpringBoot是如何加载配置文件的
前言日常开发中,我们会在配置文件中配置一些属性,然后通过诸如@Value注解来使用它,我们这次就分析下Spring Boot是如何加载、解析的。
如何加载文件的?在Spring Boot启动过程中会构建SpringApplication,这个过程中会加载一个监听器:EnvironmentPostProcessorApplicationListener,然后SpringApplication的prepareEnvironment()方法会发布一个事件,而这个时间会被EnvironmentPostProcessorApplicationListener监听到从而开始执行onApplicationEvent()方法,然后经过层层调用最终会调用Spring的方法去解析和加载资源文件中的属性,并最终将解析到的属性放入到Environment中,供后续使用。我们还是先通过一张图来对整个加载流程有个大概的认识。
下面我们对每个步骤,都看一下他们的源码。
EnvironmentPostProcessorApplicationListener这里的主要作用是根据接收到ApplicationEvent类 ...