Spring Cloud Ribbon
来源:互联网 发布:中美抗苏 知乎 编辑:程序博客网 时间:2024/06/05 17:17
Spring Cloud Ribbon
- 客户端负载均衡组件Ribbon 负载均衡就是当client端发送请求得时候会均衡得分发到每个server端
创建spring-cloud-02-ribbon-eureka 就是个服务端 参考前面得copy过来的
创建spring-cloud-02-ribbon-client1 项目
- 引入pom.xml
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId></dependency>
- UserController
@RestControllerpublic class UserController { @RequestMapping(value = "/getUser", method = {RequestMethod.GET}) public User getUser(@RequestParam("id") String id) { System.err.println("client1 GET-------------" + id); return new User(id, "20", "张三"); }}
- application.properties
spring.application.name=client-serviceserver.port=1003server.context-path=/eureka.client.service-url.defaultZone=http://eureka1:8003/eureka/spring.output.ansi.enabled=always
- copy client1项目一份
创建 spring-cloud-02-ribbon-request
- 引入pom.xml
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId></dependency><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId></dependency>
- application.properties
spring.application.name=request-serviceserver.context-path=/server.port=1005eureka.client.service-url.defaultZone=http://eureka1:8003/eureka/spring.output.ansi.enabled=always
启动所有 request访问http://localhost:1005/get 当请求得次数一样时,会发现分别在client1和client2端会打印出响应得次数,每个都打印出一半
这就是负载均衡 Ribbon
在这里在介绍下retry重试机制
spring-cloud-02-ribbon-retry
- pom.xml
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId></dependency><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId></dependency><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId></dependency><dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId></dependency>
- application.properties配置
spring.application.name=retry-serviceserver.context-path=/server.port=1006eureka.client.service-url.defaultZone=http://eureka1:8003/eureka/#启动重试机制spring.cloud.loadbalancer.retry.enabled=true ##断路器hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=14000##连接超时时间#client-service.ribbon.ConnectTimeout=1000##处理超时时间#client-service.ribbon.ReadTimeout=1000req.fact.connect-timeout=1000 req.fact.connection-request-timeout=1000req.fact.read-timeout=3000#是否对所有请求都进行重试client-service.ribbon.OKToRetryOnAllOperations=true#重试切换实例得次数client-service.ribbon.MaxAutoRetriesNextServer=1#重试切次数client-service.ribbon.MaxAutoRetries=5
- 注意:
client-service.ribbon.ConnectTimeout=1000client-service.ribbon.ReadTimeout=1000这样配置没起作用 建议使用RestTemplate原始配置hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds:断路器得超时时间需要大于ribbon得超时时间,不然不会发生重试。
- RetryApplication类
@EnableCircuitBreaker //开启断路器@EnableRetry //启动Retry框架重试机制@EnableDiscoveryClient //我是服务 注册到服务中心上@SpringBootApplicationpublic class RetryApplication { @Bean @ConfigurationProperties(prefix = "req.fact") public HttpComponentsClientHttpRequestFactory httpComponentsClientHttpRequestFactory(){ return new HttpComponentsClientHttpRequestFactory(); } @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(httpComponentsClientHttpRequestFactory()); } public static void main(String[] args) { SpringApplication.run(RetryApplication.class, args); }}
- IndexController类
@RestControllerpublic class IndexController { @Autowired RestTemplate restTemplate; @RequestMapping(value = "/retry", method = {RequestMethod.GET}) @HystrixCommand(fallbackMethod = "retryFailback") public String retry(){ ResponseEntity<String> response = restTemplate.getForEntity("http://client-service/retry", String.class); System.err.println("body:" + response.getBody()); return "----- retry ok -----"; } public String retryFailback(){ System.err.println("-----启动降级策略----"); return "-----启动降级策略----"; }}
- 在spring-cloud-02-ribbon-client1项目得Controller中添加
@RequestMapping(value = "/retry", method = {RequestMethod.GET}) public String retry() { System.err.println("client1 1 call-------------"); try { Thread.sleep(4000); } catch (InterruptedException e) { e.printStackTrace(); } return "client 1"; }
- 在spring-cloud-02-ribbon-client2项目得Controller中添加
@RequestMapping(value = "/retry", method = {RequestMethod.GET}) public String retry() { System.err.println("client1 2 call-------------"); return "client 2"; }
- 在启动http://localhost:1006/retry时,通过Ribbon负载均衡会访问client1或者client2项目得retry方法,当访问到client1得retry方法时,配置得读取超时时间为3ms,重试次数为5次,retry方法睡眠为4ms,就是每次访问retry方法时重试,当重试次数6次后,会采用降级策略,因为熔断器配置得为14ms,超过熔断器得时间就会采用降级策略。
- GitHub地址
- hystrix 先入个门
- 下节服务容错保护组件Hystix
阅读全文
0 0
- spring cloud-ribbon
- spring cloud ribbon配置
- spring cloud Ribbon
- spring cloud -- Ribbon
- Spring Cloud Ribbon
- spring cloud ribbon
- Spring Cloud Ribbon
- spring-cloud【Ribbon】
- spring cloud day02【 ribbon】
- Spring Cloud Ribbon
- Spring Cloud Ribbon--智能路由
- Spring Cloud -- Ribbon负载均衡
- Spring Cloud源码分析Ribbon
- Spring Cloud Eureka+Ribbon+Hystrix
- Spring-Cloud 负载均衡 Ribbon
- 【Spring Cloud】Ribbon负载均衡
- Spring Cloud Ribbon服务重试
- Spring Cloud Ribbon 重试机制
- [caffe的python接口学习三]:生成solver文件
- 怎么在jsp页面中获取数据库数据
- SGISTL源码探究-stl_alog.h中的二分查找算法
- linux信号集与信号屏蔽字
- Python|笨方法学Python学习笔记3
- Spring Cloud Ribbon
- 数据库技巧——MySQL十大优化技巧
- python中的with
- 输入10个整数,用直接插入法对其进行排序;
- 容灾设计学习笔记
- 三年小记
- 三层
- hibernate 实体关联
- Java设计模式——原型模式(Prototype Pattern)