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

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
EMR Serverless StarRocks,5000CU*H 48000GB*H
网络型负载均衡 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

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
9天前
|
负载均衡 算法 Java
除了 Ribbon,Spring Cloud 中还有哪些负载均衡组件?
这些负载均衡组件各有特点,在不同的场景和需求下,可以根据项目的具体情况选择合适的负载均衡组件来实现高效、稳定的服务调用。
23 5
|
27天前
|
JSON Java 数据格式
【微服务】SpringCloud之Feign远程调用
本文介绍了使用Feign作为HTTP客户端替代RestTemplate进行远程调用的优势及具体使用方法。Feign通过声明式接口简化了HTTP请求的发送,提高了代码的可读性和维护性。文章详细描述了Feign的搭建步骤,包括引入依赖、添加注解、编写FeignClient接口和调用代码,并提供了自定义配置的示例,如修改日志级别等。
71 1
|
2月前
|
负载均衡 Java Nacos
SpringCloud基础2——Nacos配置、Feign、Gateway
nacos配置管理、Feign远程调用、Gateway服务网关
SpringCloud基础2——Nacos配置、Feign、Gateway
|
2月前
|
前端开发 API 微服务
SpringCloud微服务之间使用Feign调用不通情况举例
SpringCloud微服务之间使用Feign调用不通情况举例
485 2
|
2月前
|
负载均衡 Java 对象存储
负载均衡策略:Spring Cloud与Netflix OSS的最佳实践
负载均衡策略:Spring Cloud与Netflix OSS的最佳实践
49 2
|
3月前
|
缓存 负载均衡 Java
OpenFeign最核心组件LoadBalancerFeignClient详解(集成Ribbon负载均衡能力)
文章标题为“OpenFeign的Ribbon负载均衡详解”,是继OpenFeign十大可扩展组件讨论之后,深入探讨了Ribbon如何为OpenFeign提供负载均衡能力的详解。
OpenFeign最核心组件LoadBalancerFeignClient详解(集成Ribbon负载均衡能力)
|
2月前
|
Java API 开发者
【已解决】Spring Cloud Feign 上传文件,提示:the request was rejected because no multipart boundary was found的问题
【已解决】Spring Cloud Feign 上传文件,提示:the request was rejected because no multipart boundary was found的问题
388 0
|
4月前
|
负载均衡 Java API
Feign 进行rpc 调用时使用ribbon负载均衡源码解析
Feign 进行rpc 调用时使用ribbon负载均衡源码解析
74 11
|
5月前
|
XML JSON Java
经验大分享:SpringCloud之Feign
经验大分享:SpringCloud之Feign
64 0
|
5月前
|
负载均衡 算法 Nacos
SpringCloud之LoadBalancer自定义负载均衡算法,基于nacos权重
ReactorLoadBalancer接口,实现自定义负载算法需要实现该接口,并实现choose逻辑,选取对应的节点。
438 0