Spring Cloud基础:netflix四组件 + Feign

前言

如果基础跟得上,框架的入门和使用其实不会太难,基本上都是以下步骤

引入依赖
编写配置
开启功能
类中使用

不过框架使用越简单,原理、实现就越难,一般开发人员可以先使用,再研究
本文简单介绍一下Spring Cloud netflix派的组件和使用

Eureka注册中心

简介

Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。
Eureka包含两个组件:Eureka Server和Eureka Client。 Eureka
Server提供服务注册服务,各个节点启动后,会在Eureka
Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
Eureka Client是一个java客户端,用于简化与Eureka
Server的交互,客户端同时也就是一个内置的、使用轮询(round-robin)负载算法的负载均衡器。 在应用启动后,将会向Eureka
Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka
Server将会从服务注册表中把这个服务节点移除(默认90秒)。 Eureka
Server之间通过复制的方式完成数据的同步,Eureka还提供了客户端缓存机制,即使所有的Eureka
Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。综上,Eureka通过心跳检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性。

依赖

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

关键注解

启动类注解:
@EnableEurekaServer 开启服务端功能
@EnableDiscoveryClient 开启客户端发现功能

部分配置

server配置:

server:
  port: 10086
spring:
  application:
    name: eureka-server # 应用名称,会在Eureka中作为服务的id标识(serviceId)
eureka:
  client:
    service-url: 
      defaultZone: http://127.0.0.1:10086/eureka
    register-with-eureka: false # 不注册自己
    fetch-registry: false #不拉取服务

client配置:

server:
  port: 8081
spring:
  application:
    name: user-service # 指定应用名称,将来会作为服务的id使用
eureka:
  client:
    service-url: 
      defaultZone: http://127.0.0.1:10086/eureka

示例

@RestController
@RequestMapping("consumer")
public class ConsumerController {
    
    

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private DiscoveryClient discoveryClient;

    @GetMapping("{id}")
    public User queryById(@PathVariable("id") Long id){
    
    
        // 根据服务id(spring.application.name),获取服务实例列表
        List<ServiceInstance> instances = discoveryClient.getInstances("user-service");
        // 取出一个服务实例
        ServiceInstance instance = instances.get(0);
        // 查询
        User user = restTemplate.getForObject(instance.getUri()+"/user/" + id, User.class);
        return user;
    }
}

Ribbon负载均衡

简介

Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix
Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用

依赖

因为Eureka中已经集成了Ribbon,所以我们无需引入新的依赖

关键注解

启动类上加注解:
@EnableFeignClients

类上加注解:
@FeignClient(“服务名”)

在RestTemplate的配置方法上添加@LoadBalanced注解

部分配置

ribbon:
  ReadTimeout: 2000 # 数据通信超时时长
  ConnectTimeout: 500 # 连接超时时长  
  MaxAutoRetries: 0 # 当前服务器的重试次数
  MaxAutoRetriesNextServer: 1 # 重试多少次服务
  OkToRetryOnAllOperations: false # 是否对所有的请求方式都重试 如果是false代表只对get请求重试

示例

RestTemplate的负载均衡

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

调用方式

@GetMapping("{id}")
public User queryById(@PathVariable("id") Long id){
    
    
    String url = "http://user-service/user/" + id;
    User user = restTemplate.getForObject(url, User.class);
    return user;
}

Feign服务调用

简介

Feign 的英文表意为“假装,伪装,变形”,
是一个http请求调用的轻量级框架,可以以Java接口注解的方式调用Http请求,而不用像Java中通过封装HTTP请求报文的方式直接调用。

Feign可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller一样。你不用再自己拼接url,拼接参数等等操作,一切都交给Feign去做

Feign中集成了Ribbon、Hystrix

依赖

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

关键注解

启动类上:
@EnableFeignClients
客户端类上:
@FeignClient(“user-service”)

示例

客户端类

@FeignClient("user-service")
public interface UserClient {
    
    

    @GetMapping("/user/{id}")  //这里的返回结果和 url地址一定要和提供方保持一致
    User queryById(@PathVariable("id") Long id);
}

调用处

@RestController
@RequestMapping("consumer")
public class ConsumerController {
    
    

    @Autowired
    private UserClient userClient;

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

Hystrix熔断降级

简介

Hystix是Netflix开源的一个延迟和容错库,用于隔离访问远程服务、第三方库,防止出现级联失败

依赖

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

关键注解

启动类注解:
@EnableCircuitBreaker

@SpringCloudApplication可代替以下三个注解
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker

降级–服务提供方

接口方法上添加注解,fallbackMethod 值为降级的接口
@HystrixCommand(fallbackMethod = “queryByIdFallBack”)
熔断的降级逻辑方法必须跟正常逻辑方法保证:相同的参数列表和返回值声明

类上添加注解
在类上指明统一的失败降级方法,fallbackMethod 的值为降级的接口
@DefaultProperties(defaultFallback= “defaultFallback”)
defaultFallback方法不需要参数
方法上加@HystrixCommand

熔断–服务调用方

接口方法加注解
@HystrixCommand

部分配置

circuitBreaker:
 requestVolumeThreshold: 10 #触发熔断的最小请求次数,默认10
 sleepWindowInMilliseconds: 10000 #休眠时长,默认是10000毫秒
 errorThresholdPercentage: 50 #触发熔断的失败请求最小占比,默认50%

示例

被调用方降级
方法上

@GetMapping("{id}")
@HystrixCommand(fallbackMethod = "queryByIdFallBack")
public String queryById(@PathVariable("id") Long id){
    
    
    String url = "http://user-service/user/" + id;
    String user = restTemplate.getForObject(url, String.class);
    return user;
}

public String queryByIdFallBack(Long id){
    
    
    log.error("查询用户信息失败,id:{}", id);
    return "对不起,网络太拥挤了!";
}

类上

@RestController
@RequestMapping("consumer")
@DefaultProperties(defaultFallback = "defaultFallBack")
public class ConsumerController {
    
    

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("{id}")
    @HystrixCommand
    public String queryById(@PathVariable("id") Long id){
    
    
        String url = "http://user-service/user/" + id;
        String user = restTemplate.getForObject(url, String.class);
        return user;
    }

    public String defaultFallBack(){
    
    
        return "默认提示:对不起,网络太拥挤了!";
    }
}

调用方熔断

@GetMapping("{id}")
@HystrixCommand
public String queryById(@PathVariable("id") Long id){
    
    
    if(id == 1){
    
    
        throw new RuntimeException("太忙了");
    }
    String url = "http://user-service/user/" + id;
    String user = restTemplate.getForObject(url, String.class);
    return user;
}

Zuul服务网关

简介

Zuul是Spring Cloud全家桶中的微服务API网关。
所有从设备或网站来的请求都会经过Zuul到达后端的Netflix应用程序。作为一个边界性质的应用程序,Zuul提供了动态路由、监控、弹性负载和安全功能

依赖

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

关键注解

启动类上:
@EnableZuulProxy // 开启Zuul的网关功能

部分配置

zuul server

server:
  port: 10010 #服务端口
spring: 
  application:  
    name: api-gateway #指定服务名
zuul:
  routes:
    user-service: /user-service/** # 这里是映射路径

参考

https://github.com/Netflix/eureka
https://github.com/Netflix/ribbon
https://github.com/OpenFeign/feign
https://github.com/Netflix/hystrix
https://github.com/Netflix/zuul

猜你喜欢

转载自blog.csdn.net/weixin_43859729/article/details/108432793