springCloud笔记(二)负载均衡服务调用

一、Ribbon负载均衡服务调用

1、概念

Ribbon是Netfix发布的开源项目,主要哦功能是提供客户端的软件负载均衡算法和服务调用。

​ Ribbon客户端组件提供了一系列完善的配置项如连接超时,重试等,简单的说,就是在配置文件中列出Load Balance(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询、随机连接等)去连接这些机器,我们很容易使用Ribbon实现自定义的负载均衡算法

一句话就是负载均衡+RestTemplate调用

  1. LB(负载均衡)是什么

    简单的说就是将用户的请求平摊的分配到多个服务商,从而达到系统的HA(高可用)

    常见的负载均衡软件有Nginx、lvs、硬件F5等

  2. Ribbon本地负载均衡客户端 VS Nginx服务端负载均衡的区别

    1. 集中式LB

      在服务的消费方和提供方之间使用独立的LB设施(可以是硬件如F5,也可以是软件如

      Nginx),由该设施负责把访问请求通过某种策略转发至服务的提供方

      Nginx是服务器负载均衡,客户端所有请求都会交给Nginx,然后由Nginx转发请求,即

      负载均衡是由服务端来实现的

    2. 进程内LB

      将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可以用,然后自己在

      这些地址中选择出一个合适的服务器,Ribbon就属于进程内LB,他是一个类库,集成于

      消费方进程,消费方通过它来获取到服务提供方的地址,

      Ribbon本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表

      之后缓存到JVM本地,从而在本地实现RPC远程服务调用技术

2、相关配置

1、pom文件

eureka默认实现了ribbon的

spring-cloud-starter-netflix-eureka-client里面自带了ribbon依赖

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<actifactId>spring-cloud-starter-netflix-riggon</actifactId>
</dependency>

3、Ribbon核心组件IRule

1、IRule

自带的负载均衡算法由以下7种

  1. com.netflix.loadbalancer.roundRobinRule 轮询

  2. com.netflix.loadbalancer.RandomRule 随机

  3. com.netflix.loadbalancer.RetryRule 先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内会进行重试,获取可用的服务

  4. WeightedResponseTimeRule 对Round’RobinRule的扩展,响应速度越快的实例选择权重越大,越容易被选择

  5. BesavailableRule 会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务

  6. AvailabilityFilteringRule 先过滤故障实例,在选择并发i骄傲小的实例

  7. ZoneAvoidanceRule 默认规则,符合判断server所在的性能和server的可用性选择服务器

2、如何替换负载均衡算法呢

  1. 添加配置类:

    注意这个自定义配置类不能方在@ComponentScan所扫描的当前包下以及

    子包下,否则我们自定义的这个配置类就会被所有Ribbon客户端所共享,就达不到特

    殊定制化的目的

    @Configuration
    @RibbonClient()
    public class  MySelfRule{
     @Bean
     public IRule myRule(){
           return new RandomRule();
     }
    }	
    
    1. 然后再启动类上加上注解
    @RibbonClient(name="Cloud-payment-Service",configuration=MySelfRule.class)
    

4、Ribbon负载均衡算法原理

1、负载均衡算法

rest接口第几次请求数%服务器集群总数量=实际调用服务器位置下标,每次服务启动后rest

接口计数从1开始

List<ServiceInstance> list=discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
// 如: List[0] instances = 127.0.0.1:8001
//     List[1] instances = 127.0.0.1:8002

在这里插入图片描述

2、原理

通过IRule的choose来获取服务, 获取存活的实例,然后根据服务的实例个数来

通过除以集群数量来取服务

5、手写负载均衡算法

  1. ApplicationContextBean去掉注解@LoadBalanced

  2. LoadBalancer接口,自定义接口可以不用写在springboot扫描包外面

    1. 创建LoadBalancer接口,获取所有存活的实例

      public interface LoadBanalcer{
      	//获取所有存活的实例
      	ServiceInstance instances(List<ServiceInstance> serviceInstances);
      }
      
  3. MyLB 自定义类可以不用写在springboot扫描包外面

    //创建一个实现类
    @Component
    public class MyLB implements LoadBanalcer{
        private AtomicInteger atomicInteger=new AtomicInteger(0);
        public final int getAndInCreament(){
            int current;
            int next;
            do{
                current=this.atomicInteger.get();
                next=current>=Integer.Max_Value?0:current+1;
            }while(!this.atomicInteger.compareAndSet(current,next))
            return next;
        }
        @override
        public ServiceInstance instances(List<ServiceInstance> serviceInstances){
            int index=getAndIncrement()%serviceInstances.size();
            return serviceInstances.get(index);
        }
    }
    
  4. OrderController

    //引入自己的负载均衡器
    @Resource
    private LoadBalancer loadBalancer;
    @Resource
    private DiscoveryClient discoveryClient;
    
    @GetMapping("/api/payment")
    public String getPaymentLB(){
        List<ServiceInstance> list=discoveryClient.getInstances("PAYMENT-SERVICE");
        if(instances==null||instances.size()<=null){
        	return null;
    	}
        ServiceInstance serviceInstance=loadBalancer.instances(instances);
        URI uri=serviceInstance.getUri();
        return restTemplate.getForObject(uri+"/comsumer/payment",String.class);
    }
    

