SpringCloud的简单使用

java学习 专栏收录该内容
7 篇文章 0 订阅

SpringCloud 生态

  • SpringCloud NetFlix

    • api网关: Zuul组件
    • Fegin-HttpClient-Http通信,同步,阻塞
    • 服务注册发现: Eureka
    • 熔断机制: Hystrix
  • Apache Dubbo Zookeeper

    • 半自动
    • api: 整合其他组件或自己实现
  • SpringCloud Alibaba

    • 更简单
  • 服务网格

    • Server Mesh

微服务

  • 什么是微服务

    • 一种架构模式,将单一的应用程序划分成一组小的服务,每个服务运行在其独立的自己的进程内,服务之间相互协调,相互配置,服务之间采用轻量级的通信机制互相沟通,每个服务都围绕具体业务进行构建,并且能独立的部署到生产环境中.
  • 微服务优点

    • 单一职责原则
    • 每个服务足够内聚,小
    • 开发简单,小团队开发
    • 彻底解耦
    • 能使用不同语言开发
    • 易于和第三方集成,通过持续集成工具:Jenkins,Hudson,Bamboo
    • 只是业务逻辑的代码
    • 每个服务可以有自己的数据库,也可以是统一数据库
  • 微服务缺点

    • 开发人员要处理分布式系统的复杂性
    • 多服务运维难度
    • 系统部署依赖
  • 微服务技术栈

    微服务条目落地技术
    服务开发SpringBoot,Spring,SpringMVC
    服务配置与管理NetFlix的Archaius, 阿里的Diamond
    服务注册与发现Eureka,Consul,Zookeeper
    服务调用Rest,RPC,gRPC
    服务熔断Hystrix,Envoy
    负载均衡Ribbon,Nginx
    服务接口调用(客户端调用服务器的简化工具)Fegin
    消息队列Kafka,RabbitMQ,ActiveMQ
    服务配置中心管理SpringCloudConfig,Chef
    服务路由(Api网关)Zuul
    服务监控Zabbix,Nagios,Metrics,Specatator
    全链路追踪Zipkin,Brave,Dapper
    服务部署Docker,OpenStack,Kubernetes
    数据流操作开发包SpringCloud Stream(封装与Redis,Rabbit,Kafka等发送接收消息)
    事件消息总线SpringCloud Bus
  • SpringCloud和SpringBoot的关系

    • SpringBoot专注于快速方便的开发单个个体微服务
    • SpringCloud是关注全局的微服务协调治理框架,为各个微服务之间提供: 配置管理,服务发现,断路器,路由,微代理,事件总线,全局锁,决策竞选,分布式会话等集成服务
    • SpringCloud离不开SpringBoot
  • Dubbo和SpringCloud技术选型

    • 分布式+服务治理Dubbo
    • 最大区别
      • SpringCloud抛弃了Dubbo的RPC通信,采用的是基于http的Rest方式,后者牺牲了服务调用的性能,但比RPC更加灵活,不存在代码级别的强依赖
  • 参考网站

    • https://springcloud.cc/spring-cloud-netflix.html
    • https://springcloud.cc/spring-cloud-dalston.html
    • http://springcloud.cn/
    • http://springcloud.cc/

SpringCloud

  • 创建Maven项目

    • 父项目

    • 打包方式: pom

    • 添加依赖

      <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-dependencies -->
      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-dependencies</artifactId>
          <version>Greenwich.SR3</version>
          <type>pom</type>
          <scope>import</scope>
      </dependency>
      
  • 创建微服务子项目-po

    • 创建数据库文件
    • 创建实体类,需要序列化
    • @Accessors(chain = true) //链式写法
  • 创建微服务子项目-provider

    • 导入上个子项目,引入实体类
    • 添加配置
    • 提供Restful服务
    • @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中
  • 创建微服务子项目-consumer

    • 引入实体类
    • 通过RestTemplate调用provider的服务

