利用sping-cloud feign进行远程调用?

1.简介
远程调用
RMI远程调用的主要原理是一台机上的JVM中的类或者方法需要调用另外一台机上JVM中的类或者方法.这两台机可以是跨平台的.你的SSH架构系统中,地址栏中输入URL访问,只是你在访问服务器上的JEE容器中的业务(JEE容器中执行的JAVA程序也是在JVM中运行),当你的SSH系统中的业务逻辑需要调用其他的另外一台机的EJB业务系统时(可能你现在时为了某项业务),调用纯粹是为了使用对方的相关业务处理,而你只是需要返回结果数据,那么这时候远程调用就可以做到了,RMI就是你调用了对方JEE容器里的某项服务(对方的JEE容器里的业务执行是对方机器上的JVM),这不就是跨了不同机器上的JVM进行相关的JAVA调用了吗。希望这段话对你有用。
2.为什么要进行远程调用?
假设我们有两个项目A和B,例如:商品服务和会员服务,当某一用户成功购买商品后,我们除了要将商品信息加入其订单详情中,还需要将用户购买商品后的积分同时加入其会员服务的相关表中,此时,如果我们从商品服务中是无法访问会员服务中相关业务逻辑代码的,此时,我们就需要进行远程调用,来获取我们需要的信息或在会员服务中向相关表保存相关信息.
3.利用sping-cloud feign怎么做?
3.1在需要远程调用的项目中均引入spring cloud相关依赖以及注册中心(这里使用nacos)等相关依赖,如下:

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!--注册中心nacos-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>

2.在配置文件中指定自己的配置中心地址以及命名空间名臣(bootstrap.properties):

spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=0d5d1292-bb42-4635-92af-a3d06faaa726
spring.cloud.nacos.config.group=dev 

application.yml:

cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848     

3.在商品服务和会员服务的启动类上都添加注册发现注解@EnableDiscoveryClient
4.在商品服务中新建feign包,创建一个接口,如下:

import com.atguigu.common.to.SkuReductionTo;
import com.atguigu.common.to.SpuBoundTo;
import com.atguigu.common.utils.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
/***
 * 声明式的远程调用
 */
 //远程调用的会员服务项目名称
@FeignClient("gulimall-coupon")
public interface CouponFeignService {


    /**
     * 1、CouponFeignService.saveSpuBounds(spuBoundTo);
     *      1)、@RequestBody将这个对象转为json。
     *      2)、找到gulimall-coupon服务,给/coupon/spubounds/save发送请求。
     *          将上一步转的json放在请求体位置,发送请求;
     *      3)、对方服务收到请求。请求体里有json数据。
     *          (@RequestBody SpuBoundsEntity spuBounds);将请求体的json转为SpuBoundsEntity;
     * 只要json数据模型是兼容的。双方服务无需使用同一个to
     * @param spuBoundTo
     * @return
     */
     //会员服务中心调用方法的路径
    @PostMapping("/coupon/spubounds/save")
    R saveSpuBounds(@RequestBody SpuBoundTo spuBoundTo);
@PostMapping("/coupon/skufullreduction/saveinfo")
    R saveSkuReduction(@RequestBody SkuReductionTo skuReductionTo);
}

此时,我们即可在商品服务中调用会员服务中相关业务逻辑代码!

上一篇:Sping整理(一)


下一篇:sping随笔