SpringCloud远程调用和OpenFeign的使用

远程调用

进行微服务开发时,我们如何调用其他的微服务,这是我们就要使用spring给我们提供的一个RestTemliate工具,可以方便的实现HTTP请求的发送

步骤:

  • 注入RestTemplate到Spring容器

@bean
public RestTemplate restTemplate(){
  return new RestTemplate();
}
  • 使用restTemplate调用exchange方法进行远程请求

public <T> ResponseEntity<T> exchange(
  String url,         // 请求路径
  HttpMethod method,  // 请求方式
  @Nullable HttpEntity<?> requestEntity,  // 请求实体,可以为空
  Class<T> responseType,  // 返回值类型
  Map<String,?> urivariables  // 请求参数
)

Eg:

// 1、利用RestTemplate发起Http的请求,得到响应
        ResponseEntity<List<ItemDTO>> response = restTemplate.exchange(
                "http://localhost:8081/items?ids={ids}",
                HttpMethod.GET,
                null,
                new ParameterizedTypeReference<List<ItemDTO>>() {}, // 如果是简单类型可以直接写:类型实体.class
                Map.of("ids", CollUtils.join(itemIds, ","))
        );
        // 2、解析响应
        if(!response.getStatusCode().is2xxSuccessful()){
            // 判断响应是否成功
            return;
        }
        // 拿到响应体
        List<ItemDTO> items = response.getBody();

服务治理

使用远程调用时,我们将远程调用的地址直接写死了,但开发时我们无法确定地址和具体的端口号,有些服务会有多个实例,这是就需要进行负载均衡,所以我们需要引入注册中心

流程如下:

  • 服务启动时就会注册自己的服务信息(服务名、IP、端口)到注册中心

  • 调用者可以从注册中心订阅想要的服务,获取服务对应的实例列表(1个服务可能多实例部署)

  • 调用者自己对实例列表负载均衡,挑选一个实例

  • 调用者向该实例发起远程调用

当服务提供者的实例宕机或者启动新实例时,调用者如何得知呢?

  • 服务提供者会定期向注册中心发送请求,报告自己的健康状态(心跳请求)

  • 当注册中心长时间收不到提供者的心跳时,会认为该实例宕机,将其从服务的实例列表中剔除

  • 当服务有新实例启动时,会发送注册服务请求,其信息会被记录在注册中心的服务实例列表

  • 当注册中心服务列表变更时,会主动通知微服务,更新本地服务列表

这里我们选择nacos注册中心,安装好nacos后,我没在后端只需引入对应的依赖和响应的配置就可以进行服务的注册

服务注册步骤:

  • 在XML文件中引入依赖

<!--nacos 服务注册发现-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  • 在yaml文件中添加配置

spring:
  application:
    name: item-service # 服务名称
  cloud:
    nacos:
      server-addr: 192.168.150.101:8848 # nacos地址
  • 启动服务实例

为了测试一个服务多个实例的情况,我们再配置一个item-service的部署实例,然后配置启动项,注意重命名并且配置新的端口,避免冲突,重启item-service的两个实例

服务发现步骤:

  • 服务发现除了要引入nacos依赖以外,由于还需要负载均衡,因此要引入SpringCloud提供的LoadBalancer依赖。

<!--nacos 服务注册发现,进行负载均衡-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  • 配置信息

spring:
  application:
    name: item-service # 服务名称
  cloud:
    nacos:
      server-addr: 192.168.150.101:8848 # nacos地址
  • 发现并调用服务(服务发现需要用到一个工具,DiscoveryClient,SpringCloud已经帮我们自动装配,我们可以直接注入使用

接下来,我们就可以对原来的远程调用做修改了,之前调用时我们需要写死服务提供者的IP和端口:

但现在不需要了,我们通过DiscoveryClient发现服务实例列表,然后通过负载均衡算法,选择一个实例去调用:

OpenFeign的使用

OpenFeign是一个声明试的http客户端,其作用就是基于springMVC的常见注解,帮我们优雅的实现http的请求和发送,OpenFeign已经被springCloud自动装配,实现起来非常简单,feign替我们完成了服务拉取、负载均衡、发送http请求的所有工作

实现步骤:

  • 引入依赖,包括OpenFeign和负载均衡组件SpringCloudLoadBalancer

  <!--openFeign-->
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-openfeign</artifactId>
  </dependency>
  <!--负载均衡器-->
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-loadbalancer</artifactId>
  </dependency>
  • 在启动类上添加@EnableFeignclients注解,启动OpenFeign功能

  • 编写FeignClient接口(不需要实现,spring会自动实现)

@FeignClient("item-service") // 绑定服务名称
public interface ItemClient {
​
  // 请求地址参数
    @GetMapping("/items")
    List<ItemDTO> queryItemByIds(@RequestParam("ids") Collection<Long> ids); // 请求参数和返回类型
}
  • 在需要使用的地方进行远程调用

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值