首页 > 其他分享 >SpringCloud常用组件总结

SpringCloud常用组件总结

时间:2023-06-27 19:44:34浏览次数:35  
标签:总结 降级 服务 SpringCloud Eureka 熔断 组件 public cloud

SpringCloud

什么是SpringCloud?

SpringCloud是基于Spring Framework的一套开源工具集,用于构建分布式系统和微服务架构的解决方案。它提供了一系列的开发工具和组件,简化了分布式系统中常见的开发、配置、服务注册和发现、负载均衡、断路器、路由、配置管理等任务。

常用组件

1、Eureka注册中心

(1)使用场景

Eureka主要是用来进行服务的管理,考虑到服务的增加,对于服务提供者来说,服务者要对外暴露自己的调用地址,对于调用者来说,它要记录提供者的服务地址,如果微服务的数量增大,或者说提供者的端口、ip等信息发生变更,而调用者不知道,就会给项目带来问题,不利于项目的维护。

那么Eureka就负责管理、记录服务提供者的信息,服务调用者无需自己寻找服务,而是把自己的需求告诉Eureka,然后Eureka会把符合你需求的服务告诉你。

提供者与注册中心之间维持“心跳”机制,提供者向注册中心定时发送自己还“活着”的信息,防止被Eureka从服务列表中移除。

(2)使用方法

①:搭建EurekaServer项目

引依赖:
    <!-- SpringCloud依赖管理 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
 版本管理:
        <properties>
           <spring-cloud.version>Finchley.SR2</spring-cloud.version>
        </properties>
注意:版本要和SpringBoot的版本使用一致

②:引入Eureka依赖

Eureka服务端:  
<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
客户端:
<dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

③:修改配置文件(提供端口、ip等信息)

server:
  port: 10086 # eureka访问服务端口
spring:
  application:
    name: eureka-server # 应用名称  会在Eureka中显示
eureka:
  client:
    service-url: # EurekaServer的地址,现在是自己的地址,如果是集群,需要加上其它Server的地址。
      defaultZone: http://127.0.0.1:10086/eureka

④:服务提供端与调用端也要注册到Eureka上

eureka:  #服务提供方
  client:
    service-url: # EurekaServer地址,提供方注册地址
      defaultZone: http://localhost:10086/eureka/
eureka:  #服务调用方
  client:
    service-url:
      defaultZone: http://localhost:10086/eureka/

⑤:启动类上加注解

@EnableEurekaServer //启用Eureka服务端
@EnableDiscoveryClient  //两个客户端的启动类上

如果要搭建Eureka集群,参考另外一个文章。

2、负载均衡Ribbon

(1)使用场景

为了降低某个提供者服务的压力,或者说把服务部署在多个实例上,用来提高系统的可用性和容错性(一个坏了,可以调其他的服务)根据预定义的负载均衡策略将请求分发到不同的实例,提高系统的性能和可靠性。

(2)使用方法

Eureka中已经帮我们集成了负载均衡组件,在此无需引入新的依赖。因为负载均衡是指针对服务调用者来说,这个不行调另外的,所以改动consumer模块的代码

①:引入依赖:无

②:在调用者的启动类中注入

   @Bean
   @LoadBalanced
    public RestTemplate restTemplate(){
       return new RestTemplate();
   }

③:修改服务的调用方式如:

String url = "http://service-provider/provider/findById/" + id;
User user = restTemplate.getForObject(url, User.class);

可以打断点跟踪负载均衡策略(默认是简单的轮询策略)也可以修改

3、Hystrix

(1)使用场景

主要起到一个保护机制。作用是隔离访问远程服务、第三方库,防止出现级联失败等问题。

以雪崩问题为例:(在微服务中,完成一个服务请求可能需要依赖多个服务接口才能实现。形成非常复杂的调用链路。如果其中的某个服务出现了异常,用户得不到响应,但是Tomcat也不会释放线程,越来越多的线程堵塞。形成雪崩)

使用Hystrix做一些容错保护(服务熔断)、弹性控制(线程池控制请求)。

(2)使用方法

线程隔离、服务降级

弹性控制中使用线程隔离,服务降级处理雪崩问题。通过提供线程池,控制资源的请求数来限制访问服务,如果线程池数满,或者请求超时,就会进行降级处理并返回给用户友好的提示信息。

