ribbon客户端负载均衡
来源:互联网 发布:美工转运营可行吗 编辑:程序博客网 时间:2024/06/06 23:51
一、三种配置方式 集成eureka、注解、配置文件
1、集成erueka
在application.yml中配置(其实会默认配置好,但是最好显示配置出来)
ribbon: # 开启eureka与ribbon的集成 eureka: enabled: true
2、注解
在启动类中添加注解
// 通过注解的方式定义了一个针对service-by-annotation服务的负载均衡器(service-by-annotation是服务的名称也是负载均衡器的名称)@RibbonClients(value = { @RibbonClient(name = "service-by-annotation", configuration = ServiceByAnnontationConfiguration.class) })
@SpringBootApplication@EnableFeignClients// 通过注解的方式定义了一个针对service-by-annotation服务的负载均衡器(service-by-annotation是服务的名称也是负载均衡器的名称)@RibbonClients(value = { @RibbonClient(name = "service-by-annotation", configuration = ServiceByAnnontationConfiguration.class) })public class RibbonSampleApplication { public static void main(String[] args) { new SpringApplicationBuilder(RibbonSampleApplication.class).web(true).run(args); } // 这里定义 可以覆盖所有的 // @Bean // public IRule ribbonRule() { // return new RandomRule(); // }}
ServiceByAnnontationConfiguration:
package com.dongnaoedu.springcloud.examples.javaconfig;import org.springframework.cloud.netflix.ribbon.StaticServerList;import org.springframework.context.annotation.Bean;import com.netflix.loadbalancer.IRule;import com.netflix.loadbalancer.RoundRobinRule;import com.netflix.loadbalancer.Server;import com.netflix.loadbalancer.ServerList;// 注解的方式,对应RibbonSampleApplication中@RibbonClientspublic class ServiceByAnnontationConfiguration { // 实例源 @Bean public ServerList<Server> ribbonServerList() { // 实例列表 String listOfServers = "http://www.csdn.net,http://www.baidu.com,http://www.dongnaoedu.com"; String[] splits = listOfServers.split(","); int len = splits.length; if (len == 0) { return new StaticServerList<Server>(); } Server[] servers = new Server[len]; for (int i = 0; i < len; i++) { servers[i] = new Server(splits[i].trim()); } // 返回这个...静态的 return new StaticServerList<Server>(servers); } // 负载策略 @Bean public IRule iniRule() { // 轮询 return new RoundRobinRule(); // 随机// return new RandomRule(); }}
3、配置文件
在application.yml文件中配置
# 定义一个针对service-by-properties服务的负载均衡器。服务实例信息来自配置文件# 服务名service-by-properties: # 服务实例列表 listOfServers: http://www.csdn.net,http://www.baidu.com,http://www.dongnaoedu.com ribbon: # 负载策略 NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule # 设置它的服务实例信息来自配置文件, 如果不设置NIWSServerListClassName就会去euereka里面找 NIWSServerListClassName: com.netflix.loadbalancer.ConfigurationBasedServerList
二、三种使用方式 feign,LoadBalancerClient,resttemplate
1、LoadBalancerClient的方式
package com.dongnaoedu.springcloud.examples.way;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.cloud.client.ServiceInstance;import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;// LoadBalancerClient的方式@RestController@RequestMapping("/loadbalance")public class TestLoadBalancerClientController { static Logger logger = LoggerFactory.getLogger(TestLoadBalancerClientController.class); @Autowired LoadBalancerClient loadbalancerClient; // spring cloud 封装的 关于负载均衡组件 ribbon的工具类 //下面三个方法对应三种配置方式 // properties @RequestMapping("/properties") public void properties() { ServiceInstance serviceInstance = loadbalancerClient.choose("service-by-properties"); logger.warn("TestLoadBalancerClientController.properties执行结果:{}", serviceInstance.getUri()); } // annotation @RequestMapping("/annotation") public void annotation() { ServiceInstance serviceInstance = loadbalancerClient.choose("service-by-annotation"); logger.warn("TestLoadBalancerClientController.annotation执行结果:{}", serviceInstance.getUri()); } // eureka @RequestMapping("/eureka") public void eureka() { ServiceInstance serviceInstance = loadbalancerClient.choose("lession-4-sms-interface"); logger.warn("TestLoadBalancerClientController.eureka执行结果:{}", serviceInstance.getUri()); }}
2、resttemplate的方式
/** * */package com.dongnaoedu.springcloud.examples.way;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.cloud.client.loadbalancer.LoadBalanced;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.http.client.SimpleClientHttpRequestFactory;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.client.RestTemplate;// resttemplate的方式@RestController@RequestMapping("/resttemplate")@Configurationpublic class TestResttemplateController { static Logger logger = LoggerFactory.getLogger(TestResttemplateController.class); @Bean @LoadBalanced // 这个注解一定要加,不然LoadBalancerAutoConfiguration不会对它进行处理 RestTemplate RestTemplate() { // ribbon feign是一个公司开源,很好的集成 // resttemplate是spring的 // 这是为了设置超时 SimpleClientHttpRequestFactory simpleClientHttpRequestFactory = new SimpleClientHttpRequestFactory(); simpleClientHttpRequestFactory.setReadTimeout(2000); simpleClientHttpRequestFactory.setConnectTimeout(2000); return new RestTemplate(simpleClientHttpRequestFactory); } @Autowired RestTemplate restTemplate; // spring内置,封装了http请求的工具类 //下面对应三种配置方式 // properties @RequestMapping("/properties") public void properties() { // http://127.0.0.1:8080/sss // service-by-properties 通过名称 找到负载均衡器,负载均衡器会选择一个具体的实例 String body = restTemplate.getForObject("http://service-by-properties/", String.class); testprint(body);// 仅仅是为了根据输出内容来判断是调用的哪个接口 } // annotation @RequestMapping("/annotation") public void annotation() { String body = restTemplate.getForObject("http://service-by-annotation/", String.class); testprint(body);// 仅仅是为了根据输出内容来判断是调用的哪个接口 } // eureka @RequestMapping("/eureka") public void eureka() { String body = restTemplate.getForObject("http://lession-4-sms-interface/sms", String.class); logger.warn("TestResttemplateController.eureka执行结果:{}", body); } // 仅仅是为了根据输出内容来判断是调用的哪个接口 private void testprint(String body) { if (body.contains("dongnaoedu")) { logger.warn("根据负载均衡策略,选择实例:dongnaoedu.com"); } else if (body.contains("csdn")) { logger.warn("根据负载均衡策略,选择实例:csdn.net"); } else if (body.contains("baidu")) { logger.warn("根据负载均衡策略,选择实例:baidu.com"); } else { logger.warn("火星...."); } }}
3、feign的方式
package com.dongnaoedu.springcloud.examples.way;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.cloud.netflix.feign.FeignClient;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RestController;// Feign的方式@RestController@RequestMapping("/feign")public class TestFeignController { static Logger logger = LoggerFactory.getLogger(TestFeignController.class); // properties @Autowired FeignPropertiesClient feignPropertiesClient; @RequestMapping("/properties") public void properties() { String body = feignPropertiesClient.index(); testprint(body);// 仅仅是为了根据输出内容来判断是调用的哪个接口 } // annotation @Autowired FeignAnnotationClient feignAnnotationClient; @RequestMapping("/annotation") public void annotation() { String body = feignAnnotationClient.index(); testprint(body);// 仅仅是为了根据输出内容来判断是调用的哪个接口 } // eureka @Autowired FeignEurekaClient feignEurekaClient; @RequestMapping("/eureka") public void eureka() { String body = feignEurekaClient.index(); logger.warn("TestFeignController.eureka执行结果:{}", body); } // 仅仅是为了根据输出内容来判断是调用的哪个接口 private void testprint(String body) { if (body.contains("dongnaoedu")) { logger.warn("根据负载均衡策略,选择实例:dongnaoedu.com"); } else if (body.contains("csdn")) { logger.warn("根据负载均衡策略,选择实例:csdn.net"); } else if (body.contains("baidu")) { logger.warn("根据负载均衡策略,选择实例:baidu.com"); } else { logger.warn("火星...."); } }}@FeignClient(name = "service-by-properties")interface FeignPropertiesClient { @RequestMapping(value = "/", method = RequestMethod.GET) public String index();}@FeignClient(name = "service-by-annotation")interface FeignAnnotationClient { @RequestMapping(value = "/", method = RequestMethod.GET) public String index();}@FeignClient(name = "lession-4-sms-interface")interface FeignEurekaClient { @RequestMapping(value = "/timeout/test", method = RequestMethod.GET) public String index();}
补充:
1、eureka配置方式设置超时
ribbon: # 开启eureka与ribbon的集成 eureka: enabled: true # 暂不开启熔断机制 hystrix: enabled: false # 配置ribbon默认的超时时间 ConnectTimeout: 2000 ReadTimeout: 2000 # 是否开启重试 OkToRetryOnAllOperations: true # 重试期间,实例切换次数 比如:100个实例,我只会在四个实例上面去重试 MaxAutoRetriesNextServer: 3 # 当前实例重试次数 MaxAutoRetries: 2
2、resttemplate配置方式设置超时
@Bean @LoadBalanced // 这个注解一定要加,不然LoadBalancerAutoConfiguration不会对它进行处理 RestTemplate RestTemplate() { // ribbon feign是一个公司开源,很好的集成 // resttemplate是spring的 // 这是为了设置超时 SimpleClientHttpRequestFactory simpleClientHttpRequestFactory = new SimpleClientHttpRequestFactory(); simpleClientHttpRequestFactory.setReadTimeout(2000); simpleClientHttpRequestFactory.setConnectTimeout(2000); return new RestTemplate(simpleClientHttpRequestFactory); }
阅读全文
0 0
- ribbon客户端负载均衡
- SpringCloud---Ribbon客户端负载均衡
- Ribbon客户端负载均衡(译)
- 客户端负载均衡 Spring Cloud Ribbon
- 使用Ribbon实现客户端负载均衡
- spring cloud Ribbon 2 (客户端负载均衡)
- springcloud使用ribbon实现客户端负载均衡
- SpringBoot -- 负载均衡Ribbon
- spring cloud学习(二)使用Ribbon实现客户端负载均衡
- Spring Cloud入门教程(二):客户端负载均衡(Ribbon)
- 【SpringCloud】(六):Ribbon实现客户端负载均衡
- Spring Cloud+Eureka+Ribbon实现客户端负载均衡
- SpringCloud 笔记 (六)---- 客户端负载均衡Ribbon
- 【Spring Cloud】--客户端负载均衡Spring Cloud Ribbon
- SpringCloud(三)Ribbon负载均衡
- Ribbon负载均衡策略配置
- 自定义Ribbon的负载均衡
- Spring Cloud -- Ribbon负载均衡
- Intellij IDEA15:建立Scala的Maven项目
- 第1025期机器学习日报(2017-07-09)
- 第1021期机器学习日报(2017-07-05)
- 第1026期机器学习日报(2017-07-10)
- 1 Springboot SpringCloud集成OAuth2入门详细教程
- ribbon客户端负载均衡
- 第1030期机器学习日报(2017-07-14)
- 第1029期机器学习日报(2017-07-13)
- php 闭包
- 第5周项目项目3
- 第1028期机器学习日报(2017-07-12)
- 百度 建立安全连接失败
- 如何将protobuf应用至python
- 进程同步中的信号量机制(一)