一起来学SpringCloud之-服务消费者(Ribbon)

文章目录

  1. 1. - Ribbon简介

  2. 2. - 准备工作

    1. 2.1. - pom.xml

    2. 2.2. - BattcnCloudRibbonApplication.java

    3. 2.3. - bootstrap.yml

  3. 3. - 测试

    1. 3.1. - 请求图

  4. 4. - 新特性

    1. 4.1.1. - FooConfiguration

    2. 4.1.2. - BattcnCloudRibbonApplication

    3. 4.1.3. - 测试

    4. 4.1. - 定义自己的RibbonClient

    5. 4.2. - 说点什么

上一篇文章,简单概述了服务注册与发现,在微服务架构中,业务都会被拆分成一个独立的服务,服务之间的通讯是基于http restful的,Ribbon可以很好地控制HTTP和TCP客户端的行为,Spring Cloud有两种调用方式,一种是Ribbon+RestTemplate,另一种是Feign(集成Ribbon+Hystrix),本章主要讲解Ribbon

- Ribbon简介

Ribbon 是一个客户端负载均衡器,它可以让你对HTTP和TCP客户机的行为有很大的控制权,如果你正在使用 @FeignClient 那么这一段也适用,因为Feign集成了Ribbon的功能,Ribbon 中的一个中心概念就是指定客户端,每个负载均衡器都是组成组件的一部分,这些组件一起工作以根据需要请求远程服务器。

官方文档:http://cloud.spring.io/spring-cloud-static/Dalston.SR2/#spring-cloud-ribbon

- 准备工作

1.创建项目,在上一章已经详细描述了,没看过的可以详细看一下 一起来学SpringCloud之-注册中心(Eureka/Consul)

2.启动Consul,后续所有文章都将以Consul作为服务注册中心

一起来学SpringCloud之-服务消费者(Ribbon)-图片-1创建Ribbon项目

- pom.xml

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-consul-discovery</artifactId>
    </dependency>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-ribbon</artifactId>
	</dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
		<scope>test</scope>
	</dependency>
</dependencies>

 

- BattcnCloudRibbonApplication.java

@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class BattcnCloudRibbonApplication {

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

    @GetMapping("/ribbon")
    public String findHelloByEmail(String email) {
        // VIP模式,不需要填写 IP+端口 Ribbon会去注册中心获取当前可用服务然后做HTTP请求
        return "server  <<==>>  "+restTemplate().getForObject("http://battcn-cloud-hello/hello?email="+email,String.class);
    }

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

 

- bootstrap.yml

server:
  port: 8764

spring:
  application:
    name: battcn-cloud-ribbon
  cloud:
    consul:
      host: localhost
      port: 8500
      enabled: true
      discovery:
        enabled: true
        prefer-ip-address: true

 

- 测试

启动:battcn-cloud-hello(上一章的项目,稍微做了修改,app.java中添加了日志输出)
启动:battcn-cloud-ribbon(本章项目)

访问:http://localhost:8500/ 显示如下代表服务注册成功

一起来学SpringCloud之-服务消费者(Ribbon)-图片-2查看注册中心

访问:http://localhost:8763/ribbon?email=123456@qq.com

server <<==>> My Name's :battcn-cloud-hello Email:123456@qq.com

 

如果需要测试负载功能,将 battcn-cloud-hello 打包,然后通过 cmd 方式启动,因为我使用的是IDEA总是提示我关闭重启,因此我是打的JAR,如果是Eclipse的朋友可以直接修改yml文件的端口启动多次

battcn-cloud-hello-8762:java -jar battcn-cloud-hello-1.0.0-SNAPSHOT.jar --server.port=8762
	
battcn-cloud-hello-8763:java -jar battcn-cloud-hello-1.0.0-SNAPSHOT.jar --server.port=8763

 

一起来学SpringCloud之-服务消费者(Ribbon)-图片-3结果

- 请求图

一起来学SpringCloud之-服务消费者(Ribbon)-图片-4架构图

画图工具:https://www.processon.com/

- 新特性

从版本1.2.0开始,Spring Cloud Netflix现在支持使用属性与Ribbon文档兼容来自定义功能区客户端。

允许在不同环境中更改启动时的行为。

支持的属性如下所示,应以.ribbon.:

NFLoadBalancerClassName:应实现 ILoadBalancer

NFLoadBalancerRuleClassName:应实现 IRule

NFLoadBalancerPingClassName:应实现 IPing

NIWSServerListClassName:应实现 ServerList

NIWSServerListFilterClassName 应实现 ServerListFilter

注意:在这些属性中定义的类优先于使用@RibbonClient(configuration=MyRibbonConfig.class) Spring 定义的bean 以及由Spring Cloud Netflix提供的默认值。要设置IRule服务名称,users您可以设置以下内容:

application.yml

users:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule

 

详细请看官方文档:http://cloud.spring.io/spring-cloud-static/Dalston.SR2/#_customizing_the_ribbon_client_using_properties

- 定义自己的RibbonClient

警告:在FooConfiguration 中使用 @Configuration,需要注意是不是在@ComponentScan主应用程序上下文,否则会被所有的共享@RibbonClients。如果您使用@ComponentScan(或@SpringBootApplication)您需要采取措施避免它被包含(例如将其放在一个单独的,不重叠的包中,或者指定要在其中显式扫描的包@ComponentScan)。

简单点说就是:不要让 @ComponentScan 同时扫描到主程序和自定义的带有@Configuration的文件

com.battcn.BattcnCloudRibbonApplication.java

com.config.FooConfiguration.java

 

- FooConfiguration

@Configuration
public class FooConfiguration {
    @Bean
    public IRule ribbonRule(IClientConfig clientConfig) {
        return new RandomRule();
    }
}

 

- BattcnCloudRibbonApplication

@SpringBootApplication
@EnableDiscoveryClient
@RestController
@RibbonClient(name = "battcn-cloud-hello",configuration = FooConfiguration.class)
public class BattcnCloudRibbonApplication  {

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

    @GetMapping("/ribbon")
    public String findHelloByEmail(String email) {
        // VIP模式,不需要填写 IP+端口 Ribbon会去注册中心获取当前可用服务然后做HTTP请求
        return "server  <<==>>  "+restTemplate().getForObject("http://battcn-cloud-hello/hello?email="+email,String.class);
    }

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

 

- 测试

随机访问N次:http://localhost:8764/ribbon?email=123456@qq.com 结果如下(人品只要不是好到爆炸就不会五五开)

一起来学SpringCloud之-服务消费者(Ribbon)-图片-5自定义Rule

全文代码:https://git.oschina.net/battcn/battcn-cloud/tree/master/battcn-cloud-ribbon


推荐教程

Java设计模式

创建模式、结构模式、行为模式

Maven教程

Maven是一个项目管理和构建工具

Lucene教程

Lucene是一个开源的基于Java的搜索库

JUnit教程

JUnit是Java编程语言的单元测试框架

Java算法

排序、二叉树、红黑树

Log4j教程

log4j是一种用Java编写的可靠,快速和灵活的日志框架(API)

StringBoot教程

StringBoot实战操作演练

mybatis文档手册

Mybatis基础语法、实例讲解

SpringCloud教程

服务发现、断路器、智能路由

Guava教程

Guava是开源的Java工具库

Elasticsearch教程

一款强大的搜索引擎