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);    }
原创粉丝点击