当前位置: 首页 > news >正文

SpringCloud微服务远程接口调用

一、概念

使用springcloud将项目拆分成一个一个微服务之后,微服务之间的接口调用就需要通过远程的方式实现,这里将介绍springcloud提供的两个微服务组件来介绍如何进行微服务间的远程接口调用。

1、使用RestTEmplate + LoadBalanced来实现远程接口调用及负载均衡

RestTemplate的优点:

  • 支持多种HTTP方法:RestTemplate支持常见的HTTP方法,如GET、POST、PUT、DELETE等,可以根据需要选择合适的方法来发送请求。
  • 提供丰富的请求和响应处理方法:RestTemplate提供了多种方法来处理请求和响应,如添加请求头、设置请求参数、发送请求、获取响应等。开发者可以根据需要选择合适的方法来处理HTTP请求和响应。
  • 支持请求和响应的序列化和反序列化:RestTemplate可以将请求和响应的数据进行序列化和反序列化,支持多种数据格式,如JSON、XML等。开发者可以根据需要选择合适的序列化和反序列化方式。
  • 支持错误处理和异常处理:RestTemplate可以处理HTTP请求过程中的错误和异常,如连接超时、请求失败等。开发者可以根据需要进行错误处理和异常处理。
  • 可扩展性和定制化:RestTemplate提供了一些扩展点和配置选项,可以进行定制化配置。开发者可以根据需要进行扩展和定制,以满足特定的业务需求。

但是RestTemplate没有负载均衡的功能,所以需要配合LoadBalanced来实现负载均衡。

2、使用OpenFeign实现远程接口调用

openFeign的优点:

  • 声明式的API定义:通过使用注解,开发者可以定义和描述服务间的API接口,包括请求方法、路径、参数、请求头等信息。这样可以使得服务间的调用代码更加简洁和易于维护。
  • 自动化的服务发现和负载均衡:OpenFeign集成了服务注册中心,可以自动发现和调用其他微服务。它还支持负载均衡,可以根据配置的负载均衡策略选择合适的服务实例进行调用。
  • 内置的请求和响应拦截器:OpenFeign提供了一些内置的拦截器,可以在请求和响应的不同阶段进行拦截和处理。开发者可以自定义拦截器来实现日志记录、错误处理等功能。
  • 支持多种编码器和解码器:OpenFeign支持多种编码器和解码器,可以处理不同的数据格式,如JSON、XML等。开发者可以根据需要选择合适的编码器和解码器。
  • 整合了Hystrix和Ribbon:OpenFeign与Hystrix和Ribbon等其他Spring Cloud组件集成,可以实现服务的容错和熔断机制,提高系统的可靠性和稳定性。

二、代码实现

1、前提

所有微服务使用springboot搭建,并且使用springcloud的服务注册和发现服务,这里我们使用的是consul

1、将服务注册到consul
server:port: 80
spring:application:name: ordercloud:consul:host: 127.0.0.1port: 8500discovery:service-name: ${spring.application.name}
2、在启动类上添加注解,开启服务发现
@EnableDiscoveryClient
3、远程调用的接口
@RestController
@Slf4j
public class PayController {@Resourceprivate PayService payService;@Operation(summary = "添加支付信息")@PostMapping(value = "/pay/add")public ResultDate addPay(@RequestBody PayDto payDto){Pay pay = new Pay();BeanUtils.copyProperties(payDto,pay);pay.setDeleted((byte) 1);int add = payService.add(pay);return ResultDate.success(add);}
}

2、RestTemplate

1、导入依赖
        <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency><!--web + actuator--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

项目中使用了spring-boot-starter-dependencies,所以没有配置版本号,大家根据自己使用的springboot和springcloud版本进行配置即可。

2、使用loadBalanced进行负载均衡
@Configuration
public class RestTempConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}
}

loadbalanced默认的负载均衡算法是通过轮询实现的,底层是通过DiscoveryClient获取所有的微服务名,返回的是个数组,遍历数组即可找到对应的微服务,同时可以根据微服务获取其在线实例数量,最后使用循环取模的方法实现轮询。

