SpringCloud实战七:Spring Cloud Ribbon 实战

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhuyu19911016520/article/details/85014627

前面的两篇博客已经讲解了Feign作为服务间的调用,但是Feign是集成、封装了Ribbonn这个组件而来的,让服务间的调用更方便,因此大多使用Feign,本篇让大家了解Ribbon的概念与调用

Ribbon是Netflix开发的一个负载均衡组件,它在服务体系中起着重要作用,Pivotal将其整合成为Spring Cloud Ribbon,与其他SpringCloud组件结合可以发挥出强大作用,它的负载策略有多种,默认轮询,可配置超时重试

说到负载均衡,Ribbon与Lvs、Nginx不一样,nginx是服务端负载均衡,Ribbon是客户端负载均衡,具体表现为客户端从注册中心拿到服务的所有实例,然后以负载均衡方式去调用服务,默认以轮询的方式去调用服务实例

代码实战

实战思路:1.启用注册中心,2.创建服务提供者,服务提供者至少启动两个节点,3.创建服务消费者,以restTemplate的方式调用服务提供者,查看ribbon组件是否以负载均衡的方式调用服务提供者

1.启动之前博客中的Eureka注册中心
2.创建一个maven项目,再创建服务提供者
  • 服务提供者很简单,只需要引入下面依赖:
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
  • 在主类上启用@EnableDiscoveryClient
  • 在配置文件中配置好注册中心地址
server.port=9600
spring.application.name=provider-service
eureka.instance.prefer-ip-address=true
#配置eureka-server security的账户信息
eureka.client.serviceUrl.defaultZone=http://zy:zy123@localhost:10025/eureka/
  • 创建控制器,提供服务,返回端口信息
@RestController
public class IndexController {

    @GetMapping("/hello")
    public String hello(String name , HttpServletRequest request){
        //返回端口信息
        return " From Port : " + request.getServerPort() + " , hello " + name;
    }
}

服务提供者打包,定位到jar包目录,使用如下命令,启用两个节点,访问一下看看是否正常
java -jar provider-service-0.0.1-SNAPSHOT.jar --server.port=9600
java -jar provider-service-0.0.1-SNAPSHOT.jar --server.port=9601
在这里插入图片描述
两个服务提供者节点都正常

3.创建ribbon服务消费者
  • 服务消费者比服务提供者多引入一个依赖:spring-cloud-starter-netflix-ribbon
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
  • 在主类上启用@EnableDiscoveryClient,同时添加一个Bean
    /**
	 * 添加LoadBalanced,使RestTemplate以负载均衡的方式调用服务
	 * @return
	 */
	@Bean
	@LoadBalanced
	public RestTemplate restTemplate(){
		return new RestTemplate();
	}
  • 在配置文件中配置好注册中心地址,端口为9500,实例名为ribbon-service,其它配置都一样
server.port=9500
spring.application.name=ribbon-service
eureka.instance.prefer-ip-address=true
#配置eureka-server security的账户信息
eureka.client.serviceUrl.defaultZone=http://zy:zy123@localhost:10025/eureka/
  • 添加一个控制器,注入RestTemplate,访问服务提供者
@RestController
public class IndexController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/sayHello")
    public String sayHello(String name){
        String url = "http://provider-service/hello?name=" + name;
        String result = restTemplate.getForObject(url , String.class);
        return result;
    }
}
  • 启动服务消费者,查看注册中心,可以看到服务提供者有2个节点9600、9601,服务消费者一个节点9500
    在这里插入图片描述
  • 访问服务消费者,验证服务调用是否以负载均衡方式
    第一次访问,调用了9600端口的服务提供者
    在这里插入图片描述
    第二次访问,调用了9601端口的服务提供者
    在这里插入图片描述

OK,Ribbon默认使用轮询方式调用服务
下面说说怎么使用其他方式,也就是其他负载均衡策略调用服务和配置超时重试
ribbon有7种策略,随机、轮询、最小并发、响应时间加权等策略,其它自行百度
在项目中使用也很简单,定义一个config类,添加一个bean,指明使用什么策略,代码如下:

/**
 * ribbon负载均衡配置
 */
@Configuration
public class RibbonLBConfig {

    //使用随机策略
    @Bean
    public IRule ribbonRule(){
        return new RandomRule();
    }
}

超时与重试,只需在配置文件中配置

#请求处理的超时时间
ribbon:
  # 同一实例最大重试次数,不包括首次调用
  MaxAutoRetries: 1
  # 重试其他实例的最大重试次数,不包括首次所选的server
  MaxAutoRetriesNextServer: 2
  # 是否所有操作都重试
  OkToRetryOnAllOperations: false
  # 是否所有操作都进行重试
  ReadTimeout: 10000
  ConnectTimeout: 10000

代码已上传至码云,源码,项目使用的版本信息如下:

  • SpringBoot 2.0.6.RELEASE
  • SpringCloud Finchley.SR2(非常新的版本)

猜你喜欢

转载自blog.csdn.net/zhuyu19911016520/article/details/85014627