浅析-----SpringCloud常用组件

眉间皱痕 提交于 2019-12-05 09:30:49

SpringCloud主要的作用就是用来 管理微服务  

SpringCloud不是一个具体的框架,而是很多个组件的集合,总成springcloud

例举常用组件有:

  服务注册中心——Netflix Eureka

  客户端负载均衡——Netflix Ribbon

  客户端负载均衡——Feign

  熔断器——Netflix Hystrix

  服务网关——Netflix Gateway(Zuul)

    

 

1,服务注册中心——Netflix Eureka:

 

分析说明:

Eureka是服务注册中心,只做服务注册;自身并不提供服务也不消费服务。可以搭建web工程使用Eureka,可以使用Spring Boot方式搭建

启动器依赖:

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

application.yml配置文件:

server:
  port: 10086
spring:
  application:
    name: eureka-server
eureka:
  client:
    service-url:
      # eureka 服务地址,如果是集群的话;需要指定其它集群eureka地址
      defaultZone: http://127.0.0.1:10086/eureka
    # 不注册自己
    register-with-eureka: false
    # 不拉取服务
    fetch-registry: false

启动引导类注解:

 

服务注册与发现:

EurekaClient 将自己注册到EurekServer,并从EurekaServer获取服务列表进行远程调用
注册服务(服务的提供者)
发现服务(服务的调用者)

通过注解注明Eureka客户端发现功能

 

Eureka Server 高可用配置:

Eureka Server是一个web应用,可以启动多个实例(配置不同端口)保证Eureka Server的高可用

将Eureka Server作为一个服务注册到其它Eureka Server,这样多个Eureka Server之间就能够互相发现对方,同步服务,实现Eureka Server集群。

其主要配置不同端口;

 

 

2, 客户端负载均衡——Netflix Ribbon:

负载均衡是一个算法,可以通过该算法实现从地址列表中获取一个地址进行服务调用

Ribbon提供了轮询、随机两种负载均衡算法(默认是轮询)可以实现从地址列表中使用负载均衡算法获取地址进行服务调用

Ribbon的负载均衡通过RestTemplate远程调用实现:

实例化RestTemplate的时候使用@LoadBalanced,服务地址直接可以使用服务名。

 

3,客户端负载均衡——Feign:

Feign主要作用:自动根据参数拼接http请求地址。

Feign基于以上的客户端负载均衡Ribbon进行优化封装,即:Ribbon+RestTemplate

实现步骤:

  1. 导入启动器依赖;

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
  1. 编写Feign客户端 @FeignClient开启Feign功能

//声明当前类是一个Feign客户端,指定服务名为user-service
@FeignClient("user-service")
public interface UserClient {

    //http://user-service/user/123
    @GetMapping("/user/{id}")
    User queryById(@PathVariable Long id);
}

  3,编写一个处理器ConsumerFeignController,注入Feign客户端并使用

@RestController
@RequestMapping("/cf")
public class ComsumerFeignController {

    //通过Feign实现远程调用
    @Autowired
    private UserClient userClient;

    @GetMapping("/{id}")
    public User findById(@PathVariable Long id) {
        return userClient.findById(id);
    }
}

 

4,熔断器——Netflix Hystrix:

 熔断器的作用:某个服务的单个点的请求故障会导致用户的请求处于阻塞状态,最终的结果就是整个服务的线程资源消耗殆尽。

 由于服务的依赖性,会导致依赖于该故障服务的其他服务也处于线程阻塞状态,最终导致这些服务的线程资源消耗殆尽 直到不可用,

 从而导致整个问服务系统都不可用,即产生雪崩效应

Hystrix解决雪崩效应:

  • 线程隔离:用户请求不直接访问服务,而是使用线程池中空闲的线程访问服务,加速失败判断时间。

  • 服务降级:及时返回服务调用失败的结果,让线程不因为等待服务而阻塞。

熔断器原理:

  

 

通过配置服务熔断参数修改默认:

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 2000
      circuitBreaker:
        errorThresholdPercentage: 50 # 触发熔断错误比例阈值,默认值50%
        sleepWindowInMilliseconds: 10000 # 熔断后休眠时长,默认值5秒
        requestVolumeThreshold: 10 # 熔断触发最小请求次数,默认值是20

 引入坐标

pom.xml    spring-cloud-starter-netflix-hystrix

引导类上加   

@SpringCloudApplication
@EnableFeignClients //开启Feign功能
public class ComsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ComsumerApplication.class, args);
    }
服务调用者的Controller类中提供一个降级服务的方法
方案一:写在方法上
    @HystrixCommand(fallbackMethod="methodName")
方案二:降级服务的方法抽取出去,让所有的方法使用
    写在Controller类上@DefaultProperties(defaultFallback = "methodName")
    Controller的方法上, @HystrixCommand

降级服务的方法要和原方法的参数和返回值要一致。

 

服务熔断和服务降级的关系是:

 

closed  :  调用的是原有的服务(method)
open   调用的是降级服务(method)
half open  尝试调用原有的服务,如果能调通,将熔断的状态改为closed,如果调不通,还是保持open状态

 

 

 

5.服务网关——Netflix Gateway(Zuul):

引入坐标

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

配置文件

server:
  port: 10010
spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      routes:
        # 路由id,可以任意
        - id: user-service-route
          # 代理的服务地址
          uri: http://127.0.0.1:9091
          # 路由断言: 可以匹配映射路径
          predicates:
            - Path=/user/**
            
# Gateway网关地址
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka
  instance:
    prefer-ip-address: true

面向服务路由:

面向服务的路由;只需要在配置文件中指定路由路径类似: lb://user-service

路由前缀处理(过滤):

提供服务的地址:http://127.0.0.1:9091/user/8

  • 添加前缀:对请求地址添加前缀路径之后再作为代理的服务地址;

http://127.0.0.1:10010/8 --> http://127.0.0.1:9091/user/8 添加前缀路径/user

  • 去除前缀:将请求地址中路径去除一些前缀路径之后再作为代理的服务地址;

http://127.0.0.1:10010/api/user/8 --> http://127.0.0.1:9091/user/8 去除前缀路径/api

总结:

客户端的请求地址与微服务的服务地址如果不一致的时候,可以通过配置路径过滤器实现路径前缀的添加和去除。

 

注:由于作者对Spring Cloud Config 与 Spring Cloud Bus掌握不深,暂不概述

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!