Eureka

  • 什么是Eureka

    • 遵循AP原则
    • 基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移,功能类似于Dubbo的注册中心,比如Zookeeper
  • 原理

    • 采用CS架构,EurekaServer作为服务注册功能的服务器,是服务注册中心
    • 系统中的微服务使用Eureka的客户端连接到EurekaServer并维持心跳连接,这样就可以通过EurekaServer来监控系统中的各个微服务是否正常运行,SpringCloud的一些其他模块(比如Zuul)就可以通过EurekaServer来发现系统中的其他微服务,并执行相关逻辑
  • 和Dubbo对比

    • Eureka包括两个组件: Eureka Server和Eureka Client
    • Eureka Server提供注册服务,各节点启动后,会在Eureka Server中进行注册,这样Eureka Server中的服务注册表中将会列出所有可用服务节点的信息
    • Eureka Client是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的,使用轮询负载算法的负载均衡器,在应用启动后,会向Eureka Server发送心跳(默认周期30s),如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,会移除该节点
  • 三大角色

    • Eureka Server: 提供服务的注册与发现
    • Service Provider: 将自身服务注册到Eureka中,从而使消费方能够找到
    • Service Consumer: 服务消费方从Eureka中获取注册服务列表,从而找到消费服务
  • 使用,写一个Eureka服务器

    • 导入依赖

      <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka -->
      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-eureka</artifactId>
          <version>1.4.7.RELEASE</version>
      </dependency>
      
    • 添加配置

      register-with-eureka: false
      fetch-registry: false
      
    • 添加启动类

    • 注册Eureka服务

  • 使用,写一个provider

    • 导入依赖
    • 添加配置
      • @EnableEurekaClient 服务启动后自动注册到Eureka
      • @EnableDiscoveryClient 服务发现
  • Eureka自我保护机制

    • 一个微服务崩了,Eureka不会立即清理,依旧会对该微服务的信息进行保存
    • 默认情况下,Eureka Server在一定时间内没有接收到某个微服务实例的心跳,Eureka Server会注销该实例(默认90s),但是当网络分区故障发生,微服务与Eureka Server之间无法正常通行,Eureka通过自我保护机制解决,当Eureka Server节点在短时间内丢失过多客户端时,该节点就会进入自我保护模式,Eureka Server会保护服务注册表中的信息,不再删除服务注册表中的数据,也就是不会注销任何微服务,网络故障恢复后,会自动退出自我保护模式.
    • eureka.server.enable-self-preservation = false 禁用自我保护模式
  • 集群配置

    • 在一个Eureka Server中挂载其他Eureka Server
    eureka: 
     instance: 
      hostname: eureka7001.com
     client:
      register-with-eureka: false
      fetch-registry: false
      service-url: 
       defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
    
  • 对比Zookeeper

    • Zookeeper保证的是CP
      • master节点挂掉重新选举leader需要时间
    • Eureka保证的是AP
      • Eureka的各节点是平等的,几个节点挂掉不会影响正常节点的工作
    • Eureka可以很好的应对网络故障导致部分节点失去联系的情况,而不会像Zookeeper那样使整个服务瘫痪

Ribbon

  • 客户端负载均衡(LoadBalance)的工具,提供客户端的软件负载均衡算法

  • 负责均衡简单分类

    • 集中式LB
      • 即在服务的消费方和提供方之间使用独立的LB设施,如Nginx,由该设施负责把访问请求通过某种策略转发至服务的提供方
    • 进程式LB
      • 将LB逻辑集成到消费方,消费方从服务注册中心获知由哪些地址可用,然后自己选出一个合适的服务器,如Ribbon,集成消费方进程,消费方通过它来获取到服务提供方的地址
  • 集成Ribbon

    • 导入依赖

      <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-ribbon -->
      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-ribbon</artifactId>
          <version>1.4.7.RELEASE</version>
      </dependency>
      
    • 添加配置

      eureka: 
       client: 
        register-with-eureka: false
        service-url:
         defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
      

      在RestTemplate的Bean上添加@LoadBalanced注解

    • Eureka集成Ribbon之后,客户端不需要关系微服务的IP,只需要拿到服务名称就好

  • Ribbon实现负载均衡

    • 配置三个Eureka Server集群,三个provider,一个consumer
    • 客户端获取服务列表,默认使用轮询算法访问服务
  • Ribbon负载均衡算法

    • AvailabilityFilteringRule 过滤轮询
    • RoundRobinRule 轮询
    • RandomRule 随机
    • RetryRule 轮询,失败重试
    • WeightedResponseTimeRule 权重

Feign

  • 社区版的Ribbon,封装了Ribbon,比Ribbon更简单

  • 使用

    • 导入依赖

      <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-feign -->
      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-feign</artifactId>
          <version>1.4.7.RELEASE</version>
      </dependency>
      
    • 添加@FeignClient注解,配置服务接口

    • 访问

Hystrix

  • 在分布式环境中,不可避免地会有许多服务依赖项中的某些失败。Hystrix是一个库,可通过添加等待时间容限和容错逻辑来帮助您控制这些分布式服务之间的交互。Hystrix通过隔离服务之间的访问点,停止服务之间的级联故障并提供后备选项来实现此目的,所有这些都可以提高系统的整体弹性。

  • 服务雪崩

    多个微服务之间调用的时候,如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对这个微服务的调用就会占用越来越多的系统资源,引起系统崩溃

    对于高流量的应用来说,单一的后端依赖可能会导致所有服务器上的资源在几秒钟之内饱和,这些应用程序可能导致服务之间延迟增加,备份队列,线程和其他系统资源紧张,导致整个系统发生更多的级联故障,这些都表示需要对故障和延迟进行隔离和管理,以便单个依赖关系的失败,不能取消整个应用程序或系统

  • 服务熔断

    对应服务雪崩的一种微服务链路保护机制

    当扇出链路的某个服务不可用或响应时间过长,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的响应信息,当检测到该节点微服务调用响应正常后恢复调用链路,在SpringCloud里熔断机制通过Hystrix实现,Hystrix会监控微服务调用的情况,当失败的调用到达阈值,缺省是5s内20次调用失败就会启动熔断机制,添加@HystrixCommand配置

  • 使用-服务熔断-服务端-考虑单个服务

    • 导入依赖

      <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-hystrix -->
      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-hystrix</artifactId>
          <version>1.4.7.RELEASE</version>
      </dependency>
      
    • 在Controller方法上添加熔断机制注解@HystrixCommand(fallbackMethod = “备用方法”)

    • 启动类添加对服务熔断的支持@EnableCircuitBreaker

  • 使用-服务降级-客户端-考虑整体负载

    • 高并发暂时关闭某些服务

    • 写一个服务降级处理类(DeptClientServiceFallbackFactory)

    • 添加注解配置处理类@FeignClient(fallbackFactory = DeptClientServiceFallbackFactory.class)

    • yml中开启降级

      feign: 
       hystrix: 
        enabled: true
      
  • Dashboard流监控-配置监控页面

    • 导入依赖

      <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-hystrix-dashboard -->
      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
          <version>1.4.7.RELEASE</version>
      </dependency>
      
    • 配置端口

      server: 
       port: 9000
      
    • 写一个启动类,添加注解@EnableHystrixDashboard开启监控

    • provider中配置监控servlet

      @Bean
      public ServletRegistrationBean hystrixMetricsStreamServlet(){
      	ServletRegistrationBean registrationBean = new ServletRegistrationBean(new HystrixMetricsStreamServlet());
      	registrationBean.addUrlMappings("/actuator/hystrix.stream");
      	return registrationBean;
      }
      
    • 七色一圆

