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);
}
/** 还有其他方式
* /coupon/spubounds/save
* 1)、让所有请求过网关;
* 1、@FeignClient("gulimall-gateway"):给gulimall-gateway所在的机器发请求
* 2、/api/coupon/spubounds/save
* 2)、直接让后台指定服务处理
* 1、@FeignClient("gulimall-gateway")
* 2、/product/skuinfo/info/{skuId}
*
*/
此时,我们即可在商品服务中调用会员服务中相关业务逻辑代码!
笔者刚开始运营公众号啦,感兴趣的可关注我的公众号,欢迎交流!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/96848.html