服务负载均衡设计及实现(重点)

业务描述

一个服务实例可以处理请求是有限的,假如服务实例的并发访问比较大,我们会启动多个服务实例,让这些服务实例采用一定策略均衡(轮询,权重,随机,hash等)的处理并发请求,在Nacos中服务的负载均衡(Nacos客户端负载均衡)是如何应用的?

LoadBalancerClient应用:

LoadBalancerClient对象可以从nacos中基于服务名获取服务实例,然后在工程中基于特点算法实现负载均衡方式的调用,案例实现如下

第一步:修改ConsumerController类,注入LoadBalancerClient对象,并添加doRestEcho2方法,然后进行服务访问.:

    /**
     * 借助此对象,可以基于服务名从从nacos获取服务实例,
     * 并且基于一定的负载均衡算法进行远程客户端
     */
    //consumer->provider\
    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @GetMapping("/consumer/doRestEcho2")
    public String doRestEcho02(){
      //1,。基于服务名获取服务实例
        ServiceInstance serviceInstance = loadBalancerClient.choose("sca-provider");
        //2.基于服务实例构建要访问的服务的url
        String ip = serviceInstance.getHost();
        int port = serviceInstance.getPort();
        //string url=“http://"+id+"+port+"+/provider/echo+appName”
        String url=String.format("http://%s:%s/provider/echo/%s",ip,port,appName );
        return restTemplate.getForObject(url, //远端服务的url
                String.class);//远端服务url对应的返回值类型
    }

第二步:打开Idea服务启动配置,开启多个服务如图所示:

 第三步:修改并发运行选项(假如没有找到这个选项我们需要通过搜索引擎基于组合查询的方法,去找到对应的解决方案,例如搜索 idea allow parallel run),如图所示:

 第四步:修改服务端sca-provider的配置文件端口,分别以8081,8082端口方式进行启动。

server:
  port: 8081
spring:
  application:
    name: sca-provider #进行服务注册必须配置服务名
  cloud:
    nacos:
      discovery: #配资服务注册,发现地址
        server-addr: localhost:8848

第五步:启动成功以后,访问nacos的服务列表,检测服务是否成功注册,如图所示:

第六步:启动sca-consumer项目模块,打开浏览器对consumer服务进行访问,访问时不断刷新,检测页面数据变化,例如: 

 

@LoadBalanced

当使用RestTemplate进行远程服务调用时,假如需要负载均衡,还可以在RestTemplate对象构建时,使用@LoadBalanced对构建RestTemplate的方法进行修饰,例如在ConsumerApplication中构建名字为loadBalancedRestTemplate的RestTemplate对象:
 

    @Bean
    @LoadBalanced
    public RestTemplate loadBalancerClient2(){//基于此对象实现远端服务调用
        return new RestTemplate();
    }

}

在需要RestTemplate实现负载均衡调用的地方进行依赖注入.例如在ConsumerController类中添加 loadBalancerClient2属性

  @Autowired
    private RestTemplate loadBalancerClient2;

接下来,可以在对应的服务端调用,基于RestTemplate借助服务名调用,列如:
 

    @GetMapping("/consumer/doRestEcho3")
    public String doRestEcho03(){
        //string url=“http://"+id+"+port+"+/provider/echo+appName”
        String url=String.format("http://sca-provider/provider/echo/%s",appName );
        return loadBalancerClient2.getForObject(url, //远端服务的url
                String.class);//远端服务url对应的返回值类型
    }

核心知识点: 

  • 负载均衡诞生背景.
  • 基于LoadBalancerClient 对象实现服务发现及负载均衡(choose)
  • @Loadbalanced注解的作用以及应用分析
  • 基于Feign方式的远程服务调用实践

常见问题分析:

为什么负载均衡?(通过多个服务实例均衡处理客户端的请求)
如何理解服务发现?(服务发现就是从注册中心获取服务信息,例如从nacos获取服务实例信息)
LoadBalancerClient的作用?(从nacos注册中心获取服务实例列表,然后本地基于负载均衡算法获取服务实例)
@Loadbalanced注解作用?(描述RestTemplate对象,让系统底层为RestTemplate对象赋能)
你了解哪些负载均衡策略?(基于IRule接口去查看)
我们如何修改负载均衡策略?(配置文件,配置类)
Feign是什么?(Spring Cloud微服务规范中的一组远程调用API)
为什么使用Feign?(优化服务调用结构)
如何使用Feign实现服务调用?(依赖,@EnableFeignClients,@FeignClient)
Feign方式的服务调用原理是怎样的?(底层基于代理对象实现)
常用服务发现、服务调用方式有哪些?

 常见错误:

空指针

UnknownHostException

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值