①:在服务调用方引入Hystrix依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

②:引导类上加注解

@EnableCircuitBreaker

③:定义降级方法(局部/全局)

局部:

3.1:写降级方法

  //降级方法要和被降级方法的参数列表一致,返回值类型一致
   public String queryUserByIdFallBack(Integer id){
        return "系统繁忙,请稍后再试";
   }

3.2:在需要降级的方法上打注解

 @HystrixCommand(fallbackMethod = "queryUserByIdFallBack") //用来声明一个降级逻辑的方法

全局:

3.1:写全局降级方法

//    设置全局降级方法,如果谁需要降级熔断。就在谁上指定注解
//降级方法要和被降级方法的参数列表一致 不能有参数
    public String queryUserByIdFallBack(){
        return "系统繁忙,请稍后再试";
    }

3.2:在需要降级的方法上打注解 并指定属性

@HystrixCommand //使用了全局降级方法  在指定的controller方法上添加注解@HystrixCommand
@DefaultProperties(defaultFallback = "queryUserByIdFallBack") //全局指定默认的降级方法,Contrller类上面

服务熔断

服务熔断就是说如果请求时存在大量请求超时或者反应慢的情况,调用方会自行熔断,变为打开状态,不让请求过去,但是这个打开状态不是永久的,在打开状态后会进行5s的休眠时间,变为半打开状态,放一部分请求过去探路,如果没问题,会变为关闭状态,所有请求正常访问。

4、Feign

(1)使用场景

进一步简化,学会“伪装”,改变之前服务调用者在Controller层,这种看着很硬编码的方式,把这些地址以SpringMVC +注解的方式做到“返璞归真,回归原始”。

String url = "http://" + instance.getHost()+":"+instance.getPort()+"/provider/findById/" + id;
String url = "http://service-provider/provider/findById/" + id;

Feign可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller一样

(2)使用方法

①:添加依赖(服务调用方)

    <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>

②:是否需要覆盖默认配置(比如使Feign的熔断机制生效)

feign:
  hystrix:
    enabled: true # 开启Feign的熔断功能

③:在启动类上添加注解

@EnableFeignClients   //开启Feign功能

④:编写Fiegn的客户端,在接口上添加@FeignClient注解(以下都是以Feign的熔断机制为例)

//声明这是一个Feign客户端,类似`@Mapper`注解。同时通过`value`属性指定服务名称
//fallback 属性为熔断策略的实现类。熔断策略实现类应实现 Feign 客户端接口,并提供处理熔断逻辑的方法。
@FeignClient(value = "service-provider",fallback = UserFeignClientFallback.class)
public interface UserFeignClient {
    //把Controller中对应的方法声明放在这里
    @GetMapping("/provider/findById/{id}")
     User findById(@PathVariable Integer id);
}

⑤:编写熔断策略(其实就是Fiegn的客户端的一个实现类,实现具体的降级逻辑)

@Component
public class UserFeignClientFallback implements UserFeignClient{
    //这里编写的是接口方法中的具体的降级逻辑
    @Override
    public User findById(Integer id) {
        User user = new User();
        user.setUsername("系统繁忙,请稍后再试");
        return user;
    }
}

⑥:Controller层注入并进行调用

@RestController
@RequestMapping("/consumer")
public class UserController {
    @Autowired
    UserFeignClient userFeignClient;
    public String findById(@PathVariable Integer id){
        User user = userFeignClient.findById(id);
        System.out.println(user);
        return user.toString();
    }
}

5、Zuul

(1)使用场景

  • 权限认证
  • 服务路由
  • 负载均衡

(2)使用方法

①:搭建Zuul-server网关服务

②:引入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>

③:修改配置文件,配置路由规则

server:
  port: 10010 #服务端口
spring:
  application:
    name: api-gateway #指定服务名
