Spring Cloud(三):服务消费Ribbon

一、Ribbon介绍

Ribbon是Netflix发布的开源项目,主要功能是为REST客户端实现负载均衡

常见的组件

1.ServerList 负载均衡使用的服务器列表。这个列表会缓存在负载均衡器中,并定期更新。当Ribbon与Eureka结合使用时,ServerList的实现类就是DiscoveryEnabledNIWSServerList,它会保存Eureka Server中注册的服务实例表。

2.ServerListFilter 服务器列表过滤器。这是一个接口,主要用于对Service Consumer获取到的服务器列表进行预过滤,过滤的结果也是ServerList。Ribbon提供了多种过滤器的实现

3.IPing 探测服务实例是否存活的策略。

4.IRule 负载均衡策略,其实现类表述的策略包括:轮询、随机、根据响应时间加权等。

5.ILoadBalancer 负载均衡器。这也是一个接口,Ribbon为其提供了多个实现,比如ZoneAwareLoadBalancer。

6.RestClient 服务调用器。顾名思义,这就是负载均衡后,Ribbon向Service Provider发起REST请求的工具。

客户端负载均衡

这里写图片描述

二、项目的构建

我们结合之前创建的项目Eureka Server和Eureka Provider来创建Eureka Consumer项目。

2.1:pom.xml如下:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.6.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <spring-cloud.version>Dalston.SR2</spring-cloud.version>
</properties>

<dependencies>

    <!-- 客户端负载均衡 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-ribbon</artifactId>
    </dependency>

    <!-- eureka客户端 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>


    <!-- spring boot实现Java Web服务-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!--暴露各种指标-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

    <!--spring-test-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

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

2.2: 创建相应的application.properties

#应用(服务)名称
spring.application.name=ribbon-consumer

#端口号
server.port=8765

#注册中心地址
eureka.client.serviceUrl.defaultZone=http://eureka:123456@localhost:8761/eureka/

#忽略安全认证
management.security.enabled=false

2.3:创建相应的入口程序

@SpringBootApplication
@EnableDiscoveryClient //开启服务
public class RibbonConsumerApplication {

public static void main(String[] args) {
    SpringApplication.run(RibbonConsumerApplication.class, args);
    }
}

2.4: 创建服务调用的控制器

@RestController
public class RibbonConsumerController {

@Bean
@LoadBalanced
public RestTemplate restTemplate(){
    return  new RestTemplate();
}

@Autowired
private RestTemplate restTemplate;

/**
     * 项目说明
     * @return
 */
@GetMapping({"/",""})
public String index(){
    return "Hi,dy_bom,this is ribbon-consumer";
}

/**
 * 远程服务ribbon rest
 * @return
 */
@GetMapping( "/index")
public Object ribbonIndex() {
    String str= restTemplate.getForEntity("http://eureka-provider/index", String.class).getBody();
    System.out.println("<<<<<<<<<<<<<ribbon返回值:"+str+">>>>>>>>>>>>>>>>>");
    return str;
      }
}

其中我们可以看出,客户端的负载均衡采用了注解的方式 @LoadBalanced注入,需要注意的是,注入的Bean和引用的Bean名称得一致。而且Ribbon默认的负载均衡为轮询

2.5:自定义负载均衡策略

@Configuration
@RibbonClient(name = "eureka-provider")
public class RibbonClientConfiguration {
@Bean
public IRule ribbonRule(){
    System.out.println("<<<<<<<<<<<<<<<<<ribbon rule called!>>>>>>>>>>>>");
    //默认轮询策略(RoundRobinRule) 随机轮询(RandomRule) 权重(WeightedResponseTimeRule) 最小的并发策略(BestAvailableRule)
//         return new RoundRobinRule();
    return new RandomRule();
    }
}

2.6:验证服务之间的调用
启动Eureka Server,Eureka Provider,Eureka Consumer以后,查看看Eureka Server的后台可以看出已经成功注册了两个服务,生产者和消费者
这里写图片描述

访问消费者index的API,检验是否调用了生产者资源
这里写图片描述
可以看出消费者的确成功的获取了生产者的资源。

三:负载均衡测试
复制生产者项目,确保各个生产者的的服务名称一致,修改各个生产者的端口后,修改API返回值。最后启动另外两个复制的生产者。
查看Eureka后台服务的注册情况:
这里写图片描述
可以看出,服务注册成功。

通过访问消费者,发送了128个请求看看返回值:
这里写图片描述

这里写图片描述
可以看出,消费者端获取服务提供者的资源为随机的。
因为我们之前在配置负载均衡策略的时候,设置为随机策略。小伙伴们可以试试其他的。

代码地址:https://github.com/rubenYuan/Spring-Cloud-Samples

PPT:http://download.csdn.net/download/ruben95001/9974839

上一篇:服务注册与发现Eureka
下一篇:熔断器Hystrix

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿呆编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值