学习SpringCloud的第三天

目录

注解@LoadBalanced

 Ribbon负载均衡策略

定义负载均衡的方式一:

定义负载均衡的方式二:

基于Feign的远程服务调用(重点)

背景分析(由于拼接字符串过于频繁,所以我们使用了Feign)

 Feign是什么

Feign应用实践

Feign配置进阶实践

 总结:


今天主要学习的是负载均衡的设计与实现,昨天学习了LoadBalancerClient的方法,他可以从nacos中直接获取对象的信息,注入对象之后来进行远端互联。今天学习别的方法:

注解@LoadBalanced

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

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

 然后去ConsumerController类中注入loadBalancedRestTemplate属性

@Autowired
private RestTemplate loadBalancedRestTemplate;
然后通过调用loadBalancedRestTemplate属性,进行远端互联
@GetMapping("/consumer/doRestEcho3")
public String doRestEcho03(){
    String url=String.format("http://%s/provider/echo/%s","sca-provider",appName);

    return loadBalancedRestTemplate.getForObject(url,String.class);
}

 RestTemplate在发送请求的时候会被LoadBalancerInterceptor拦截,它的作用就是用于RestTemplate的负载均衡,LoadBalancerInterceptor将负载均衡的核心逻辑交给了loadBalancer,@LoadBalanced注解是属于Spring,而不是Ribbon的,Spring在初始化容器的时候,如果检测到Bean被@LoadBalanced注解,Spring会为其设置LoadBalancerInterceptor的拦截器。

 Ribbon负载均衡策略

 基于Ribbon方式的负载均衡,Netflix默认提供了七种负载均衡策略,对于SpringCloud Alibaba解决方案中又提供了NacosRule策略,默认的负载均衡策略是轮训策略。如图所示

 当系统提供的负载均衡策略不能满足我们需求时,我们还可以基于IRule接口自己定义策略.

定义负载均衡的方式一:

创建对象自主定义负载方式:如创建RandomRule对象,则上边写的doRestEcho03方法就会实现随机策略
    @Bean
    public IRule rule(){
        return new RandomRule();
    }

定义负载均衡的方式二:

 让我们注释到方法一,来测试方法二。

第二种方法是用yml文件直接配置,定义你要选择的负载方式

#配置负载均衡
sca-provider:
  ribbon:
     NFLoadBalancerRuleClassName:  com.netflix.loadbalancer.RandomRule

 这样你的负载方式直接会变为随机策略

@Bean注解的作用?(一般用于配置类内部,描述相关方法,用于告诉spring此方法的返回值要交给spring管理,bean的名字默认为方法名,假如需要指定名字可以@Bean(“bean的名字”),最多的应用场景是整合第三方的资源-对象)
@Autowired注解的作用?(此注解用于描述属性,构造方法,set方法等,用于告诉spring框架,按找一定的规则为属性进行DI操作,默认按属性,方法参数类型查找对应的对象,假如只找到一个,则直接注入,类型多个时还会按照属性名或方法参数名进行值的注入,假如名字也不同,就出报错.)
Nacos中的负责均衡底层是如何实现的?(通过Ribbon实现,Ribbon中定义了一些负载均衡算法,然后基于这些算法从服务实例中获取一个实例为消费方法提供服务)
Ribbon 是什么?(Netflix公司提供的负载均衡客户端,一般应用于服务的消费方法)
Ribbon 可以解决什么问题? (基于负载均衡策略进行服务调用, 所有策略都会实现IRule接口)
Ribbon 内置的负载策略都有哪些?(8种,可以通过查看IRule接口的实现类进行分析)
@LoadBalanced的作用是什么?(描述RestTemplate对象,用于告诉Spring框架,在使用RestTempalte进行服务调用时,这个调用过程会被一个拦截器进行拦截,然后在拦截器内部,启动负载均衡策略。)
我们可以自己定义负载均衡策略吗?(可以,基于IRule接口进行策略定义,也可以参考NacosRule进行实现)
 

上述的两种方法适合所有的使用RestTemplate发送请求时,进行负载均衡

基于Feign的远程服务调用(重点)

背景分析(由于拼接字符串过于频繁,所以我们使用了Feign)

 服务消费方基于rest方式请求服务提供方的服务时,一种直接的方式就是自己拼接url,拼接参数然后实现服务调用,但每次服务调用都需要这样拼接,代码量复杂且不易维护,此时Feign诞生

 Feign是什么

 Feign 是一种声明式Web服务客户端,底层封装了对Rest技术的应用,通过Feign可以简化服务消费方对远程服务提供方法的调用实现。如图所示:

 Feign 最早是由 Netflix 公司进行维护的,后来 Netflix 不再对其进行维护,最终 Feign 由一些社区进行维护,更名为 OpenFeign。

