SpringCloud 服务消费者(RestTemplate+Ribbon)

栏目: Java · 发布时间: 5年前

内容简介:Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它有助于控制HTTP和TCP的客户端的行为。为Ribbon配置服务提供者地址后,Ribbon就可基于某种负载均衡算法,自动地帮助服务消费者去请求。Ribbon默认为我们提供了很多负载均衡算法,例如轮询、随机等,我们也可为Ribbon实现自定义的负载均衡算法。1.启动2.在say-hello项目中添加一个controller,对外提供服务

Ribbon简介

Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它有助于控制HTTP和TCP的客户端的行为。为Ribbon配置服务提供者地址后,Ribbon就可基于某种负载均衡算法,自动地帮助服务消费者去请求。Ribbon默认为我们提供了很多负载均衡算法,例如轮询、随机等,我们也可为Ribbon实现自定义的负载均衡算法。

启动注册中心和服务提供者

1.启动 SpringCloud 高可用服务注册中心(Eureka) 搭建的注册中心和服务提供者。

2.在say-hello项目中添加一个controller,对外提供服务

@RestController
public class SayHelloController {
    @Value("${server.port}")
    private String serverPort;

    @GetMapping("/sayHello")
    public String sayHelloCtr(@RequestParam("helloName")String helloName){
        return "Hello "+helloName+",我的端口是: "+serverPort;
    }
}

3.然后把注册中心和服务提供者say-hello分别启动两个实例。

4.查看Eureka注册中心( http://localhost :11111/, http://localhost :11112/)

SpringCloud 服务消费者(RestTemplate+Ribbon)

SpringCloud 服务消费者(RestTemplate+Ribbon)

创建服务消费者

1.创建一个module项目(service-ribbon)

2.添加maven依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>com.definesys</groupId>
        <artifactId>my_cloud</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.definesys</groupId>
    <artifactId>service-ribbon</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>service-ribbon</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </dependency>
        <!--ribbon中使用断路器-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

3.修改配置文件

server.port=3333

eureka.client.service-url.defaultZone=http://server1:11111/eureka/,http://server2:11112/eureka/

spring.application.name=service-ribbon

4.创建一个开启负载均衡的restRemplate

@Configuration
public class RestTemplateConfig {
    @Bean
    @LoadBalanced //表明这个restRemplate开启负载均衡的功能
    public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder){
        return restTemplateBuilder
                .setConnectTimeout(20000)
                .setReadTimeout(30000)
                .build();
    }

}

5.添加service消费say-hello提供的服务

@Service
public class HelloServiceRibbonSer {
    @Autowired
    RestTemplate restTemplate;

    public String helloServiceRibbon(String helloName) {
        return restTemplate.getForObject("http://say-hello/sayHello?helloName="+helloName,String.class);
    }
    
}

注:getForObject中的url say-hello为say-hello项目(服务提供者)的应用名称,也就是在创建say-hello项目时在配置文件中配置的spring.application.name=say-hello。sayHello为say-hello项目中接口的地址(controller), helloName是请求参数。

6.创建controller,调用service中的方法

@RestController
public class HelloServiceRibbonControler {
    @Autowired
    private HelloServiceRibbonSer helloServiceRibbonSer;

    @GetMapping("/ribbonHello")
    public String ribbonHelloCtr(@RequestParam("helloName")String helloName){
        return helloServiceRibbonSer.helloServiceRibbon(helloName);
    }
}

7.启动service-ribbon,在浏览器地址栏访问ribbon项目中的controller

SpringCloud 服务消费者(RestTemplate+Ribbon)

SpringCloud 服务消费者(RestTemplate+Ribbon)

当一直访问 http://localhost :3333/ribbonHello?helloName=aaaa时可以发现浏览器交替显示端口2222和2223,说明已经实现客户端的负载均衡,并且ribbon默认采用轮询的负载均衡算法。

Ribbon负载均衡策略

SpringCloud 服务消费者(RestTemplate+Ribbon)

自定义负载均衡策略

1.修改service-ribbon工程配置文件添加如下配置(使用随机方式)

client.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule

2.修改RestTemplateConfig配置类添加

@Bean
    public IRule ribbonRule() {
        return new RandomRule();//实例化与配置文件对应的策略类
    }

3.修改HelloServiceRibbonControler

@RestController
public class HelloServiceRibbonControler {
    @Autowired
    private HelloServiceRibbonSer helloServiceRibbonSer;

    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @GetMapping("/ribbonHello")
    public String ribbonHelloCtr(@RequestParam("helloName")String helloName){
        return helloServiceRibbonSer.helloServiceRibbon(helloName);
    }

    /**
     * 随机方式
     * @param helloName
     * @return
     */
    @GetMapping("/ribbonRandomHello")
    public String ribbonRandomHelloCtr(@RequestParam("helloName")String helloName){
        this.loadBalancerClient.choose("CLIENT");//随机访问策略
        return helloServiceRibbonSer.helloServiceRibbon(helloName);
    }

4.启动项目

依次启动eureka注册中心,say-hello项目,service-ribbon项目,访问 http://localhost :3333/ribbonRandomHello?helloName=aaaa。可以发现浏览器随机显示端口。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

程序员代码面试指南:IT名企算法与数据结构题目最优解

程序员代码面试指南:IT名企算法与数据结构题目最优解

左程云 / 电子工业出版社 / 2015-9 / 79.00元

这是一本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现。针对当前程序员面试缺乏权威题目汇总这一痛点,本书选取将近200道真实出现过的经典代码面试题,帮助广大程序员的面试准备做到万无一失。“刷”完本书后,你就是“题王”!__eol__本书采用题目+解答的方式组织内容,并把面试题类型相近或者解法相近的题目尽量放在一起,读者在学习本书时很容易看出面试题解法之间的联......一起来看看 《程序员代码面试指南:IT名企算法与数据结构题目最优解》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

MD5 加密
MD5 加密

MD5 加密工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具