Springcloud服务调用Feign组件以及负载均衡

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: Springcloud服务调用Feign组件以及负载均衡

文章目录

前言

Ribbon是Spring Cloud的一个组件, 它可以让我们使用一个注解就能轻松的搞定负载均衡。

前边我们调用是从服务中获取实例获取调用的地址和端口,从而调用服务,这样特别麻烦,Feign是Spring Cloud提供的一个声明式的伪Http客户端, 它使得调用远程服务就像调用本地服务一样简单, 只需要创建一个接口并添加一个注解即可。Nacos很好的兼容了Feign, Feign默认集成了 Ribbon, 所以在Nacos下使用Fegin默认就实现了负载均衡的效果。

项目实战

随机获取服务调用

从上篇中,我们复制两个module改下端口,也可以IDEA中直接进行改端口运行两个服务。查看nacos查询服务。

33fb7c8dfd11476abaa42349e5001e74.png

启动成功之后,登录nacos进行查询服务。

aff643ab17ea419bb6781a1687b571a0.png

此时我们在订单中进行调用product服务。

订单中代码,获取商品服务实例的列表,随机获取一个实例进行调用

//从nacos服务注册中心获取product服务

       List<ServiceInstance> productServiceInstanceList =  discoveryClient.getInstances("springcloud-product");

       int index = new Random().nextInt(productServiceInstanceList.size());

       ServiceInstance productServiceInstance =

               discoveryClient.getInstances("springcloud-product").get(index);

       String productUrl = productServiceInstance.getHost()+":"+productServiceInstance.getPort();

       log.info("获取到的商品实例的url:"+productUrl);

       Product product = restTemplate.getForObject("http://"+productUrl+"/springcloud/product/getProductById/"+order.getProductId(), Product.class);

       res.put("product",product);

a3ece29967a443dfab88daafe7b00cac.png

ribbon实现负载均衡

ribbon非常简单,直接在在RestTemplate 的生成方法上添加@LoadBalanced注解即可。

/**

* 获取RestTemplate

*/

@Configuration

public class RestemplateConfig {

   @LoadBalanced

   @Bean

   public RestTemplate getRestTemplate(){

       return new RestTemplate();

   }

}

访问日志可以看到ribbon相关的


25a9572881a248bd91a3985d23608708.png

负载均衡策略接口类

cc84206d05f1414e8d87d4a08d17a43b.png

public interface IRule {

   Server choose(Object var1);

   void setLoadBalancer(ILoadBalancer var1);

   ILoadBalancer getLoadBalancer();

}

也可以自己定义负载均衡策略,配置一下ribbon负载均衡对应的类即可,这里就不多说

316c103ee9e64694b8ff06f3a3ad755d.png

feign实现服务调用

引入feign组件依赖

   <!--fegin组件-->

       <dependency>

           <groupId>org.springframework.cloud</groupId>

           <artifactId>spring-cloud-starter-openfeign</artifactId>

       </dependency>

启动类

@EnableDiscoveryClient

@SpringBootApplication

@EnableFeignClients//开启Fegin

public class SpringcloudOrderApplication {

   public static void main(String[] args) {

       SpringApplication.run(SpringcloudOrderApplication.class,args);

   }

}

product服务接口

@FeignClient("springcloud-product")

public interface ProductService {

   //指定调用提供者的哪个方法

   //@FeignClient+@GetMapping 就是一个完整的请求路径

   @GetMapping(value = "/springcloud/product/getProductById/{product_id}")

   Product getProductById(@PathVariable("product_id") Integer product_id);

}

@FeignClient("springcloud-user")

public interface UserService {

   @GetMapping(value = "/springcloud/user/getUserByUseId/{user_id}")

   User getUserByUseId(@PathVariable("user_id") Integer user_id);

}

controller测试类

@RestController

@RequestMapping("/springcloud/feign/order")

@Slf4j

public class OrderFeignController {

   @Autowired

   IOrderService orderService;

   @Autowired

   ProductService productService;

   @Autowired

   private UserService userService;

   /**

    * 获取订单列表

    * @return

    */

   @GetMapping("/getOrderById/{order_id}")

