1.springcloud组件有那些?
1)eureka 实现微服务的注册和发现,包含三个部分:服务发现组件、服务的提供者、服务的消费者;
2)ribbon 实现微服务负载均衡;
3)foreign eureka 和ribbon的结合体,实现微服务API 请求的转发和调度;
4)zuul 服务网关,实现路由服务转发,同时具备权限控制功能;
5)histy 熔断器,防止出现服务出现故障时还被持续访问,最终导致自身服务的瘫痪。
6)config 配置中心,用于分布式系统的配置,分为两部分,一是Config Server,二是Config Client。
2.springcloud组件内部具体如何实现?
2.1 eureka实现
服务注册表
是服务发现组件的核心,它用来记录各个微服务的信息,例如微服务的名称、IP、端口等。服务注册表提供查询API和管理API,查询API用于查询可用的微服务实例,管理API用于服务的注册和注销。
2.1.1 服务如何注册
1)注册IP、端口、服务名称
Eureka Server 提供服务发现的能力,各个微服务启动时,会向Eureka Server注册自己的信息(例如IP、端口、微服务名称等),Eureka Server会存储这些信息。
Eureka Client是一个Java客户端,用于简化与Eureka Server的交互。
2)注册表数据同步
默认情况下,Eureka Server同时也是Eureka Client。多个Eureka Server实例,相互之间通过复制的方式,来实现服务注册表中的数据的同步。
2.1.2 如何发现服务
1)获取网络地址、调用接口
服务消费者可从服务发现组件查询服务提供者的网络地址,并使用该地址调用服务提供者的接口;
2)缓存注册表信息
Eureka Client 会缓存服务注册表中的信息。这种方式有一定的优势——首先,微服务无须每次请求都查询Eureka Server 的压力;其次即使Eureka Server所有节点都宕掉,服务消费者依然可以使用缓存中的信息找到服务提供者并完成调用。
2.1.3 服务检查和维护服务链接
1)心跳检查
微服务启动后会周期性(默认30秒)地向Eureka Server发送心跳以续约自己的“租期”。
2)超时注销
如果Eureka Server在一定时间内没有接收到某个微服务实例的心跳,Eureka Server将会注销该实例(默认90秒)。
3)注册表自动刷新
微服务网络地址发生变更(例如实例增减或者IP端口发生变化等)时,会重新注册到服务发现组件。使用这种方式,服务消费者就无须人工修改提供者的网络地址了。
2.1.3 eureka 高可用
Eureka Server可以通过运行多个实例并相互注册的方式实现高可用部署,Eureka Server实例会彼此增量地同步信息,从而确保所有节点数据一致。事实上,节点之前相互注册是Eureka Server的默认行为,前面单节点Eureka Server,额外配置了eureka.client.registerWithEureka=false、eureka.client.fetchRegistry=false。
2.1.4 eureka 安装配置
1) pom.xml配置
eureka server 的配置
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.1.RELEASE</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
</dependencies>
eureka client_1 的配置
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
eureka client_2 的配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
2) application.properties 配置
eureka server的配置
server.port=1111
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/
eureka client_1 的配置
spring.application.name=management-service-v1
server.port=8085
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
eureka client_2 的配置
spring.application.name=management-consumer
server.port=8075
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
3) 注解配置
eureka server的配置
eureka server中的Java代码只需要有这启动类即可,没有其他代码。
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
* Created by xxx
*/
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String args[]){
new SpringApplicationBuilder(EurekaServerApplication.class).web(true).run(args);
}
}
eureka client_1的配置
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.web.MultipartAutoConfiguration;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @author xxx
* 入口程序
*/
@SpringBootApplication
@EnableAutoConfiguration(exclude = {MultipartAutoConfiguration.class})
@EnableDiscoveryClient
public class ManagementApplication {
public static void main(String[] args) {
SpringApplication.run(ManagementApplication.class, args);
}
}
eureka client_2的配置
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
* Created by xxx
*/
@SpringBootApplication
@EntityScan
@EnableDiscoveryClient
public class ManagementCoreApplication {
public static void main(String[] args){
SpringApplication springApplication =new SpringApplication(ManagementCoreApplication.class);
springApplication.run(args);
}
}
参考:
https://blog.csdn.net/chen497147884/article/details/79861084
3.springcloud微服务API请求如何转发?
3.1 使用 Spring Cloud Gateway
简介:Spring Cloud Gateway 是 Spring Cloud 生态系统中的网关组件,它基于 Spring WebFlux 框架,提供了一种简单而有效的方式来转发 API 请求。
工作原理:通过配置路由规则,将客户端的请求根据 URL 路径、请求方法等条件匹配到相应的微服务实例。可以在网关中配置过滤器,对请求进行预处理和后处理,如添加请求头、校验令牌等。
3.2 使用 Ribbon 和 Feign
简介:Ribbon 是一个客户端负载均衡器,Feign 是一个声明式的 HTTP 客户端,它们结合 Spring Cloud 可以方便地实现 API 请求转发。
工作原理:Ribbon 负责从服务注册中心获取服务实例列表,并根据负载均衡策略选择一个实例进行请求转发。Feign 则基于 Ribbon 实现了声明式的 HTTP 客户端,通过接口和注解的方式定义 API 请求,简化了客户端代码的编写。
3.3 使用 Zuul
简介:Zuul 是 Netflix 开源的微服务网关,它提供了请求路由、过滤等功能,在 Spring Cloud 中也有广泛的应用。
工作原理:Zuul 接收所有的外部请求,根据配置的路由规则将请求转发到相应的微服务。可以通过编写过滤器来实现对请求的拦截、校验等操作。
5.springcloud微服务如何熔断,如何防止雪崩?
熔断机制
什么是熔断:
熔断机制是一种保护机制,类似于电路中的保险丝,当微服务之间的调用出现大量超时或异常时,熔断机制会暂时切断服务调用,防止故障在系统中蔓延,从而保护系统的整体稳定性。
使用 Hystrix 实现熔断(已进入维护模式,可考虑使用 Resilience4j 或 Sentinel 替代):
Hystrix 原理:
监控微服务调用的请求响应时间、错误率等指标。当错误率达到设定阈值(如 50%)或请求超时,Hystrix 会开启熔断,后续的请求将不会调用该服务,而是直接走降级逻辑。
使用 Resilience4j 实现熔断:
- Resilience4j 原理:
它提供了轻量级、功能强大的熔断功能,允许设置各种熔断参数,如失败率阈值、滑动窗口大小等。
什么是雪崩:
雪崩效应是指在微服务架构中,一个服务的故障导致调用它的服务也出现故障,进而引发连锁反应,最终导致整个系统的崩溃。
6.springcloud服务如何降级?
含义:当服务不可用时,提供一个备用的服务或返回默认值,避免服务调用失败导致系统崩溃。
服务隔离:
线程池隔离:
原理:将不同服务的调用使用不同的线程池,这样即使一个服务调用出现问题,也不会影响其他服务的调用线程。
信号量隔离:
原理:使用信号量限制对服务的并发请求数量,当请求超过信号量阈值时,直接走降级逻辑。
服务限流:
含义:限制服务的请求流量,避免过多的请求导致服务崩溃。
通过熔断、服务降级、服务隔离和服务限流等机制,可以有效地保护 Spring Cloud 微服务系统,防止雪崩效应,提高系统的稳定性和可靠性。你可以根据实际需求选择合适的工具和策略,确保系统在复杂的微服务环境下稳定运行。
监控和告警:
使用 Spring Boot Actuator 等工具监控服务的健康状况,及时发现服务的异常情况,并通过告警系统通知开发团队。
分布式配置:
使用 Spring Cloud Config 等工具实现熔断、限流等配置的集中管理,方便修改和更新。
这些机制和工具为 Spring Cloud 微服务架构提供了强大的容错和保护功能,你可以根据具体的业务场景和系统需求灵活使用,保障系统的高可用性和稳定性。