微服务之springCloud实现分析

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 微服务架构提供了强大的容错和保护功能,你可以根据具体的业务场景和系统需求灵活使用,保障系统的高可用性和稳定性。

7.springcloud配置文件如何配置?

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值