学习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
    评论
### 回答1: 学习Spring Cloud可以从多个方面入手,比如可以学习相关的官方文档,比如可以利用搜索引擎查找相关的文章、博客、视频,比如可以利用学习平台学习相关课程,比如可以与社区交流,比如可以参加相关的技术培训等。 ### 回答2: 学习Spring Cloud 可以按照以下步骤: 1. 先学习Spring Boot:Spring Cloud是基于Spring Boot开发的,因此首先要熟悉Spring Boot。可以通过阅读相关的教程和文档、参加培训班或者自己实践来掌握Spring Boot的基本概念和使用方法。 2. 了解微服务架构:Spring Cloud是用于构建和管理微服务的框架,因此需要了解微服务架构的概念和原则。可以学习微服务的基本原则、微服务间的通信方式以及微服务的拆分和部署策略等。 3. 学习Spring Cloud核心组件:Spring Cloud包含了很多核心组件,如Eureka、Ribbon、Feign、Zuul等。需要分别学习每个组件的功能和使用方法,并理解它们之间的关系和作用。可以通过阅读官方文档、查看示例代码、参加讨论或者实际操作来加深理解。 4. 实践项目:学习只是第一步,更重要的是通过实际项目来加深对Spring Cloud的理解和掌握。可以尝试构建一个简单的微服务架构,利用Spring Cloud的组件实现服务的注册与发现、负载均衡、服务调用和网关等功能。 5. 持续学习和实践:Spring Cloud是一个不断发展和更新的框架,因此需要持续学习和关注最新的技术动态。可以订阅相关的技术博客、参与社区讨论、参加技术交流会议或者实践更复杂的项目来不断提升自己的技术水平。 总之,学习Spring Cloud需要坚持不懈地学习、实践和思考,同时加强与其他开发者的交流和沟通,才能够更好地掌握和应用这个框架。 ### 回答3: 学习SpringCloud的方法有很多,可以按照以下步骤进行: 1. 学习Spring框架基础知识:在学习SpringCloud之前,需要先掌握Spring框架的基本知识,包括SpringMVC、Spring Boot等。可以通过查看官方文档、阅读相关书籍、参加培训班等方式学习。 2. 学习微服务架构概念:SpringCloud是构建在微服务架构基础上的,因此需要了解微服务的概念和原理。可以通过阅读相关的书籍、博客等方式学习。 3. 学习SpringCloud的核心组件:SpringCloud有许多核心组件,如Eureka、Ribbon、Feign、Zuul等。可以通过查看官方文档、参考示例代码、学习相关教程等方式深入学习这些组件。 4. 动手实践:理论学习只是第一步,更重要的是将所学知识应用到实际项目中。可以通过搭建本地开发环境,创建小型项目,然后运用SpringCloud组件进行开发、部署和调试。 5. 参与社区活动:SpringCloud拥有庞大的社区,可以积极参与社区活动,如论坛讨论、技术分享等。通过与其他开发者交流,可以获取更多实践经验和学习资源。 6. 持续学习SpringCloud是一个不断发展和更新的框架,因此需要不断跟进新的版本和功能。可以订阅官方博客、关注开源社区、参加技术会议等方式保持学习的动力和动态。 总之,学习SpringCloud需要扎实的Spring框架基础、对微服务架构有一定的理解,并进行实际项目实践和积极参与社区活动。不断学习并与其他开发者交流,可以更好地提升自己的SpringCloud技术水平。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值