不同微服务之间如何实现远程调用?一个简单示例告诉你

这篇具有很好参考价值的文章主要介绍了不同微服务之间如何实现远程调用?一个简单示例告诉你。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1、服务拆分原则 

2、服务拆分示例

2.1、初始化数据库

2.2、导入demo工程

2.3、测试

3、实现远程调用

3.1、需求

3.2、注册RestTemplate

3.3、实现远程调用

4、提供者与消费者

5、代码免费分享


🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发、数据结构和算法,初步涉猎Python人工智能开发和前端开发。
🦅主页:@逐梦苍穹

🥡所属专栏:微服务

📕您的一键三连,是我创作的最大动力🌹

1、服务拆分原则 

任何分布式架构都离不开服务的拆分,微服务也是一样。

本文的实操内容不包含注册中心,该内容在专栏后续文章中体现

这里我总结了微服务拆分时的几个原则:

不同微服务,不要重复开发相同业务

微服务数据独立,不要访问其它微服务的数据库

微服务可以将自己的业务暴露为接口,供其它微服务调用

微服务远程调用方式,微服务,微服务,架构,云原生

2、服务拆分示例

以自己编写的微服务cloud-demo为例,其结构如下(代码后续奉上):

微服务远程调用方式,微服务,微服务,架构,云原生

cloud-demo:父工程,管理依赖

  • order-service:订单微服务,负责订单相关业务
  • user-service:用户微服务,负责用户相关业务

demo要求:

①订单微服务和用户微服务都必须有各自的数据库,相互独立

②订单服务和用户服务都对外暴露Restful的接口

③订单服务如果需要查询用户信息,只能调用用户服务的Restful接口,不能查询用户数据库

2.1、初始化数据库

为了模拟微服务应用场景,此处需要创建两个数据库,以及创建两个表单,如下:

微服务远程调用方式,微服务,微服务,架构,云原生

下面是创建两张表的SQL语句:

订单数据库的订单表单:

-- 设置字符集
SET NAMES utf8mb4;

-- 关闭外键约束检查
SET FOREIGN_KEY_CHECKS = 0;

-- 创建订单表 tb_order
DROP TABLE IF EXISTS `tb_order`;
CREATE TABLE `tb_order` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '订单id',
  `user_id` bigint(20) NOT NULL COMMENT '用户id',
  `name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '商品名称',
  `price` bigint(20) NOT NULL COMMENT '商品价格',
  `num` int(10) NULL DEFAULT 0 COMMENT '商品数量',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `username` (`name`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 109 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- 插入订单数据
INSERT INTO `tb_order` VALUES (101, 1, 'Apple 苹果 iPhone 12', 699900, 1);
INSERT INTO `tb_order` VALUES (102, 2, '雅迪 yadea 新国标电动车', 209900, 1);
INSERT INTO `tb_order` VALUES (103, 3, '骆驼(CAMEL)休闲运动鞋女', 43900, 1);
INSERT INTO `tb_order` VALUES (104, 4, '小米10 双模5G 骁龙865', 359900, 1);
INSERT INTO `tb_order` VALUES (105, 5, 'OPPO Reno3 Pro 双模5G 视频双防抖', 299900, 1);
INSERT INTO `tb_order` VALUES (106, 6, '美的(Midea) 新能效 冷静星II', 544900, 1);
INSERT INTO `tb_order` VALUES (107, 2, '西昊/SIHOO 人体工学电脑椅子', 79900, 1);
INSERT INTO `tb_order` VALUES (108, 3, '梵班(FAMDBANN)休闲男鞋', 31900, 1);

-- 打开外键约束检查
SET FOREIGN_KEY_CHECKS = 1;

用户数据库的用户表单:

-- 设置字符集
SET NAMES utf8mb4;

-- 关闭外键约束检查
SET FOREIGN_KEY_CHECKS = 0;

-- 创建用户表 tb_user
DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `username` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '收件人',
  `address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地址',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `username` (`username`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 109 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- 插入用户数据
INSERT INTO `tb_user` VALUES (1, '柳岩', '湖南省衡阳市');
INSERT INTO `tb_user` VALUES (2, '文二狗', '陕西省西安市');
INSERT INTO `tb_user` VALUES (3, '华沉鱼', '湖北省十堰市');
INSERT INTO `tb_user` VALUES (4, '张必沉', '天津市');
INSERT INTO `tb_user` VALUES (5, '郑爽爽', '辽宁省沈阳市大东区');
INSERT INTO `tb_user` VALUES (6, '范兵兵', '山东省青岛市');

