业务描述
一个服务实例可以处理请求是有限的,假如服务实例的并发访问比较大,我们会启动多个服务实例,让这些服务实例采用一定策略均衡(轮询,权重,随机,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