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);
}
此时,我们即可在商品服务中调用会员服务中相关业务逻辑代码!