Feign应用实践

第一步,添加依赖

<!--使用Feign的依赖:我们基于feign提供的api进行远端调用-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

 第二部,在启动类上加上注解@EnableFeignClients

 

 第三步,定义http请求API,基于此API借助OpenFeign访问远端服务(主要功能就是利用API凭借字符串,输出你要连接的端口)

package com.jt.consumer.service;

import com.jt.consumer.service.factory.ProviderFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@FeignClient("sca-provider")
//你要连接的端口名字,@FeignClient描述的接口底层会为其创建实现类
public interface RemoteProviderService {
    @GetMapping("/provider/echo/{msg}")//你要连接的接口的地址
    String eCher(@PathVariable("msg") String string);
                //获取属性,注意,这里的@PathVariable必须添加value值,不然获取不到值
}

 第四步:创建FeignConsumerController中并添加feign访问

package com.jt.consumer.controller;

import com.jt.consumer.service.RemoteProviderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/consumer")
public class FeignConsumerController {
    @Autowired
    private RemoteProviderService remoteProviderService;//注入feign对象
    @GetMapping("/echo/{msg}")
    public String doFeignEcho(@PathVariable String msg){
        return remoteProviderService.eCher(msg);//调用feign方法,进行远端访问
    }
}

 反复刷新,因为之前配置了ribbon负载均衡为随机策略,所以会发现feign方式的远端服务的调用,底层会自动实现ribbon负载均衡。

Feign配置进阶实践

 一个服务提供方通常会提供很多资源服务,服务消费方基于同一个服务提供方写了很多服务调用接口,此时假如没有指定contextId,服务
启动就会失败,例如,假如在服务消费方再添加一个如下接口,消费方启动时就会启动失败,例如:

package com.jt.consumer.service;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

import java.lang.management.GarbageCollectorMXBean;

@FeignClient(name = "sca-prowider")
public interface ProviderService {
    @GetMapping("/doSomeTime")
    String doSomeTime();
}

 这时,会有一个重名问题,当你使用@FeignClient(name = "sca-prowider")注解时,会产生,两个key值相同,而value值不同的bean,就会触发重名错误,此时我们需要为远程调用服务接口指定一个contextId,作为远程调用服务的唯一标识(这个标识是Bean对象的名字)即可,例如:

package com.jt.consumer.service;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

import java.lang.management.GarbageCollectorMXBean;

@FeignClient(name = "sca-prowider",contextId = "providerService")
public interface ProviderService {
    @GetMapping("/doSomeTime")
    String doSomeTime();
}

 第二个对象代码:这段代码中我们还加入了fallbackFactory属性,这是用来做中断处理的,因为feign底层有一个获取时间限制,当在一定的时间内,你不能连接成功,那么就会报网页错误,为了给用户更好的体验,我们使用他来规避这个问题。

package com.jt.consumer.service;

import com.jt.consumer.service.factory.ProviderFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@FeignClient(name = "sca-provider",contextId = "remoteProviderService",fallbackFactory = ProviderFallbackFactory.class)
public interface RemoteProviderService {
    @GetMapping("/provider/echo/{msg}")
    String eCher(@PathVariable("msg") String s);
}

 配置文件yml加入启动feign方式调用时的服务中断处理机制

feign:
  hystrix:
    enabled: true

 在服务提供方对应的调用方法中添加Thread.sleep(5000)模拟耗时操作,然后启动服务进行访问测试.

初见新类,来进行网页重定向输出

 

package com.jt.consumer.service.factory;

import com.jt.consumer.service.RemoteProviderService;
import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;

@Component
public class ProviderFallbackFactory implements FallbackFactory<RemoteProviderService> {

    @Override
    public RemoteProviderService create(Throwable throwable) {
        return new RemoteProviderService() {
            @Override
            public String eCher(String s) {
                return "请求超时,请稍后再试";
            }
        };
    }
}

 总结:

今天主要学习了@LoadBalanced注解,来进行更加简单的远端互联操作,学习了 Ribbon负载均衡策略,知道他的两种设计方法,第一种是由顶级的负载接口IRule来创建新的负载均衡对象的方法来实现负载均衡,第二种是通过修改yml配置文件来进行负载均衡的配置,以后只要使用这种方法来进行负载均衡的配置。还学习了feign,利用他的注解@FeignClient@EnableFeignClients来进行远端的互联,通过接口的方式在底层实现字符串的拼接,然后通过方法进行显示,并解决了同时出现多个feign来进行远端互联时,用contextId进行重命名,出现网络延时或者处理器卡顿时,用fallbackFactory来解决,数据获取不到的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值