二、OpenFeign服务接口调用

1、概念介绍

feign是一个声明式webservice客户端,使用feign能让编写web service客户端更简单

  1. 他的使用方法是定义一个服务接口然后在上面添加注解,feign也支持可插拔式的编码器和解码器,spring cloud对feign进行了封装,使其支持了spring mvc标准注解和httpMessageConverters. Feign可以与Eureka和Ribbon组合使用以支持负载均衡

  2. 前面在使用Ribbon+RestTemplate时,利用RestTemplate对http请求的封装处理,形成

    了一套模板化的调用方法,但是再实际开发钟,由于对服务依赖的调用可能不止一处,往往

    一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依

    赖服务的调用。所以,Feign在此基础上做了进一步封装,由它来帮助我们定义和实现依赖

    服务接口的定义,再feign的实现下,我们只需创建一个接口并使用注解的方式来配置他(以

    前是Dao接口上面标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解即可),

    即可完成对服务提供方的接口绑定,简化了使用spring cloud ribbon时,自动封装服务调用

    客户端的开发量

  3. Feign集成了Ribbon,利用Ribbon维护了Payment的服务列表信息, 并且通过轮询实现了客户端的负载均衡,

    而与Ribbon不同的是,通过feign只需要定义服务绑定接口且以声明式的方法,优雅而简单的

    实现了服务调用

2、Feign和OpenFeign的区别

FeignOpenFeign
Feign是Spring Cloud组件中的一个轻量级RESTful的HTTP服务客户端,Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务,Feign 的使用方式是:使用Feign的注释定义接口,调用这个接口,就可以调用服务注册中心的服务OpenFeign是Spring Cloud再Feign的基础上支持了SpringMVC的注解,如@RequestMappings等等,OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务

3、OpenFeign的使用步骤

1、接口加上注解

微服务调用接口+@FeignClient

2、pom文件

<dependency>
	<groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openFeign</artifactId>
</dependency>

3、yml配置

server:
  port: 80
eureka:
  client:
    register-with-eureka: false
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka

4、启动类

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClient		//添加Feign注解
public class Application{
    public static void main(String[] args) {
    	SpringApplication.run(Application.class,args);
    }
}

5、业务类

  1. 业务逻辑接口+@FeignClient配置调用provider服务

    新建PaymentFeignService接口并新增注解@FeignClient

    @Component
    @FeignClient(value="CLOUD-PAYMENT-SERVICE")
    public interface PaymentFeignService{
        @GetMapping(value="/payment/get/{id}")
        CommonResult<Payment> getById(@Pathvariable Long id);
    }
    
  2. Controller调用

    @Resource
    private PaymentFeignService paymentFeignService;
    

4、Feign超时控制

  1. openFeign默认超时实际1秒钟,超时后报错

  2. yml文件里需要开启OpenFeign客户端超时控制

    #设置feign客户端超时时间(openFeign默认支持ribbon)
    ribbon:
      #指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间
      ReadTimeout: 5000
      #指的是建立连接后从服务器读取到可用资源所用的时间
      connectTimeout: 5000
    

5、Feign日志打印功能

  1. feign提供了日志打印功能,我们可以通过配置来调整日志级别,了解feign中http请求细节

    说白了就是对feign接口的调用情况进行监控和输出

  2. 日志级别:

    • NONE:默认,不显示任何日志

    • BASIC:仅记录请求方法、URL、响应状况码及执行时间

    • HEADERS:除了BASICC中定义的信息之外,还有请求的响应的头信息

    • FULL:除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据

  3. 配置日志bean

    @configuration
    public class FeignConfig{
        @Bean
        Logger.Level feignLoggerLevel(){
        	return Logger.Level.FULL;
        }
    }
    
  4. yam文件里需要开启日志的Feign客户端

    logging:
      level:
        #feign日志以什么级别监控哪个接口
        com.mml.springcloud.service.PaymentFeignService: debug
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值