   public HashMap<String,Object> getOrderById(@PathVariable("order_id")Integer order_id){

       HashMap<String,Object> res = new HashMap<>();

       //获取订单

       Order order = orderService.getById(order_id);

       res.put("order",order);

       //直接使用服务名字作为URL进行调用

       //获取用户

       User user = userService.getUserByUseId(order.getUserId());

       res.put("user",user);

       //获取商品信息

       Product product = productService.getProductById(order.getProductId());

       res.put("product",product);

       return res;

   }

}

测试

479bd6226dff47ec96d5a6d6bb3c6ae3.png

652a7ebea04a43aebb6e3df8bfc9d648.png

相关实践学习
使用CloudLens观测ALB下的网站访问情况
通过本实验,您可搭建网站,并使用ALB进行负载均衡,同时使用CloudLens for ALB一键采集ALB日志,进行ALB 7层日志分析、秒级监控指标分析、基于AIOps的自动异常巡检等操作。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
23天前
|
监控 Java Sentinel
使用Sentinel进行服务调用的熔断和限流管理(SpringCloud2023实战)
Sentinel是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。
44 3
|
1月前
|
负载均衡 Java API
Java一分钟之-Spring Cloud OpenFeign:声明式服务调用
【6月更文挑战第9天】Spring Cloud OpenFeign是声明式服务调用库,简化了微服务间调用。通过动态代理,它允许开发者用Java接口调用HTTP服务,支持服务发现、负载均衡。本文介绍了OpenFeign的基本概念,展示了如何添加依赖、开启客户端和定义服务接口。还讨论了接口调用失败、超时重试和日志配置等问题及其解决方案,并提供了自定义Feign配置的代码示例。通过学习,读者可以更好地在微服务架构中使用OpenFeign进行服务通信。
191 4
|
8天前
|
监控 Java 应用服务中间件
SpringCloud面试之流量控制组件Sentinel详解
SpringCloud面试之流量控制组件Sentinel详解
18 0
|
1月前
|
负载均衡 前端开发 Java
OpenFeign:Spring Cloud声明式服务调用组件
该文本是关于OpenFeign在Spring Cloud中的使用的问答总结。涉及的问题包括:OpenFeign是什么,Feign与OpenFeign的区别,如何使用OpenFeign进行远程服务调用,OpenFeign的超时控制以及日志增强。OpenFeign被描述为Spring官方的声明式服务调用和负载均衡组件,它支持使用注解进行接口定义和服务调用,如@FeignClient和@EnableFeignClients。OpenFeign与Feign的主要区别在于OpenFeign支持Spring MVC注解。超时控制通过Ribbon进行设置,默认超时时间为1秒。
|
1月前
|
缓存 负载均衡 Java
Java一分钟之-Spring Cloud Netflix Ribbon:客户端负载均衡
【6月更文挑战第9天】Spring Cloud Netflix Ribbon是客户端负载均衡器,用于服务间的智能路由。本文介绍了Ribbon的基本概念、快速入门步骤,包括添加依赖、配置服务调用和使用RestTemplate。此外,还讨论了常见问题,如服务实例选择不均、超时和重试设置不当、服务列表更新不及时,并提供了相应的解决策略。最后,展示了如何自定义负载均衡策略。理解并正确使用Ribbon能提升微服务架构的稳定性和效率。
90 3
|
18天前
|
负载均衡 算法 Nacos
SpringCloud之LoadBalancer自定义负载均衡算法,基于nacos权重
ReactorLoadBalancer接口,实现自定义负载算法需要实现该接口,并实现choose逻辑,选取对应的节点。
27 0
|
18天前
|
Java Nacos Spring
SpringCloud之LoadBalancer负载均衡器的简单使用
RoundRobin: 轮询策略,意思循环往复的的服务进行选取。
18 0
|
18天前
springCloud之服务调用RestTemplate、OpenFeign
springCloud之服务调用RestTemplate、OpenFeign
11 0
|
1月前
|
消息中间件 Dubbo Java
SpringClou、SpringBoot、SpringCloud-Alibaba各个组件版本对应关系
SpringClou、SpringBoot、SpringCloud-Alibaba各个组件版本对应关系
|
1月前
|
缓存 负载均衡 算法
解读 Nginx:构建高效反向代理和负载均衡的秘密
解读 Nginx:构建高效反向代理和负载均衡的秘密
40 2