Spring Cloud & 常用组件的使用

本文介绍了SpringCloud框架,包括其主要组件如服务注册与发现(Eureka)、配置中心(ConfigServer)、负载均衡(Ribbon)、熔断器(Hystrix)、声明式REST客户端(Feign)以及API网关(Zuul)。这些组件简化了分布式应用的开发和管理。
摘要由CSDN通过智能技术生成

什么是Spring Cloud?

Spring Cloud 是一个用于构建分布式系统的开源框架,Spring Cloud 提供了一系列工具和库,帮助开发者构建可伸缩、高可用、容错性强的分布式应用程序。Spring Cloud 的目标是简化分布式系统的开发,提供了一些常用的分布式系统模式和组件,如服务注册与发现、负载均衡、断路器、分布式配置等。

  1. Spring Cloud Config(配置中心)

    • Spring Cloud Config 允许您将应用程序的配置集中管理,可以存储在版本控制系统中或分布式配置仓库中(如Git)。
    • 使用 Config Server 来提供配置信息,客户端应用可以通过Config Client从Config Server获取配置。
    • 使用配置文件或配置中心中的属性来配置应用程序,支持不同环境的配置管理。
  2. Spring Cloud Eureka(服务发现与注册)

    • Eureka 是一个服务发现和注册中心,允许微服务应用注册自己,并查询其他服务的实例信息。
    • 通过 Eureka 服务器和 Eureka 客户端来实现服务注册和发现。
    • 通过在应用程序中添加 @EnableEurekaServer@EnableEurekaClient 注解来使用。
    • 实例eureka注册中心的实现,eureka如何使用呢?
      另外需要一个供应商provider和消费方consumer以eureka为服务者进行交互使用。provider注册信息到eureka中,consumer也将自己注册到eureka中,consumer通过获取provider发布的唯一id即服务名来获取服务。
      ①配置eureka的application.yml文件
      server:
        port: 10086  # 端口
      
      eureka:
        client:
          service-url:  # EurekaServer地址,多个地址以','隔开
            defaultZone: http://localhost:10086/eureka
        instance:
          lease-expiration-duration-in-seconds: 10 # 10秒即过期
          lease-renewal-interval-in-seconds: 5 # 5秒一次心跳
      
      spring:
        application:
          name: eureka-service   # 应用名称,会在Eureka中显示
      
      ②在启动类开启注解
       
      @SpringBootApplication
      @EnableEurekaServer //开启eureka服务
      public class EurekaApplication {
      
          public static void main(String[] args) {
              SpringApplication.run(EurekaApplication.class,args);
          }
      }

  3. Spring Cloud Ribbon(负载均衡)

    • Ribbon 是一个客户端负载均衡器,可以将请求分发到多个微服务实例上,实现负载均衡。
    • Ribbon 可以与 Eureka 集成,自动发现可用的服务实例。
    • 通过添加 @LoadBalanced 注解来使用 Ribbon 的 RestTemplate 来调用服务。

      ①在启动类注入Rest Template交给spring容器管理,在使用时直接依赖注入
          @Bean
          @LoadBalanced
          public RestTemplate restTemplate(){
              return new RestTemplate();
          }

      ②在controller中使用restTemplate.getFroObject()方法
       

      @RestController
      @RequestMapping("consumer")
      public class StuController {
      
          // feign中继承ribbon负载均衡的restTemplate
          @Autowired
          private RestTemplate restTemplate;
          
          @RequestMapping("findById/{sid}")
          public String findById(@PathVariable Integer sid) {
              // 使用restTemplate发起远程调用
              Stu stu = restTemplate.getForObject("http://localhost:8081/provider/findId/" + id, Stu.class);
              
              return stu.toString();
          }

      ③可以在消费者配置中更改默认的负载均衡规则来改变负载均衡规则,在消费者application.yml中加入,讲默认的RoundRobinRule轮询方式修改为RandomRule随机形式。

      service-provider:
        ribbon:
          NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

  4. Spring Cloud Hystrix(熔断器)

    • Hystrix 是一个熔断器模式的库,用于防止分布式系统中的故障扩散。
    • 它可以在服务出现故障时提供降级策略,防止服务雪崩。
    • 使用 @HystrixCommand 注解来定义熔断器。
    • 引入依赖<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    • //@EnableCircuitBreaker //开启hystrix熔断
    • 编写降级逻辑,并在该方法上添加注解@HystrixCommand(fallbackMethod = "defaultFallBack"),要注意,因为熔断的降级逻辑方法必须跟正常逻辑方法保证:相同的参数列表和返回值声明
       
          // 全局方法编写降级逻辑
          public String defaultFallBack() {
              return "网络中断,请稍后再试!";
          }

  5. Spring Cloud Feign(声明式REST客户端)

    • Feign可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller一样。你不用再自己拼接url,拼接参数等等操作,一切都交给Feign去做。
    • Feign 可以与 Ribbon 集成,实现负载均衡的远程调用。
    • 使用 @FeignClient 注解来创建一个声明式的客户端接口。

      ①开启熔断
      # 默认情况下是关闭的
      feign:
        hystrix:
          enabled: true # 开启Feign的熔断功能

      ②在引导类中加入注解

      @SpringBootApplication
      @EnableDiscoveryClient  // 开启Eureka客户端
      @EnableCircuitBreaker //开启hystrix熔断
      @EnableFeignClients //开启feign注解
      public class ConsumerApplication {
          public static void main(String[] args) {
              SpringApplication.run(ConsumerApplication.class,args);
          }
          @Bean
          @LoadBalanced
          public RestTemplate restTemplate(){
              return new RestTemplate();
          }
      }
      

      ③创建接口,该接口是feign的接口
       

      //标注该类是一个feign接口
      @FeignClient(value = "service-provider",fallback = StuFeignFullBack.class)
      public interface StuFeign {
          @GetMapping("/provider/findById/{sid}")
          Stu findById(@PathVariable Integer sid);
      }
      

      ④通过实现该接口来实现熔断功能
       

      @Component
      public class StuFeignFullBack implements StuFeign {
          @Override
          public Stu findById(Integer sid) {
              Stu stu = new Stu();
              stu.setName("feign中的fullback,网络中断,稍后再试");
              return stu;
          }
      
      }

      ⑤通过注入feign接口调用方法实现功能
       

      @RestController
      @RequestMapping("consumer")
      @DefaultProperties(defaultFallback = "defaultFallBack")
      public class StuController {
          @Autowired
          StuFeign stuFeign;
          @HystrixCommand
          public String findById(@PathVariable Integer sid) {
              Stu stu = stuFeign.findById(sid);
              return stu.toString();
          }
      }

  6. Spring Cloud Zuul

 不管是来自于客户端(PC或移动端)的请求,还是服务内部调用。一切对服务的请求都会经过Zuul这个网关,然后再由网关来实现 鉴权、动态路由等等操作。Zuul就是我们服务的统一入口。

①导入依赖<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
②配置文件

server:
  port: 10010 #服务端口
spring:
  application:
    name: api-gateway #指定服务名

③在启动类开启网关@EnableZuulProxy // 开启网关功能

④编写路由规则
 

#1 配置路由规则
zuul:
  routes:
    server-provider: # 路由名称一般和供应商服务名一致
      path: /service-provider/**  # 客户端的请求路径中包含service-provider. 这里是映射路径
      url: http://localhost:8081 # 要转发的地址. 映射路径对应的实际url地址

#2 配置路由规则
zuul:
  routes:
    server-provider: # 路由名称一般和供应商服务名一致
       service-id: service-provider # 指定服务名称

#3 配置路由规则
zuul:
  routes:
    server-provider: service-provider # 路由名称一般和供应商服务名一致

#4 不配置

⑤添加路由前缀prefix: /api # 添加路由前缀

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

@Component
public class LoginFilter extends ZuulFilter {

    /**
     * 过滤器类型,前置过滤器
    pre:请求在被路由之前执行
    route:在路由请求时调用
    post:在route和errror过滤器之后调用
    error:处理请求时发生错误调用
     * @return
     */
    @Override
    public String filterType() {
        return "pre";
    }

    /**
     * 过滤器的执行顺序,返回值越小优先级越高
     * @return
     */
    @Override
    public int filterOrder() {
        return 8;
    }

    /**
     * 是否使用过滤器
     * @return
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }

    /**
     * 自定义校验过滤器
     * @return
     * @throws ZuulException
     */
    @Override
    public Object run() throws ZuulException {
        
        return null;
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值