spring cloud 2.x版本 Ribbon服务发现教程(内含集成Hystrix熔断机制)
本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3
前言
本文基于前两篇文章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自带的负载规则
- RoundRobinRule:系统默认的规则,通过简单的轮询服务列表来选择服务器,其他的规则在很多情况下,仍然使用RoundRobinRule。
- AvailablilityFilteringRule:该各种会忽略以下服务器:
无法连接的服务器:在默认情况下,如果3次连接失败,该服务器将会被置为“短路”的状态,该状态将持续30秒,如果再次连接失败,“短路”状态的持续时间将会以几何级增加。可以通过修改niws.loadbalance..connerctionFailureCountThreshold属性来配置连接失败的次数。
并发数过高的服务器:如果连接到该服务器的并发数过高,也会被这个规则忽略,可以通过修改.ribbon.ActiveConnectionLimit属性来设定最高并发数。
- WeightedResponseTimeRule:为每个服务器赋予一个权重值,服务器的响应时间越长,该权重值就越少,这个规则会随机选择服务器,这个权重值有可以能会决定服务器的选择。
- ZoneAvoidanceRule:该规则以区域、可用服务器为基础,进行服务器选择。使用Zone对服务器进行分类,可以理解为机架或者机房。
- BestAvailiableRule:忽略“短路”的服务器,并选择并发数较低的服务器。
- RandomRule:随机选择可用服务器。
- 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熔断机制。
代码地址
《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
spring cloud 2.x版本 Ribbon服务发现教程(内含集成Hystrix熔断机制)的更多相关文章
- spring cloud 2.x版本 Feign服务发现教程(内含集成Hystrix熔断机制)
前言 本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 本文基于前两篇文章eureka-server和eureka-client的实现. 参考 ...
- spring cloud 2.x版本 Eureka Client服务提供者教程
本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 1 创建eureka client 1.1 新建Srping boot工程:eureka-c ...
- spring cloud 2.x版本 Zuul路由网关教程
前言 本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 本文基于前两篇文章eureka-server.eureka-client.eureka ...
- spring cloud 2.x版本 Gateway动态路由教程
摘要 本文采用的Spring cloud为2.1.8RELEASE,version=Greenwich.SR3 本文基于前面的几篇Spring cloud Gateway文章的实现. 参考 Gatew ...
- spring cloud 2.x版本 Gateway路由网关教程
前言 本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 本文基于前两篇文章eureka-server.eureka-client.eureka ...
- spring cloud 2.x版本 Config配置中心教程
前言 本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 本文基于前面的文章eureka-server的实现. 参考 eureka-server ...
- spring cloud 2.x版本 Gateway自定义过滤器教程
前言 本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 本文基于前两篇文章eureka-server.eureka-client.eureka ...
- Spring Cloud官方文档中文版-服务发现:Eureka服务端
官方文档地址为:http://cloud.spring.io/spring-cloud-static/Dalston.SR3/#spring-cloud-eureka-server 文中例子我做了一些 ...
- Spring Cloud官方文档中文版-服务发现:Eureka客户端
官方文档地址为:http://cloud.spring.io/spring-cloud-static/Dalston.SR2/#_spring_cloud_netflix 文中例子我做了一些测试在:h ...
随机推荐
- java时间格式转换任意格式
例如:20180918/120023转换成2018-09-18 12:00:23 //时间格式转换 public String getNomalTime(String oldTime){ String ...
- java实现图片验证码
一.验证码生成类 package hbi.tech.utils; import javax.imageio.ImageIO; import java.awt.*; import java.awt.im ...
- 利用Python与selenium自动化模拟登陆12306官网!
近年来,12306的反爬越来越来严重,从一年前的 获取tk参数后到现在增加了 JS.CSS等加密方式! 目前大部分人利用的登陆方式都是利用selenium ,此文也不例外. 环境: Wi ...
- .Net Core 3.0 稳定版发布啦!
上个月的月底(9.23-9.25),.NET 开发者大会开始了,这届大会最主要的议题其实就是微软终于将.NET Core 3.0的面纱揭开了,我们也终于了解到了最新版本的.Net Core平台给我们带 ...
- bugku web8
打开网站,是一段PHP代码, <?php extract($_GET); if (!empty($ac)) { $f = trim(file_get_contents($fn)); if ($a ...
- powershell下ssh客户端套件实现
有时会需要和Linux机器进行交互.所以这时就需要在Powershell中使用SSH. 0x01 查找Powershell中的SSH功能模块 如图,显示没有find-module的命令,需要安装Pac ...
- 数据结构2_java---栈,括号匹配
package Main; import java.util.Scanner; import javax.swing.text.html.HTMLDocument.HTMLReader.Isindex ...
- 部署在本服务器上,Jenkins无法启动Tomcat
今天在部署Jenkins的过程中,有一个需要部署在本服务器上的Web服务,而且Jenkins给我的反馈也是成功的部署了,且Tomcat启动起来了,但是实际打开项目发现其实并没有启动起来 在查看日志的时 ...
- mysql::批量入库
批量入库 INSERT INTO M_Signal (Signal_Id, Signal_Name) VALUES(,,'water') , , , , 'water') ON DUPLICATE K ...
- 研究了3天,终于将 Shader 移植到 Cocos Creator 2.2.0 上了!
预览 扫光特效-Fluxay2 马赛克像素特效-Mosaic 过渡效果-Transfer Shawn 花了3天时间,研究了Cocos Creator 2.2.0 的 Effect 语法,终于在1024 ...