SpringCloud中的远端服务调用(2种方式)

一.基于RestTemplate对象实现远端服务调用

步骤1:在服务消费方的启动类中添加如下方法,用于创建RestTemplate对象

@Bean
public RestTemplate restTemplate(){//基于此对象实现远端服务调用
    return new RestTemplate();
}

步骤2:定义服务消费方Controller层,在此对象方法内部实现远端服务调用

package com.jt.consumer.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;


/**
 * 定义服务消费端Controller,在这个Controller对象
 * 的方法中实现对远端服务sca-provider的调用
 */
@RestController
public class ConsumerController {
    /**
     * 从spring容器获取一个RestTemplate对象,
     * 基于此对象实现远端服务调用
     */
    @Autowired
    private RestTemplate restTemplate;
    /**
     * 在此方法中通过一个RestTemplate对象调用远端sca-provider中的服务
     * @return
     * 访问此方法的url: http://localhost:8090/consumer/doRestEcho1
     */
    @GetMapping("/consumer/doRestEcho1")
    public String doRestEcho01(){
        //1.定义要调用的远端服务的url
        String url="http://localhost:8081/provider/echo/8090";
        //2.基于restTemplate对象中的相关方法进行服务调用
        return restTemplate.getForObject(url, String.class);
    }

}

 步骤3:分别启动提供方、消费方服务,并在浏览器输入http://localhost:8090/consumer/doRestEcho1地址进行访问,假如访问成功会出现,如图所示效果:

 

二.基于Feign的远程服务调用(重点)

1.背景分析
服务消费方基于RestTemplate对象实现远端服务调用时,一种直接的方式就是自己拼接url,拼接参数然后实现服务调用,但每次服务调用都需要这样拼接,代码量复杂且不易维护,此时Feign诞生。

2.Feign是什么?
Feign 是一种声明式Web服务客户端,底层封装了对Rest技术的应用,通过Feign可以简化服务消费方对远程服务提供方法的调用实现。如图所示:


Feign 最早是由 Netflix 公司进行维护的,后来 Netflix 不再对其进行维护,最终 Feign 由一些社区进行维护,更名为 OpenFeign。

3.Feign应用实践(掌握)

第一步:在服务消费方,添加项目依赖(SpringCloud团队基于OpenFeign研发了starter),代码如下:

 <!--Feign 中的API封装了远程服务调用方式以及错误机制-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

第二步:在服务消费方启动类上添加@EnableFeignClients注解,代码如下:

/**
 * 当使用@EnableFeignClients注解描述配置类时,主要
 * 用于告诉spring框架,要对使用@FeignClient注解描述
 * 的接口创建其实现类以及对象.
 */
@EnableFeignClients
@SpringBootApplication
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }

第三步:在service层中,定义Http请求API,基于此API借助OpenFeign访问远端服务,代码如下:

package com.jt.consumer.service;

impor...

/**
 * @FeignClient 注解描述的接口,用于定义远程调用规范
 * 其中,name属性的值为远端服务名,同时也会将这个名字作为
 * RemoteProviderService接口实现类的对象的Bean名字.
 */

@FeignClient(name = "sca-provider",contextId = "remoteProviderService")
public interface RemoteProviderService {
      /**
       * 基于此方法进行远程服务调用
       * FAQ:
       * 1)方法上为什么要写@GetMapping这样的注解呢?
       * Feign接口是基于方法上的@GetMapping等注解中的value属性值,
       * 后续会基于这个值调用远端服务的某个具体方法
       */
      @GetMapping("/provider/echo/{msg}")
      String echoMessage(@PathVariable("msg") String msg);
}

注意:其中,@FeignClient描述的接口底层会自动为其创建实现类。

第四步:创建FeignConsumerController中并添加feign访问,代码如下:

package com.jt.consumer.controller;

@RestController
@RequestMapping("/consumer")
public class FeignConsumerController {
    @Autowired
    private RemoteProviderService remoteProviderService;
    /**基于feign方式的服务调用*/
    @GetMapping("/echo/{msg}")
    public String doFeignEcho(@PathVariable  String msg){
        //基于feign方式进行远端服务调用(前提是服务必须存在)
        return remoteProviderService.echoMessage(msg);
    }
}

第五步:启动服务,在浏览器中直接通过feign客户端进行访问,如图所示

三.拓展:Feign配置进阶实践

https://blog.csdn.net/maitian_2008/article/details/118990381

四.Feign 调用过程分析(了解)


Feign应用过程分析(底层逻辑先了解):
1)通过 @EnableFeignCleints 注解告诉springcloud,启动 Feign Starter 组件。
2) Feign Starter 会在项目启动过程中注册全局配置,扫描包下所由@FeignClient注解描述的接口,然后由系统底层创建接口实现类(JDK代理类),并构建类的对象,然后交给spring管理(注册 IOC 容器)。
3) Feign接口被调用时会被动态代理类逻辑拦截,然后将 @FeignClient 请求信息通过编码器创建 Request对象,基于此对象进行远程过程调用。
4) Feign客户端请求对象会经Ribbon进行负载均衡,挑选出一个健康的 Server 实例(instance)。
5) Feign客户端会携带 Request 调用远端服务并返回一个响应。
6) Feign客户端对象对Response信息进行解析然后返回客户端。
 

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值