-- 打开外键约束检查
SET FOREIGN_KEY_CHECKS = 1;

tb_user表中初始数据如下:

微服务远程调用方式,微服务,微服务,架构,云原生

tb_order表中初始数据如下:

微服务远程调用方式,微服务,微服务,架构,云原生

tb_order表中持有tb_user表中的id字段。

2.2、导入demo工程

用IDEA导入Demo。

项目结构如下:

微服务远程调用方式,微服务,微服务,架构,云原生

导入后,会在IDEA右下角出现弹窗(这里的意思是检测到多个SpringBoot服务):

微服务远程调用方式,微服务,微服务,架构,云原生

点击弹窗,然后按下图选择:

微服务远程调用方式,微服务,微服务,架构,云原生

会出现这样的菜单:

微服务远程调用方式,微服务,微服务,架构,云原生

配置下项目使用的JDK:

微服务远程调用方式,微服务,微服务,架构,云原生

2.3、测试

微服务远程调用方式,微服务,微服务,架构,云原生

可以看到,服务都是正常运行了。但是订单服务的user表单项为null。

下面就是今天的重点,微服务之间的远程调用。

3、实现远程调用

在order-service服务中,有一个根据id查询订单的接口:

微服务远程调用方式,微服务,微服务,架构,云原生

根据id查询订单,返回值是Order对象,如图:

微服务远程调用方式,微服务,微服务,架构,云原生

其中的user为null

在user-service中有一个根据id查询用户的接口:

微服务远程调用方式,微服务,微服务,架构,云原生

查询的结果如图:

微服务远程调用方式,微服务,微服务,架构,云原生

3.1、需求

修改order-service中的根据id查询订单业务,要求在查询订单的同时,根据订单中包含的userId查询出用户信息,一起返回。

微服务远程调用方式,微服务,微服务,架构,云原生

因此,我们需要在order-service中 向user-service发起一个http的请求,调用http://localhost:8081/user/{userId}这个接口。

步骤如下:

①注册一个RestTemplate的实例到Spring容器

②修改order-service服务中的OrderService类中的queryOrderById方法,根据Order对象中的userId查询User

③将查询的User填充到Order对象,一起返回

3.2、注册RestTemplate

首先,我们在order-service服务中的OrderApplication启动类中,注册RestTemplate实例(也可以另外写一个配置类,为了方便就直接写在启动类了):

package cn.itcast.order;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

3.3、实现远程调用

修改order-service服务中的cn.itcast.order.service包下的OrderService类中的queryOrderById方法:

微服务远程调用方式,微服务,微服务,架构,云原生

效果:

微服务远程调用方式,微服务,微服务,架构,云原生

可以看到用户已经跨服务成功查询上来了。

但是这种方式是否有问题呢?肯定是有的。

存在着硬编码url地址的问题。

这个后续通过注册中心即可解决。

⭐大家可以关注一下"微服务"这个专栏,后续会有更多系列文章

4、提供者与消费者

在服务调用关系中,会有两个不同的角色:

服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务)

服务消费者:一次业务中,调用其它微服务的服务。(调用其它微服务提供的接口)

微服务远程调用方式,微服务,微服务,架构,云原生

但是,服务提供者与服务消费者的角色并不是绝对的,而是相对于业务而言。

如果服务A调用了服务B,而服务B又调用了服务C,服务B的角色是什么?

  • 对于A调用B的业务而言:A是服务消费者,B是服务提供者
  • 对于B调用C的业务而言:B是服务消费者,C是服务提供者

因此,服务B既可以是服务提供者,也可以是服务消费者。

5、代码免费分享

百度网盘永久链接:

链接:https://pan.baidu.com/s/1Idko-QxepFwSvYGq6AUugw?pwd=1234

提取码:1234文章来源地址https://www.toymoban.com/news/detail-859542.html

