SpringCloud五大基本组件详解之Ribbon负载均衡(二)

Ribbon负载均衡简介

1.Ribbon是什么

SpringCloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。

简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出LoadBalanCer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法。

1.1.Ribbon主要职责

LB(负载均衡)

LB,即负载均衡( Load Balanoe ),在微服务或分布式集群中经常用的一种应用。
负载均衡简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA。
常见的负载均衡有软件nginx , LVS,硬件F5等。
相应的在中间件,例如:dubbo和 SpringCloud中均给我们提供了负载均衡,SpringCloud的负载均衡算法可以自定义。

LB又分为两种,集中式LB和进程内LB

集中式LB(偏硬件)

即在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5,也可以是软件,如nginx ) ,由该设施负责把访问请求通过某种策略转发至服务的提供方;

进程内LB(偏软件)

将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的服务器。
Ribbon就属于进程内LB,它只是一个类库,集成于消费方进程,消费方通过它来获取到服各提供方的地址。

1.2 官方资料

https://github.com/Netflix/ribbon/wiki

2.Ribbon实例

上一篇的案例中,我们启动了一个springcloud-demo,然后通过DiscoveryClient来获取服务实例信息,然后获取ip和端口来访问。

但是实际环境中,我们往往会开启很多个user-service的集群。此时我们获取的服务列表中就会有多个,到底该访问哪一个呢?

一般这种情况下我们就需要编写负载均衡算法,在多个实例列表中进行选择。不过Eureka中已经帮我们集成了负载均衡组件:Ribbon,简单修改代码即可使用。

接下来,我们就来使用Ribbon实现负载均衡。

2.1.Ribbon架构说明

SpringCloud五大基本组件详解之Ribbon负载均衡(二)_第1张图片

Ribbon 在工作时分成两步:

第一步先选择 EurekaServer,它优先选择在同一个区域内负载较少的server。
第二步再根据用户指定的策略,在从server取到的服务注册列表中选择一个地址。

其中Ribbon 提供了多种策略:比如轮询、随机和根据响应时间加权。

2.2.启动两个服务实例

首先我们启动两个springcloud-demo实例,一个80,一个81。

2.3.开启负载均衡

因为Eureka中已经集成了Ribbon,所以我们无需引入新的依赖

加入Ribbon的配置

# EurekaServer地址
eureka.client.service-url.defaultZone=http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

在RestTemplate的配置方法上添加@LoadBalanced注解:

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

修改调用方式,不再手动获取ip和端口,而是直接通过服务名称调用:

@RestController
@RequestMapping("consumer")
public class ConsumerController {

    //改成下面这行
    private static final String REST_URL_PREFIX = "http://SPRINGCLOUD-DEMO-SERVICE";

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping("/test")
    public List consumerTest(){

        return this.restTemplate.getForObject(REST_URL_PREFIX+"/all",List.class);
    }
}

Ribbon整合后可以直接调用微服务而不再关心地址和端口!!!

2.4.负载均衡策略

Ribbon默认的负载均衡策略是简单的轮询

2.5Ribbon核心组件IRule

SpringCloud五大基本组件详解之Ribbon负载均衡(二)_第2张图片

Ribbon的负载均衡算法内置了7种,如果还不能满足实际的要求,那么你需要自定义负载均衡算法~~~~~
写一个类实现IRUle接口,重写其中的方法
然后把自己的规则类,注入到系统中.....

2.6 修改访问服务的算法方式

方式一:修改代码更换负载均衡策略

在启动类中添加实例负载均衡的实例,则默认的轮询策略就会失效,具体如下:

