spring-cloud-2x版本-Ribbon服务发现教程内含集成Hystrix熔断机制

28次阅读

共计 6426 个字符,预计需要花费 17 分钟才能阅读完成。

 本文采用 Spring cloud 本文为 2.1.8RELEASE,version=Greenwich.SR3

前言

本文基于前两篇文章 eureka-server 和 eureka-client 的实现。
参考

  • eureka-server
  • eureka-client

1 Ribbon 工程搭建

1.1 创建 spring boot 工程:eureka-ribbon

1.2 pom.xml 所需要依赖的 jar 包

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

1.3 添加 application.yml 信息

application.yml

spring:
  application:
    name: eureka-ribbon
server:
  port: 8901

eureka:
  instance:
    hostname: localhost
    lease-renewal-interval-in-seconds: 5
    lease-expiration-duration-in-seconds: 10
  client:
    service-url:
      defaultZone: http://eureka1.server.com:8701/eureka/,http://eureka2.server.com:8702/eureka/,http://eureka3.server.com:8703/eureka/

1.4 启动类添加相关注解 @EnableDiscoveryClient

package spring.cloud.demo.eurekaribbon;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;

@EnableDiscoveryClient
@SpringBootApplication
public class EurekaRibbonApplication {public static void main(String[] args) {SpringApplication.run(EurekaRibbonApplication.class, args);
    }

}

@EnableDiscoveryClient 启动 eureka 服务发现相关配置

1.5 创建应用配置类 RestTemplateConfig

package spring.cloud.demo.eurekaribbon.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * @auther: maomao
 * @DateT: 2019-09-17
 */
@Configuration
public class RestTemplateConfig {

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

}

@LoadBalanced: 实现负载均衡, 默认轮询。

<font color=red>Ribbon 自带的负载规则 </font>

  1. RoundRobinRule:系统默认的规则,通过简单的轮询服务列表来选择服务器,其他的规则在很多情况下,仍然使用 RoundRobinRule。
  2. AvailablilityFilteringRule:该各种会忽略以下服务器:

无法连接的服务器:在默认情况下,如果 3 次连接失败,该服务器将会被置为“短路”的状态,该状态将持续 30 秒,如果再次连接失败,“短路”状态的持续时间将会以几何级增加。可以通过修改 niws.loadbalance..connerctionFailureCountThreshold 属性来配置连接失败的次数。

并发数过高的服务器:如果连接到该服务器的并发数过高,也会被这个规则忽略,可以通过修改.ribbon.ActiveConnectionLimit 属性来设定最高并发数。

  1. WeightedResponseTimeRule:为每个服务器赋予一个权重值,服务器的响应时间越长,该权重值就越少,这个规则会随机选择服务器,这个权重值有可以能会决定服务器的选择。
  2. ZoneAvoidanceRule:该规则以区域、可用服务器为基础,进行服务器选择。使用 Zone 对服务器进行分类,可以理解为机架或者机房。
  3. BestAvailiableRule:忽略“短路”的服务器,并选择并发数较低的服务器。
  4. RandomRule:随机选择可用服务器。
  5. RetryRule:含有重试的选择逻辑,如果使用 RoundRobinRule。

application.yml 增加配置:

#RoundRobinRule:系统默认的规则,通过简单的轮询服务列表来选择服务器,其他的规则在很多情况下,仍然使用 RoundRobinRule
eureka-client: #对应的服务 client 的 name
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

1.6 创建 EurekaRibbonService

package spring.cloud.demo.eurekaribbon.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;

/**
 * @auther: maomao
 * @DateT: 2019-09-17
 */
@Service
public class EurekaRibbonService {

    @Autowired
    RestTemplate restTemplate;

    public String sayHello() {
        String message;
        try {message = restTemplate.getForObject("http://eureka-client/info", String.class);
        } catch (RestClientException e) {message = e.getMessage();
        }
        return message;
    }
}

http://eureka-client/info, 其中 eureka-client 为服务提供者对应的 spring.application.name

1.7 创建服务消费者控制类:EurekaRibbonConntroller

package spring.cloud.demo.eurekaribbon.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import spring.cloud.demo.eurekaribbon.service.EurekaRibbonService;

/**
 * @auther: maomao
 * @DateT: 2019-09-17
 */
@RestController
public class EurekaRibbonConntroller {

    @Autowired
    private EurekaRibbonService eurekaRibbonService;

    @RequestMapping("/syaHello")
    public String syaHello() {String message = eurekaRibbonService.sayHello();
        return "ribbon result:" + message;
    }
}

1.8 启动服务

前题保证 eureka-server 和 eureka-client 已经正常启动。然后启动 eureka-ribbon 服务。
在浏览器输入 http://localhost:8901/syaHello,如下图所示:

多次刷新后可以看到浏览器显示的是结果中端口是变化的。

结语

至此,一个简单的单点 Ribbon 服务消费者就搭建完成。

彩蛋

Hystrix Ribbon 实现断路器

场景:假如在生产环境中,访问量很大的情况下,那么就会产生很多请求阻塞的情况,然后服务器的内存消耗就会陡增,严重情况下会导致系统的崩溃,也就是常见的雪崩。为了避免这种情况,熔断保护机制就迎刃而生。在访问不通的情况下,要及时作出响应,而不是等待超时。

pom.xml 增加相关依赖

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

EurekaRibbonApplication 增加注解:@EnableHystrix

package spring.cloud.demo.eurekaribbon;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;

@EnableHystrix
@EnableDiscoveryClient
@SpringBootApplication
public class EurekaRibbonApplication {public static void main(String[] args) {SpringApplication.run(EurekaRibbonApplication.class, args);
    }

}

修改 EurekaRibbonService

package spring.cloud.demo.eurekaribbon.service;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;

/**
 * @auther: maomao
 * @DateT: 2019-09-17
 */
@Service
public class EurekaRibbonService {

    @Autowired
    RestTemplate restTemplate;

    @HystrixCommand(
            commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1000"),
            @HystrixProperty(name = "execution.isolation.strategy",value = "THREAD")},
            fallbackMethod = "syaHelloFailure")
    public String sayHello() {
        String message;
        try {message = restTemplate.getForObject("http://eureka-client/info", String.class);
        } catch (RestClientException e) {message = e.getMessage();
        }
        return message;
    }

    public String syaHelloFailure() {System.out.println("error come in");
        String message = "网络繁忙,请稍后再试";
        return message;
    }
}

演示流程

停掉其中一台服务,多次访问 http://localhost:8901/syaHello 会出现如下图情况,

可以看出,当出现服务访问不通的情况,会返回对应的错误信息。

总结

本文简单实现了 ribbon 做为消费者的搭建过程,并假如了 Hystrix 熔断机制。

代码地址

gitHub 地址


<center><font color=red>《Srping Cloud 2.X 小白教程》目录 </font></center>

  • spring cloud 2.x 版本 Eureka Server 服务注册中心教程
  • spring cloud 2.x 版本 Eureka Client 服务提供者教程
  • spring cloud 2.x 版本 Ribbon 服务发现教程 (内含集成 Hystrix 熔断机制)
  • spring cloud 2.x 版本 Feign 服务发现教程 (内含集成 Hystrix 熔断机制)
  • spring cloud 2.x 版本 Zuul 路由网关教程
  • spring cloud 2.x 版本 config 分布式配置中心教程
  • spring cloud 2.x 版本 Hystrix Dashboard 断路器教程

转载请注明出处,

  • 联系方式:4272231@163.com

转载请注明出处,联系方式:4272231@163.com

正文完
 0