到了这里,关于不同微服务之间如何实现远程调用?一个简单示例告诉你的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java项目】SpringCloud项目注册到Nacos中心时显示的是内网IP导致不同服务器之间无法互相调用接口的解决并发

    微服务项目地址—动动你发财的小手点一个stars吧 出现这个问题是之前我也就遇到过的,这个问题的情况就是: 我们知道微服务项目是可以把不同的项目部署在不同的服务器上从而减少某一台服务器的压力,我们只需要为每一个服务配置一个注册中心即可,然后一个服务需要

    2024年02月16日
    浏览(47)
  • SQL server 实现不同服务器之间的数据同步(作业实现)

            公司目前有两台服务器,一台计划用于存储历史数据(History),一台计划用于日常(Daily),现在的需求是将日常的SQL server产生的历史数据表,通过定期同步的方式存储到存放历史数据的服务器上(Daily——History)这个顺序一定要记清楚! 目录 SQL server实现数据

    2024年02月16日
    浏览(49)
  • 聊聊不同集群的微服务如何通过feign调用

    之前业务部门的某项目微服务调用关系如下图 后因业务改造需要,该项目需要将服务A部署到另外一个集群,但服务A仍然需要能调用到服务B,调用关系如下图 之前调用方式是负责服务B的开发团队提供相应的feign客户端包给到服务A开发团队,服务A开发团队直接将客户端包引入

    2024年02月13日
    浏览(46)
  • 远程服务调用的简单应用,并轻松解决LinkedHashMap无法转成相关实体类的问题

    🏀(一)为啥需要远程服务调用?     🐠知其然还要知其所以然,在我们的生产项目上一般而言会部署多个微服务,每个微服务会负责不同版块的业务工作。如果某个微服务 需要借助 另外的某些微服务中的接口才能完成相应操作时,那么服务与服务之间就会存在相互

    2024年02月08日
    浏览(48)
  • 基于Dubbo实现服务的远程调用

    目录 前言 RPC思想 为什么使用Dubbo  Dubbo技术框架 ​编辑 调用关系流程 基础实现 A.提供统一业务Api  B.编辑服务提供者Product B.a 添加依赖 B.b 添加Dubbo 配置(基于yaml配置文件) B.c 编写并暴露服务 C.编辑服务消费者 C.a 添加依赖 C.b 添加Dubbo配置 C.c 引用服务 Dubbo是基于Java的RPC分

    2024年02月09日
    浏览(39)
  • Dubbo+Zookeeper 实现服务远程调用

    提示:以下是本篇文章正文内容,Java 系列学习将会持续更新 官方文档 :https://cn.dubbo.apache.org/zh-cn/#td-block-1 Dubbo 是阿里巴巴公司开源的一个高性能、轻量级的 Java RPC 框架。 致力于提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案。 三个核心功能: 基于接

    2023年04月19日
    浏览(37)
  • 【Verilog实现FPGA上的信号延迟】—— 用Verilog代码实现将信号延迟N拍,这是FPGA中非常重要的一个操作,可以使数据在不同模块之间精确同步。

    【Verilog实现FPGA上的信号延迟】—— 用Verilog代码实现将信号延迟N拍,这是FPGA中非常重要的一个操作,可以使数据在不同模块之间精确同步。 模块是FPGA中最基本的构建模块。通常一个模块代表一个电路,包括输入、输出和处理逻辑。模块中包含的处理逻辑被称为时序逻辑。

    2024年02月04日
    浏览(72)
  • 如何从eureka-server上进行服务发现,负载均衡远程调用服务

    在spring cloud的maven的pom文件中添加eureka-client的依赖坐标 添加运行服务的名称以及eureka-server的地址 需要在RestTemplate这个Bean添加一个@LoadBalanced注解,实现负载均衡策略 在调用远程服务的方法处自动注入RestTemplate,用远程调用的对象服务名代替服务IP地址以及端口号,比如当前

    2024年02月04日
    浏览(50)
  • OpenFegin+hystrix实现远程HTTP服务调用、服务降级(深度解析~保姆级)

    OpenFeign 是 Spring Cloud 家族的一个成员, 它最核心的作用是为 HTTP 形式的 Rest API 提供了非常简洁高效的 RPC 调用方式。支持Hystrix 、Ribbon和SpringMVC 注解。 Feign和OpenFeign的区别? 1、Feign: Feign是Netflix公司(第一代SpringCloud)研发的一个轻量级RESTful的伪HTTP服务客户端。 Feign内置了

    2023年04月08日
    浏览(34)
  • SpringCloud(一) 服务架构的演变及注册RestTemplate实现服务的远程调用

    目录 一, 服务架构的演变 1.1 单体架构 1.2 分布式架构 1.3 微服务 1.4 SpringCloud 二, 服务拆分和远程调用 2,1 服务拆分原则 2.2 服务拆分示例 2.3 创建相应数据库  2.4 实现远程调用示例 1, 更改需求 2, 注册RestTemplate实现远程调用  2.5 服务消费者和提供者 将业务的所有功能集中在一

    2024年02月08日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包