在spring-cloud-demo工程中添加module:demo-service-ribbon
在pom.xml文件中加入依赖:java
<dependencies> <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> </dependencies>
在resource目录下增长application.properties文件,添加以下内容:算法
################## 服务配置 ############### server.port=9136 spring.application.name=demo-service-ribbon #注册到注册中心 eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/,http://localhost:8762/eureka/
建立一个启动类:ServiceRibbonApplication.java,添加以下内容:spring
@SpringBootApplication @EnableDiscoveryClient public class ServiceRibbonApplication { public static void main(String[] args) { SpringApplication.run(ServiceRibbonApplication.class, args); } @Bean @LoadBalanced ////负载均衡配置 RestTemplate restTemplate() { return new RestTemplate(); } }
添加Service类:DemoRibbonService.java,添加以下内容:并发
@Service public class DemoRibbonService { @Autowired RestTemplate restTemplate; public String port() { return restTemplate.getForObject("http://demo-service/port", String.class); } }
添加Controller类:DemoRibbonController.java,添加以下内容:app
@RestController public class DemoRibbonController { @Autowired DemoRibbonService demoRibbonService; @RequestMapping("hello") public String port() { return demoRibbonService.port(); } }
分别使用980六、9807端口运行以前构建的demo-service工程
在运行demo-service-ribbon项目,访问:http://localhost:9136/hello,显示以下:
I am demo-service, I'm from port : 9806
再次访问http://localhost:9136/hello,显示以下:
I am demo-service, I'm from port : 9807负载均衡
说明demo-service-ribbon工程中加了@LoadBalanced注解的restTemplate在访问demo-service服务时使用了Ribbon的负载均衡功能dom
RandomRule:从服务列表中随机取一个服务实例rest
RoundRobinRule:从服务列表中以轮询的方式取实例code
RetryRule:根据maxRetryMillis最大重试时间参数在获取服务实例失败时重试获取服务实例server
WeightedResponseTimeRule
该策略是对RoundRobinRule的扩展, 增长了根据实例的运行状况来计算权重, 并根据权重来挑选实例, 以达到更优的分配效
ClientConfigEnabledRoundRobinRule
这个策略跟RoundRobinRule功能相同,其做用是能够继承这个策略重写choose()方法,当自定义的选择策略没法实施时能够用父类的策略做为备选方案
BestAvailableRule
该策略继承自ClientConfigEnabledRoundRobinRule, 在实现中它注入了负载均衡器的统计对象LoadBalancerStats , 同时在具体的choose 算法中利用LoadBalancerStats 保存的实例统计信息来选择知足要求的实例。从源码中看出, 它经过遍历负载均衡器中维护的全部服务实例,会过滤掉故障的实例, 并找出并发发请求数最小的一个, 因此该策略的特性是可选出最空闲的实例。
ZoneAvoidanceRule
待补充。。
以配置随机策略为例
在启动类文件ServiceRibbonApplication.java中加入方法:
//新增随机策略 @Bean public IRule ribbonRule() { return new RandomRule(); //这里选择随机策略,对应配置文件 }
分别使用980六、9807端口运行以前构建的demo-service工程 再运行demo-service-ribbon项目,访问:http://localhost:9136/hello,多访问几回就会发现返回的端口就是随机的了 I am demo-service, I'm from port : 9806 I am demo-service, I'm from port : 9807 I am demo-service, I'm from port : 9806 I am demo-service, I'm from port : 9806