springcloud为loadBalanced提供了两个负载均衡的算法,除了轮询外还有随机算法,默认使用的是轮询。

3、编写代码
@RestController
public class OrderController {public static final String PaymentSrv_URL = "http://cloud-payment-service";
//    public static final String PaymentSrv_URL = "http://localhost:8001";@Resourceprivate RestTemplate restTemplate;@GetMapping("/consumer/pay/add")public ResultDate addOrder(@RequestBody PayDto payDto){ResultDate resultDate = restTemplate.postForObject(PaymentSrv_URL + "/pay/add", payDto, ResultDate.class);return resultDate;}
}

从这里我们可以看出使用restTemplate进行远程调用非常方便,只需要调用对应的方法,传入返回值类型和参数即可。

3、OpenFeign

1、导入依赖
        <!--openfeign--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId></dependency>
2、编写FeignClient接口
@FeignClient(name ="cloud-payment-service")
public interface PayFeignClient {@PostMapping(value = "/pay/add")public ResultDate addPay(@RequestBody PayDto payDto);
}

使用feignClient进行远程接口调用只需要像声明函数是接口一样,将需要调用的API进行申明,再加上@FeignClient注解即可

需要注意的是:

  1. @FeignClient注解里面需要申明对应的微服务名(与注册的服务名一致)
  2. @XXMapper的url路径要与调用接口的url一致,需要注意我们可能在application.yaml里面配置了统一的请求头server.servlet.context-path或者在定义Controller时使用@RequestMapper定义了统一的请求头地址
  3. 接口定义时要与调用接口拥有相同的参数,并且使用注解控制时需要指明,例如使用@RequestParem时就需要指定对应的参数名:@RequestParem("id")

3、使用FeignClient
@RestController
public class OrderController {@Resourceprivate PayFeignClient payFeignClient;@PostMapping("/consumer/pay/add")public ResultDate addOrder(@RequestBody PayDto payDto){return payFeignClient.addPay(payDto);}
}

从代码上可以看出,与RestTemplate比较,OpenFeign的代码更为简洁,使用起来更加方便,并且OpenFeign自带负载均衡的功能,不需要额外使用LoadBalanced实现负载均衡。所以更加推荐使用OpenFeign进行远程接口调用。

http://www.lryc.cn/news/362696.html

相关文章:

  • MySQL优化器的SQL重写规则
  • 57.void指针(万能指针)
  • 国科大-智能计算系统(AICS)期末试题(2024春)
  • 训练Pytorch深度学习模型出现StopIteration
  • windows上安装MongoDB,springboot整合MongoDB
  • python_04
  • 音视频视频点播
  • Git常用命令1
  • Nextjs使用教程
  • mysql的增删查改(进阶)
  • 九、从0开始卷出一个新项目之瑞萨RZN2L生产烧录固件(jflash擦写读外挂flash)
  • 安徽某高校数据挖掘作业4-5 (与一些碎碎念)
  • 基于ES安装IK分词插件
  • php项目加密源码
  • 测绘GIS和遥感领域比较好的公众号有哪些
  • 【技术实操】银河高级服务器操作系统实例分享,达梦数据库服务器 oom 问题分析
  • 通过ffmpeg 将wav格式转为mp3格式.
  • 快速上手RabbitMQ,直接上开发!
  • 如何实现单例模式及不同实现方法分析-设计模式
  • wampserver安装与汉化
  • 解决MyBatis的N+1问题
  • 12-学生们参加各科测试的次数(高频 SQL 50 题基础版)
  • 2024网络与信息安全管理员职工职业技能竞赛re0220164094
  • Elasticsearch--easy-ES框架使用,轻松操作查询Elasticsearch,简化开发
  • 【教程】如何实现WordPress网站降级(用于解决插件和主题问题)
  • 思维导图-vb.net开发带进度条的复制文件夹功能c#复制文件夹
  • Linux文本处理三剑客之awk命令
  • 公差和配合
  • AI大模型应用开发实践:5.快速入门 Assistants API
  • stack和queue的模拟实现