@EnableEurekaClient
@SpringBootApplication
public class SpringcloudEurekaConsumerApplication {
    /**
     * 显示实例化 负载均衡的策略对象,那么默认的轮询策略就会失效
     * @return
     */
    @Bean
    public RandomRule createRule(){
        return new RandomRule();
    }

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

方式二:修改配置文件更换负载均衡策略

第二种方式在application.properties中设置分配的策略

#设置负载均衡策略 eureka-ribbon-provider 为调用的服务的名称
eureka-ribbon-provider.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule

'eureka-ribbon-provider’是调用的服务的名称,后面的组成部分是固定的。

同时注释掉方式一中的内容

3.Feign负载均衡简介

1.1 Feign是什么

Feign是一个声明式WebService客户端。使用Feign能让编写Web Service客户端更加简单, 它的使用方法是定义一个接口,然后在上面添加注解,同时也支持JAX-RS标准的注解。Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。

Feign作用就是封装了一个注解,简化Ribbon的调用代码,让代码更加清晰,方便开发~~

官网解释:

http://projects.spring.io/spring-cloud/spring-cloud.html#spring-cloud-feign

Feign是一个声明式的Web服务客户端,使得编写Web服务客户端变得非常容易,

只需要创建一个接口,然后在上面添加注解即可。

参考官网:https://github.com/OpenFeign/feign

1.2 Feign主要作用

Feign旨在使编写Java Http客户端变得更容易。

前面在使用Ribbon+RestTemplate时,利用RestTemplate对http请求的封装处理,形成了一套模版化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以,Feign在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。在Feign的实现下,我们只需创建一个接口并使用注解的方式来配置它(以前是Dao接口上面标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解即可),即可完成对服务提供方的接口绑定,简化了使用Spring cloud Ribbon时,自动封装服务调用客户端的开发量。

Feign集成了Ribbon

利用Ribbon维护了springcloud-demo-service的服务列表信息,并且通过轮询实现了客户端的负载均衡。而与Ribbon不同的是,通过feign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用。

Feign可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller一样。你不用再自己拼接url,拼接参数等等操作,一切都交给Feign去做。

4.快速入门

2.1.导入依赖


    org.springframework.cloud
    spring-cloud-starter-openfeign

2.2.Feign的客户端

@FeignClient(value = "SPRINGCLOUD-DEMO-SERVICE")
public interface UserClientService {

    @RequestMapping("/all")
    public List queryUsers();
}
  • 首先这是一个接口,Feign会通过动态代理,帮我们生成实现类。这点跟mybatis的mapper很像

  • @FeignClient,声明这是一个Feign客户端,类似@Mapper注解。同时通过value属性指定服务名称

  • 接口中的定义方法,完全采用SpringMVC的注解,Feign会根据注解帮我们生成URL,并访问获取结果
    改造原来的调用逻辑UserController:

    @RestController
    @RequestMapping(“consumer”)
    public class ConsumerController {

      @Autowired
      private UserClientService userService;
    
      @RequestMapping("/test")
      public List consumerTest(){
          return userService.queryUsers();
      }
    

    }

2.3.开启Feign功能

我们在启动类上,添加注解,开启Feign功能

@SpringBootApplication
@EnableDiscoveryClient // 开启EurekaClient功能
@EnableFeignClients // 开启Feign功能
public class SpringcloudDemoConsumerApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringcloudDemoConsumerApplication.class, args);
	}
}
  • 你会发现RestTemplate的注册被我删除了。Feign中已经自动集成了Ribbon负载均衡,因此我们不需要自己定义RestTemplate了

5.负载均衡

Feign中本身已经集成了Ribbon依赖和自动配置:

因此我们不需要额外引入依赖,也不需要再注册RestTemplate对象。

另外,我们可以通过ribbon.xx来进行全局配置。也可以通过服务名.ribbon.xx来对指定服务配置:

SPRINGCLOUD-DEMO-SERVICE:
  ribbon:
    ConnectTimeout: 250 # 连接超时时间(ms)
    ReadTimeout: 1000 # 通信超时时间(ms)
    OkToRetryOnAllOperations: true # 是否对所有操作重试
    MaxAutoRetriesNextServer: 1 # 同一服务不同实例的重试次数
    MaxAutoRetries: 1 # 同一实例的重试次数

6.小结

Feign通过接口的方法调用Rest服务(之前是Ribbon+RestTemplate),通过Feign直接找到服务接口,由于在进行服务调用的时候融合了Ribbon技术,所以也支持负载均衡作用。

你可能感兴趣的:(ribbon,分布式)