zuul:
  routes:
    service-provider: service-provider/**
    service-consumer: service-consumer/**

④在启动类上加注解

@EnableZuulProxy  //开启网关功能

过滤器

Zuul作为网关的其中一个重要功能,就是实现请求的鉴权。而这个动作我们往往是通过Zuul提供的过滤器来实现的。

①:自定义过滤器 实现IZuulFilter

public abstract ZuulFilter implements IZuulFilter{

    abstract public String filterType();

    abstract public int filterOrder();
    
    boolean shouldFilter();// 来自IZuulFilter

    Object run() throws ZuulException;// IZuulFilter  编写过滤规则
}

标签:总结,降级,服务,SpringCloud,Eureka,熔断,组件,public,cloud
From: https://www.cnblogs.com/kuangsun125/p/17509767.html

相关文章

  • OOP第三阶段PTA题目集总结
    一、前言  在本次Blog要分析的是OOP第三阶段PTA题目集。对于OOP第三阶段PTA题目集,我个人认为难度还是较大的,每次一看到有新的题目集更新了,就心里一颤,因为难度较大耗时长。但是,正因为难度高,本人也从中踩了很多的坑,学到了很多编程思想和更加熟悉了JAVA的语法,对我本人的帮忙还是......
  • 题目集7~11的总结性blog
    一.前言这是这学期最后一次blog了,其中有7~11五次题目集题目集07:只有一道题,该题为菜单计价程序-5,是菜单计价程序-3的迭代,与菜单计价程序-4属于不同的迭代分支。 ......
  • Canal组件
    Canal[kə'næl],译意为水道/管道/沟渠,canal是阿里巴巴旗下的一款开源项目,基于Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。GitHub的地址:https://github.com/alibaba/canalCanal是基于mysql的主从同步来实现的,MySQL主从同步的原理如下: 1)MySQLmaster将数据变......
  • 庆军之blazor动态组件的研究与总结
    只上代码:rootcontrol.ControlParams=newDictionary<string,object>();rootcontrol.ControlParams["a"]="ssss";rootcontrol.Children.Add(newMControlParam(){ControlType=typeof(Layout),......
  • 题目集7~11总结心得
    1.前言本次题目集为7~11。其中题目集7是由题目集5、6两次的迭代,对于前两次已经拿到很多分的人困难不大,只要在基础上进行部分修改即可。之后从第八次题目集开始就进行另一个较难程序的练习,课程成绩统计程序,这个练习与前面的菜单程序非常相似,主要考察我们不同类与对象的关系,用到了......
  • VUE框架组件中通信方式(3)
    useAttrs使用方式类似于props传值,useAttrs既可以传数据,也可以传事件。如果父组件给子组件传递的参数,在子组件中同时使用props和useAttrs获取,那么参数只在props中生效,也就是说props的优先级高于useAttrs。示例代码如下://template><div><h1>useAttrs</h1><el-but......
  • Java-基本语法回顾总结[13-24]
    (13)copyonwriteArrayList线程安全的arrayList,底层也是用数组实现的,主要集中在读与写操作上读:由于读写分别在老新数组上,因此,互相不干扰,也因此,读的性能不会受写的性能影响[适用于读多写少]写:写操作会生成新数组,在完成之前,其他线程无法进行写操作[上了锁,线程安全];在完成之前,读的......
  • pta第三次总结
    前言题目集7:本次题目集由于是系统的建立因此其中的功能涉及多个维度包括时间、数组、字符。其中不仅要不断的去完成各个类中功能设计,同时还要清楚各个类之间的联系与调用,其中日期类问题考察了包括Calender类和data类的使用,数组包括字符数组也包括整形数组,要求运用split的方法和wh......
  • Windows 11 绕过 TPM 方法总结,通用免 TPM 镜像下载 (2023 年 6 月更新)
    Windows11绕过TPM方法总结,通用免TPM镜像下载(2023年6月更新)在虚拟机、Mac电脑和TPM不符合要求的旧电脑上安装Windows11的通用方法总结请访问原文链接:https://sysin.org/blog/windows-11-no-tpm/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org本文......
  • 【HarmonyOS】低代码开发使用module中的自定义组件
     “Module是应用/服务的基本功能单元,包含了源代码、资源文件、第三方库及应用/服务配置文件,每一个Module都可以独立进行编译和运行。一个HarmonyOS应用/服务通常会包含一个或多个Module,因此,可以在工程中创建多个Module,每个Module分为Ability和Library两种类型。”这个是HarmonyOS......