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

mac2024-03-16  24

本文采用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:实现负载均衡,默认轮询。

Ribbon自带的负载规则

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

2. AvailablilityFilteringRule:该各种会忽略以下服务器:

> 无法连接的服务器:在默认情况下,如果3次连接失败,该服务器将会被置为“短路”的状态,该状态将持续30秒,如果再次连接失败,“短路”状态的持续时间将会以几何级增加。可以通过修改niws.loadbalance..connerctionFailureCountThreshold属性来配置连接失败的次数。并发数过高的服务器:如果连接到该服务器的并发数过高,也会被这个规则忽略,可以通过修改.ribbon.ActiveConnectionLimit属性来设定最高并发数。

3. WeightedResponseTimeRule:为每个服务器赋予一个权重值,服务器的响应时间越长,该权重值就越少,这个规则会随机选择服务器,这个权重值有可以能会决定服务器的选择。

4. ZoneAvoidanceRule:该规则以区域、可用服务器为基础,进行服务器选择。使用Zone对服务器进行分类,可以理解为机架或者机房。

5. BestAvailiableRule:忽略“短路”的服务器,并选择并发数较低的服务器。

6. RandomRule:随机选择可用服务器。

7. 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地址

《Srping Cloud 2.X小白教程》目录

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
最新回复(0)