相关文章推荐
重感情的地瓜  ·  是new image() ...·  6 月前    · 
爱热闹的西装  ·  连接字符串 - ...·  1 年前    · 

当前内容基于上面的一个demo进行负载均衡优化(说白了就是优化获取访问的url)

上一个demo为: eureka的多个服务相互调用的demo

由于上一个demo中出现了重复, 需要通过DiscoveryClient获取当前的一个需要调用的服务实例ServiceInstance,然后拼接url实现访问操作(这个操作是重复的,基本每个访问中都存在这个问题)

所以这里就看看spring的负载均衡都干了什么,并且查看如何实现的,优化了哪些东西

2.pom配置和部分App门面访问的优化

为目前的AppDemo中的pom文件添加负载均衡优化

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

为当前的RestTemplate的@Bean上面添加@LoadBalanced注解

	@Autowired
	RestTemplate restTemplate;
	@Bean
	@LoadBalanced // 开启负载均衡
	public RestTemplate restTemplate() {
		return new RestTemplate();

重写前面的getPermiss方法

@RequestMapping("getPermiss")
	public String getPermiss(String roleName) {
		System.out.println("访问App门面中通过角色名称获取用户权限");
		 * List<ServiceInstance> instances = client.getInstances("permiss" +
		 * SUFIX_STRING); ServiceInstance serviceInstance = instances.get(0); String
		 * string = serviceInstance.getUri().toString();
		ResponseEntity<String> postForEntity = restTemplate.getForEntity("http://permiss" + SUFIX_STRING + "/getPermissByRoleName?roleName={1}",
				String.class, roleName);
		String body = postForEntity.getBody();
		return body;

3.测试getPermiss

发现照样访问成功!

4.分析RestTemplate都做了什么

1.查看控制台

DynamicServerListLoadBalancer for client permiss-service-provider initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=permiss-service-provider,current list of Servers=[localhost:2003],Load balancer stats=Zone stats: {defaultzone=[Zone:defaultzone; Instance count:1; Active connections count: 0; Circuit breaker tripped count: 0; Active connections per server: 0.0;] },Server stats: [[Server:localhost:2003; Zone:defaultZone; Total Requests:0; Successive connection failure:0; Total blackout seconds:0; Last connection made:Thu Jan 01 08:00:00 CST 1970; First connection made: Thu Jan 01 08:00:00 CST 1970; Active Connections:0; total failure count in last (1000) msecs:0; average resp time:0.0; 90 percentile resp time:0.0; 95 percentile resp time:0.0; min resp time:0.0; max resp time:0.0; stddev resp time:0.0]
]}ServerList:org.springframework.cloud.netflix.ribbon.eureka.DomainExtractingServerList@6694da5d

发现当前的RestTemplate还是自动获取了当前的ServiceInstance集合(主要通过permiss-service-provider,就是服务名称),然后通过负载均衡算法选出一个调用的url,最后通过url方式进行调用

2.查看这个RestTemplate中具有什么东西
在这里插入图片描述
发现这个类中有一个拦截器链
在这里插入图片描述
发现这个拦截器链中具有负载均衡拦截器

3.查看该注解的描述@LoadBalanced

Annotation to mark a RestTemplate bean to be configured to use a LoadBalancerClient

所以可以大胆的猜测,SpringCloud通过查看当前的@LoadBalanced方式为当前的RestTemplate的Bean注入LoadBalancerInterceptor拦截器,然后我们在调用的时候,通过这个拦截器进行分析操作,负载算法等一系列操作,最后找到需要调用的url,最后变成之前的操作,完成调用

1.通过使用负载均衡后的RestTemplate,发现其优化了我们找到可以执行的url的地方,优化了我们大量的冗余代码

2.所谓的@LoadBalanced,其实就是为RestTemplate注入了一个负载均衡的拦截器,将所有操作进负载均衡操作(所以其他的也可以进行优化操作)

以上纯属个人见解,如有问题请联本人

1.声明当前内容基于上面的一个demo进行负载均衡优化(说白了就是优化获取访问的url)上一个demo为:eureka的多个服务相互调用的demo由于上一个demo中出现了重复,需要通过DiscoveryClient获取当前的一个需要调用的服务实例ServiceInstance,然后拼接url实现访问操作(这个操作是重复的,基本每个访问中都存在这个问题)所以这里就看看spring的负载均衡...
报错内容如下: 2020-08-29 00:26:51.232 WARN 43067 --- [io-20000-exec-6] o.s.c.n.z.filters.post.SendErrorFilter : Error during filtering com.netflix.zuul.exception.ZuulException: Forwarding error Caused by: com.netflix.client.ClientException: null Caused by..
Ribbon自定义负载均衡策略有两种方式,一是JavaConfig,一是通过配置文件(yml或properties文件)。 假设我有包含A和B服务在内的多个微服务,它们均注册在一个Eureka上,信息如下: 我希望当访问服务A时候,2个服务(端口分别是8087和8081)每两次一换,比如访问两次8087,再访问两次8081,如此反复。 当访问服务B时,与A类似,不过是3次一换。
Ribbon一个客户端负载均衡器,赋予了应用一些支配 HTTP 与 TCP 行为的能力,由此可以得知,这里的客户端负载均衡也是进程内负载均衡的一种。 RibbonSpringCloud 生态内的不可缺少的组件,没有了 Ribbon,服务就不能横向扩展。Feign、Zuul 已经集成了 Ribbon。 1. Ribbon负载均衡策略 Ribbon 中提供了七种负载均衡策略
1. Spring Cloud Alibaba 介绍 下图是 Spring Cloud 官网给出的架构图,可以看到这个图中间就是各个微服务的实现,周边是去围绕这些微服务进行治理的支持性功能,例如分布式追踪、服务注册、配置服务等。 Spring Cloud 是以微服务为核心的分布式系统的一个构建标准,而Spring Cloud Alibaba是 Spring Cloud 标准的实现,目前 Spring Cloud Alibaba 成为了 Spring Cloud 家族中最受关注的框架。 上图中深色的部分,
status 404 reading EmployeeServiceINF#findAll() ServerList:org.springframework.cloud.netflix.ribbon.eureka.DomainExtractingServerList@4d2c12ad 2019-02-26 15...