Zuul

  • 包含对请求的路由和过滤功能

  • 路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础,而过滤器功能则负责对请求的处理过程进行干预,是实现请求校验,服务聚合功能的基础,将Zuul和Eureka进行整合,将Zuul自身注册为Eureka服务治理下的应用,同时从Eureka中获取其他微服务的信息,也即以后的访问微服务都是通过Zuul跳转以后获得

  • Zuul的服务最终还是会注册会Eureka

  • 使用

    • 导入依赖

      <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-zuul -->
      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-zuul</artifactId>
          <version>1.4.7.RELEASE</version>
      </dependency>
      
    • 添加配置

      server: 
       port: 8888
      spring: 
       application: springcloud-zuul
      eureka: 
       client: 
        service-url: 
         defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
       instance: 
        instance-id: zuul8888.com
        prefer-ip-address: true
      zuul: 
       routes: 
        #配置新的路径名称
        mydept.serviceId: springcloud-provider-dept
        mydept.path: /mydept/**
       #忽略真实路径
       ignored-services: "*"
       #配置公共访问前缀
       prefix: /name
      info: 
       app.name: 
       company.name: 
      
    • 启动类添加注解开启Zuul@EnableZuulProxy

Config

  • 分布式配置中心

  • Spring Cloud Config为微服务架构中的微服务提供集中化的外部支持,分为服务端和客户端两部分

  • 服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密,解密信息等访问接口

  • 客户端是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息,配置服务器默认采用git存储配置信息

  • 使用

    • 创建远程仓库

    • 添加配置文件

      spring: 
       profiles: 
        active: dev
        
      ---
      spring: 
       profiles: dev
       application: 
        name: springcloud-config-dev
        
      ---
      spring: 
       profiles: test
       application: 
        name: springcloud-config-test
      
    • 提交到远程仓库

    • 创建服务端

      • 导入依赖

        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-config-server -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
            <version>2.2.1.RELEASE</version>
        </dependency>
        
      • 添加配置

        server: 
         port: 3344
        spring: 
         application: 
          name: springcloud-config-server
         #连接远程仓库
         cloud: 
          config: 
           server: 
            git: 
             uri: https://github.com/springcloud-config.git
        
      • 写一个启动类,添加注解开启服务@EnableConfigServer

    • 远程仓库添加客户端配置

      spring:
        profiles:
          active: dev
          
      ---
      server:
        port: 8201
      #spring的配置
      spring:
        profiles: dev
        application:
          name: springcloud-provider-dept
      
      #Eureka的配置,服务注册到哪里
      eureka:
        client:
          service-url:
            defaultZone: http://eureka7001.com:7001/eureka/
      
      ---
      server:
        port: 8202
      #spring的配置
      spring:
        profiles: test
        application:
          name: springcloud-provider-dept
      
      #Eureka的配置,服务注册到哪里
      eureka:
        client:
          service-url:
            defaultZone: http://eureka7001.com:7001/eureka/
      
    • 创建客户端

      • 导入依赖

        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-config -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
            <version>2.2.1.RELEASE</version>
        </dependency>
        
      • 添加配置

        • bootstrap.yml 系统级别配置文件

          spring: 
           cloud: 
            config:
             #从git上获取资源
             name: config-client
             profile: dev
             label: master
             uri: http://localhost:3344
          
        • application.yml 用户级别配置文件

          spring: 
           application: 
            name: springcloud-config-client-3355
          
      • Controller中获取远程服务

        @Value("${spring.application.name}")
        private String appicationName;
        
        @Value("${eureka.client.service-url.defaultZone}")
        private String eurekaServer;
        
        @Value("${server.port}")
        private String port;
        
  • 1
    点赞
  • 2
    评论
  • 4
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值