- 浏览: 188207 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (321)
- eclipse (4)
- idea (2)
- Html (8)
- Css (14)
- Javascript (8)
- Jquery (6)
- Ajax Json (4)
- Bootstrap (0)
- EasyUI (0)
- Layui (0)
- 数据结构 (0)
- Java (46)
- DesPattern (24)
- Algorithm (2)
- Jdbc (8)
- Jsp servlet (13)
- Struts2 (17)
- Hibernate (11)
- Spring (5)
- S2SH (1)
- SpringMVC (4)
- SpringBoot (11)
- WebService CXF (4)
- Poi (2)
- JFreeChart (0)
- Shiro (6)
- Lucene (5)
- ElasticSearch (0)
- JMS ActiveMQ (3)
- HttpClient (5)
- Activiti (0)
- SpringCloud (11)
- Dubbo (6)
- Docker (0)
- MySQL (27)
- Oracle (18)
- Redis (5)
- Mybatis (11)
- SSM (1)
- CentOS (10)
- Ant (2)
- Maven (4)
- Log4j (7)
- XML (5)
最新评论
1. Ribbon简介
2. Ribbon初步应用
2.1) 服务消费者microservice-student-consumer-80增加pom.xml依赖
2.2) 服务消费者microservice-student-consumer-80增加application.yml支持eureka
2.3) 服务消费者microservice-student-consumer-80增加SpringCloudConfig.java注解@LoadBalanced
2.4) 服务消费者microservice-student-consumer-80增加StudentConsumerApplication_80.java注解@EnableEurekaClient
2.5)服务消费者 microservice-student-consumer-80修改StudentConsumerController.java属性PRE_HOST
2.6) 服务提供者microservice-student-provider-1001增加application.yml配置
3. Ribbon负载均衡
3.1) 新建两个module 服务提供者microservice-student-provider-1002 服务提供者microservice-student-provider-1003
3.2) 修改两个项目application.yml的server.port和客户端实例名称
3.3) 修改三个项目StudentProviderController.java增加调用区分代码
3.4) ribbon默认策略
3.5) 服务消费者microservice-student-consumer-80中配置轮询策略
Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP的客户端的行为。为Ribbon配置服务提供者地址后,Ribbon就可基于某种负载均衡算法,自动地帮助服务消费者去请求。Ribbon默认为我们提供了很多负载均衡算法,例如随机、轮询等。当然,我们也可为Ribbon实现自定义的负载均衡算法。 在SpringCloud中,当Ribbon与Eureka配合使用时,Ribbon可自动从EurekaServer获取服务提供者地址列表,并基于负载均衡算法,请求其中一个服务提供者实例。展示了Ribbon与Eureka配合使用时的架构。 使用Ribbon,结合eureka集群,来实现服务的调用。
2. Ribbon初步应用
2.1) 服务消费者microservice-student-consumer-80增加pom.xml依赖
<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-config</artifactId> </dependency>
2.2) 服务消费者microservice-student-consumer-80增加application.yml支持eureka
server: port: 80 context-path: / eureka: client: #false 由于注册中心的职责就是维护服务实例,它并不需要去检索服务,所以也设置为false register-with-eureka: false service-url: defaultZone: http://eureka2001.andrew.com:2001/eureka/,http://eureka2002.andrew.com:2002/eureka/,http://eureka2003.andrew.com:2003/eureka/
2.3) 服务消费者microservice-student-consumer-80增加SpringCloudConfig.java注解@LoadBalanced
package com.andrew.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; @Configuration public class SpringCloudConfig { @Bean @LoadBalanced // 引入ribbon负载均衡 public RestTemplate getRestTemplate() { return new RestTemplate(); } }
2.4) 服务消费者microservice-student-consumer-80增加StudentConsumerApplication_80.java注解@EnableEurekaClient
package com.andrew; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class }) @EnableEurekaClient public class StudentConsumerApplication_80 { public static void main(String[] args) { SpringApplication.run(StudentConsumerApplication_80.class, args); } }
2.5)服务消费者 microservice-student-consumer-80修改StudentConsumerController.java属性PRE_HOST
package com.andrew.controller; import java.util.List; import javax.annotation.Resource; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import com.andrew.entity.Student; @RestController @RequestMapping("/student") public class StudentConsumerController { @Resource private RestTemplate restTemplate; // private final static String PRE_HOST="http://localhost:1001"; private final static String PRE_HOST="http://MICROSERVICE-STUDENT"; @PostMapping(value = "/save") private boolean save(Student student) { return restTemplate.postForObject(PRE_HOST+"/student/save", student, Boolean.class); } @SuppressWarnings("unchecked") @GetMapping(value = "/list") public List<Student> list() { return restTemplate.getForObject(PRE_HOST+"/student/list", List.class); } @GetMapping(value = "/get/{id}") public Student get(@PathVariable("id") Integer id) { return restTemplate.getForObject(PRE_HOST+"/student/get/" + id, Student.class); } @GetMapping(value = "/delete/{id}") public boolean delete(@PathVariable("id") Integer id) { try { restTemplate.getForObject(PRE_HOST+"/student/delete/" + id, Boolean.class); return true; } catch (Exception e) { return false; } } }
2.6) 服务提供者microservice-student-provider-1001增加application.yml配置
spring: application: name: microservice-student
启动microservice-eureka-server-2001 启动microservice-eureka-server-2002 启动microservice-eureka-server-2003 启动microservice-student-provider-1001 启动microservice-student-consumer-80 执行 http://localhost/student/list [{"id":1,"name":"zhangsan","grade":"11"},{"id":2,"name":"lisi","grade":"12"},{"id":3,"name":"wangwu","grade":"13"},{"id":4,"name":"student04","grade":"14"},{"id":5,"name":null,"grade":null},{"id":6,"name":"student06","grade":"16"}]
3. Ribbon负载均衡
3.1) 新建两个module 服务提供者microservice-student-provider-1002 服务提供者microservice-student-provider-1003
new -> Maven Module -> create a simple project Module Name:microservice-student-provider-1002 Parent Project:microservice Working set:SpringCloud -> Artifact Group Id:com.andrew.springcloud Artifact Id:microservice-student-provider-1002 Version:0.0.1-SNAPSHOT Packaging:jar 代码与microservice-student-provider-1001相同
new -> Maven Module -> create a simple project Module Name:microservice-student-provider-1003 Parent Project:microservice Working set:SpringCloud -> Artifact Group Id:com.andrew.springcloud Artifact Id:microservice-student-provider-1003 Version:0.0.1-SNAPSHOT Packaging:jar 代码与microservice-student-provider-1001相同
3.2) 修改两个项目application.yml的server.port和客户端实例名称
server: port: 1002 context-path: / eureka: instance: instance-id: microservice-student:1002 #客户端实例名称
server: port: 1003 context-path: / eureka: instance: instance-id: microservice-student:1003 #客户端实例名称
3.3) 修改三个项目StudentProviderController.java增加调用区分代码
@GetMapping(value = "/list") public List<Student> list() { System.out.println("list----------------------------------1001"); return studentService.list(); }
@GetMapping(value = "/list") public List<Student> list() { System.out.println("list----------------------------------1002"); return studentService.list(); }
@GetMapping(value = "/list") public List<Student> list() { System.out.println("list----------------------------------1003"); return studentService.list(); }
启动microservice-eureka-server-2001 启动microservice-eureka-server-2002 启动microservice-eureka-server-2003 启动microservice-student-provider-1001 启动microservice-student-provider-1002 启动microservice-student-provider-1003 先测试服务提供者: http://localhost:1001/student/list http://localhost:1002/student/list http://localhost:1003/student/list 再测试下eureka: http://eureka2001.andrew.com:2001/ http://eureka2002.andrew.com:2002/ http://eureka2003.andrew.com:2003/ 然后再启动服务消费者 microservice-student-consumer-80 http://localhost/student/list list----------------------------------1001 - 1003随机调用
3.4) ribbon默认策略
这种默认的轮询策略肯定是不能满足实际需求的,比如有3个服务提供者,突然挂了一个,这样的话,默认轮询,总有1/3的概率访问失败; ribbon默认给我们提供的策略有哪些;
BestAvailableRule | public class BestAvailableRule extends ClientConfigEnabledRoundRobinRule | 选择一个最小的并发请求的server | 逐个考察Server,如果Server被tripped了,则忽略,在选择其中ActiveRequestsCount最小的server |
AvailabilityFilteringRule | public class AvailabilityFilteringRule extends PredicateBasedRule | 过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(active connections 超过配置的阈值) | 使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个server的运行状态 |
WeightedResponseTimeRule | public class WeightedResponseTimeRule extends RoundRobinRule | 根据响应时间分配一个weight,响应时间越长,weight越小,被选中的可能性越低。 | 一个后台线程定期的从status里面读取评价响应时间,为每个server计算一个weight。Weight的计算也比较简单responsetime 减去每个server自己平均的responsetime是server的权重。当刚开始运行,没有形成status时,使用roubine策略选择server。 |
RetryRule | public class RetryRule extends AbstractLoadBalancerRule | 对选定的负载均衡策略机上重试机制。 | 在一个配置时间段内当选择server不成功,则一直尝试使用subRule的方式选择一个可用的server |
RoundRobinRule | public class RoundRobinRule extends AbstractLoadBalancerRule | roundRobin方式轮询选择server | 轮询index,选择index对应位置的server |
RandomRule | public class RandomRule extends AbstractLoadBalancerRule | 随机选择一个server | 在index上随机,选择index对应位置的server |
ZoneAvoidanceRule | public class ZoneAvoidanceRule extends PredicateBasedRule | 复合判断server所在区域的性能和server的可用性选择server | 使用ZoneAvoidancePredicate和AvailabilityPredicate来判断是否选择某个server,前一个判断判定一个zone的运行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用于过滤掉连接数过多的Server |
3.5) 服务消费者microservice-student-consumer-80中配置轮询策略
package com.andrew.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; import com.netflix.loadbalancer.IRule; import com.netflix.loadbalancer.RetryRule; @Configuration public class SpringCloudConfig { @Bean @LoadBalanced // 引入ribbon负载均衡,此处没有用 public RestTemplate getRestTemplate() { return new RestTemplate(); } /** * 自定义轮询算法 */ @Bean public IRule myRule(){ return new RetryRule(); } }
启动microservice-eureka-server-2001 启动microservice-eureka-server-2002 启动microservice-eureka-server-2003 启动microservice-student-provider-1001 启动microservice-student-provider-1002 启动microservice-student-provider-1003 先测试服务提供者: http://localhost:1001/student/list http://localhost:1002/student/list http://localhost:1003/student/list 再测试下eureka: http://eureka2001.andrew.com:2001/ http://eureka2002.andrew.com:2002/ http://eureka2003.andrew.com:2003/ 然后再启动服务消费者 microservice-student-consumer-80 http://localhost/student/list list----------------------------------1001 - 1003根据轮询原理调用 或者挂掉其中某个服务再调用
发表评论
-
Config Server使用
2019-03-21 10:31 4771. SpringCloud Config简介 Spri ... -
Zuul API路由网关服务
2019-03-20 14:09 4861. Zuul API路由网关服务简介 这里的API路由 ... -
Feign与Hystrix服务熔断服务降级解耦
2019-03-20 13:56 6161. Feign与Hystrix服务熔断服务降级解耦 用 ... -
Hystrix的Dashboard仪表盘与turbine集群监控
2019-03-20 13:39 5271. Hystrix服务监控Dashboard仪表盘 H ... -
Hystrix断路器
2019-03-20 09:14 3461. Hystrix断路器简介 hystrix对应的中文 ... -
Feign声明式服务调用
2019-03-20 09:09 4021. Feign声明式服务调用简介 Feign是一个声明 ... -
Eureka服务注册与发现组件
2019-03-19 14:22 3851. 服务注册与发现组件Eureka简介 Eureka gi ... -
服务消费者microservice-student-consumer-80
2019-03-19 13:17 3551. 服务消费者项目microservice-student- ... -
服务提供者microservice-student-provider-1001
2019-03-19 11:59 3281. 服务提供者项目microservice-student- ... -
SpringCloud建立父项目、公共模块项目
2019-03-19 09:54 13091. SpringCloud简介 springcloud项目 ...
相关推荐
在微服务架构中, Ribbon 是 Netflix 提供的一个客户端负载均衡器,它可以帮助我们在客户端实现对服务的请求分发,从而实现服务之间的负载均衡。Ribbon 不仅可以与 Eureka(服务发现组件)配合使用,也可以独立工作...
Spring Cloud Ribbon负载均衡器处理方法 Spring Cloud Ribbon负载均衡器处理方法是指在Spring Cloud中使用Ribbon实现负载均衡的处理方法。该方法主要介绍了如何获取服务实例,获取以后做了哪些处理,处理后又是如何...
Ribbon则是Netflix开源的一套客户端负载均衡器,它可以集成在Spring Cloud中,用于在客户端进行服务的发现和负载均衡。Ribbon会根据配置的策略,自动选择一个微服务实例来处理请求,这样可以分散负载,提高系统的...
其中,Spring Cloud Ribbon是一个客户端负载均衡器,它可以与Spring Cloud Netflix Eureka结合使用,实现服务间的智能路由和负载均衡。在这个"springcloud-ribbon负载均衡demo"中,我们将探讨Ribbon的基本概念、工作...
在Spring Cloud中,当Ribbon与Eureka配合使用时,Ribbon可自动从Eureka Server获取服务提供者地址列表,并基于负载均衡算法,请求其中一个服务提供者实例。展示了Ribbon与Eureka配合使用时的架构。
其次,Ribbon 是一个客户端负载均衡器,它嵌入在每个需要调用其他服务的客户端中。在本 demo 中,`ribbon-consumer` 应该是服务消费者,它会利用 Ribbon 实现对 `ribbon-provider` 和 `ribbon-provider2` 的智能调用...
**Ribbon负载均衡策略** - **轮询(RoundRobinRule)**: 默认策略,按顺序依次选择服务实例。 - **随机(RandomRule)**: 随机选择一个服务实例。 - **权重分配(WeightedResponseTimeRule)**: 根据服务响应时间...
在这个"SpringCloud学习之路(四)-Ribbon负载均衡的Demo代码"中,我们将深入探讨Ribbon的工作原理及其在实际应用中的配置与使用。 首先,Ribbon的主要功能是在微服务架构中,当一个请求需要转发到服务集群中的某个...
(三 Ribbon 什么是负载均衡?spring cloud如何实现负载均衡)手摸手带你一起搭建 Spring cloud 微服务 理论+实践+解析 配套例程资源
四、自定义Ribbon负载均衡算法 默认的Ribbon策略可能无法满足所有场景需求,因此我们可以自定义负载均衡算法。这通常通过实现IRule接口来完成,例如: ```java public class MyRule extends ...
Ribbon 是 Netflix 提供的客户端负载均衡器,它作为一个客户端的负载均衡中间件,实现了基于 Java 的客户端负载均衡算法。Ribbon 默认集成了 Eureka,可以从 Eureka Server 获取服务列表并进行负载均衡。Ribbon 提供...
客户端负载均衡器Ribbon是Netflix开发的一个开源组件,主要用于实现微服务架构中的客户端负载均衡功能。在本实验代码中,我们将深入理解Ribbon的工作原理及其在实际应用中的配置与使用。 Ribbon是一个轻量级的库,...
Eureka 主要用于服务注册与发现,而 Ribbon 则是客户端负载均衡器,它可以帮助我们在微服务之间进行智能路由,确保请求能够均匀地分发到各个服务实例。 **Eureka 简介** Eureka 是 Netflix 提供的一个分布式服务...
【微服务负载均衡器Ribbon&LoadBalancer实战】 在微服务架构中,负载均衡是确保服务高可用性和可伸缩性的重要技术。本教程将详细讲解两种常用的客户端负载均衡器——Ribbon和LoadBalancer,以及它们在Spring Cloud ...
Spring Cloud是构建微服务架构的一套工具集,其中Ribbon是它提供的一个客户端负载均衡器,可以帮助我们实现服务间的智能路由。本篇文章将详细探讨如何在Spring Cloud中使用Ribbon实现负载均衡。 首先,我们要理解...
Ribbon 是一个基于 Netflix OSS 开源项目的负载均衡器,它提供了多种负载均衡算法,例如 Round Robin、Random、AvailabilityFilter 等。 在 SpringCloud 中,Ribbon 是一个独立的组件,提供了负载均衡的功能。通过...
Springcloud ribbon负载均衡算法实现是基于Springcloud框架下的一个负载均衡器,主要用于客户端负载均衡。该算法实现了负载均衡的核心功能,能够整合不同的协议工具进行web service API调用,并提供了可插拔式的负载...
Ribbon是Spring Cloud中默认的客户端负载均衡器,它与Nacos结合使用,可以在服务消费者发起请求时自动选择一个可用的服务实例。通过Ribbon,可以实现基于轮询、随机等策略的负载均衡。 五、OpenFeign服务调用 ...
它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有...