SpringCloud 服务消费者(RestTemplate+Ribbon)

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

内容简介: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。可以发现浏览器随机显示端口。


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

查看所有标签

猜你喜欢:

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

Agile Web Development with Rails 4

Agile Web Development with Rails 4

Sam Ruby、Dave Thomas、David Heinemeier Hansson / Pragmatic Bookshelf / 2013-10-11 / USD 43.95

Ruby on Rails helps you produce high-quality, beautiful-looking web applications quickly. You concentrate on creating the application, and Rails takes care of the details. Tens of thousands of deve......一起来看看 《Agile Web Development with Rails 4》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换