【微服务】服务之间的调用方式

这篇具有很好参考价值的文章主要介绍了【微服务】服务之间的调用方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

常见的远程调用方式有两种

(1)RPC远程过程调用,类似的还有RML。自定义数据式,基于原生TCP通信,速度快,效率高。早期的wedservice,现在热门的dubbo,都是RPC的典型代表
(2)HTTP:http其实是一种网络传输协议,基于TCP,规定了数据传输的格式。现在客户端浏览器与服务器端通信基本都是采用HTTP协议,也可以用来进行远程服务调用。缺点是消息封装臃肿,优势是对服务的提供和调用方没有任何技术限定,自由灵活,更符合为服务理念。

现在热门的Rest风格,就可以通过HTTP协议来实现。

如果你们公司全部采用java技术栈,那么使用Dubbo作为微服务框架是一个不错的选择。相反,如果公司的技术栈多样化,而且你更青睐Spring家族,那么SpringCloud搭建微服务是不二之选。在我们的项目中,我们会选择SpringCloud套件,因此我们会使用HTTP方式来实现服务间调用。

RPC和HTTP对比

两种方式都是基于TCP通信,一种是RPC调用,一种是HTTP调用。

RPC有几个特点

(1)数据的格式可以自定义
(2)速度快,效率高
(3)早期的wedservice和现在比较热门的dubbo都是RPC的典型代表

HTTP其实就是一种网络传输协议

(1)规定了数据格式
(2)对服务没有任何技术限定
(3)现在rest风格,就可通过Http协议来实现。

微服务之间相互调用的三种最常见方式

RestTemplate方式

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

服务的消费者(order)调用服务的提供者(Goods)

@Autowired
    private RestTemplate restTemplate;
 
    @GetMapping("/createOrder/{gid}/{number}")
    public Order order(@PathVariable("gid") Integer id,@PathVariable("number") Integer number){
        log.info("用户开始下单,调用商品系统,查询{}号商品信息",id);
        Goods goods = restTemplate.getForObject("http://localhost:9002/goods/getGoods/" + id, Goods.class);
        log.info("商品信息查询完毕:"+ JSON.toJSONString(goods));
 
        log.info("开始下单:");
        Order order = new Order();
        order.setUid(1);
        order.setUname("测试用户");
        order.setGid(goods.getId());
        order.setGname(goods.getGoodsName());
        order.setNumber(number);
 
        orderService.createOrder(order);
        log.info("下单成功");
        return order;
    }

通过上面的方式我们解决了微服务之间的相互调用,但是存在硬编码的问题,如果服务提供者的地址发生变化,就需要手工修改代码;如果有多个服务提供者,无法实现服务的负载均衡;如果服务增多,人工调用会变得更加的复杂。

这个时候就会需要服务治理,服务治理是微服务架构最核心的问题,用于实现各个微服务的自动化注册与发现。在这里选择Nacos。

引入Nacos注册中心

  1. 在服务的提供者与消费者的pom文件中引入依赖
<!--nacos客户端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
  1. 在application.yml中添加配置
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.206.151:8848
  1. 在对应的微服务上添加
@EnableDiscoveryClient
  1. 代码
 @Autowired
    private RestTemplate restTemplate;
   @Autowired
    private DiscoveryClient discoveryClient;
 
    @GetMapping("/createOrder2/{gid}/{number}")
    public Order order2(@PathVariable("gid") Integer id,@PathVariable("number") Integer number){
        log.info("用户开始下单,调用商品系统,查询{}号商品信息",id);
        //从nacos中获取服务地址
        ServiceInstance service = discoveryClient.getInstances("goods-service").get(0);
        String url = service.getHost() + ":" + service.getPort();
        //通过restTemplate调用
        Goods goods = restTemplate.getForObject("http://"+url+"/goods/getGoods/" + id, Goods.class);
        log.info("商品信息查询完毕:"+ JSON.toJSONString(goods));
 
        log.info("开始下单:");
        Order order = new Order();
        order.setUid(1);
        order.setUname("测试用户");
        order.setGid(goods.getId());
        order.setGname(goods.getGoodsName());
        order.setNumber(number);
 
        orderService.createOrder(order);
        log.info("下单成功");
        return order;
    }

注:DiscoveryClient是专门负责服务注册和发现的,我们可以通过它获取到注册到注册中心的所有服务

Fegin实现服务调用

Feign是Spring Cloud提供的一个声明式的伪Http客户端, 它使得调用远程服务就像调用本地服务一样简单, 只需要创建一个接口并添加一个注解即可。

Nacos很好的兼容了Feign, Feign默认集成了 Ribbon, 所以在Nacos下使用Fegin默认就实现了负载均衡的效果。

在服务消费者上进行以下操作:

  1. 添加依赖
<!--fegin组件-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  1. 在启动类上添加注解
@EnableFeignClients
  1. 新建client包,并创建接口(把服务提供者controller对应的方法名复制过来,注意路径要完整。
@FeignClient("goods-service")
public interface GoodsService {
 
    @RequestMapping("/goods/getGoods/{id}")
    public Goods goods(@PathVariable("id") Integer id);
}

4.代码文章来源地址https://www.toymoban.com/news/detail-595461.html

@Autowired
    private GoodsService goodsService;
 
    @GetMapping("/createOrder3/{gid}/{number}")
    public Order order3(@PathVariable("gid") Integer id,@PathVariable("number") Integer number){
        log.info("用户开始下单,调用商品系统,查询{}号商品信息",id);
 
        //通过feign调用商品微服务
        Goods goods = goodsService.goods(id);
        log.info("商品信息查询完毕:"+ JSON.toJSONString(goods));
 
        log.info("开始下单:");
        Order order = new Order();
        order.setUid(1);
        order.setUname("测试用户");
        order.setGid(goods.getId());
        order.setGname(goods.getGoodsName());
        order.setNumber(number);
 
        orderService.createOrder(order);
        log.info("下单成功");
        return order;
    }

到了这里,关于【微服务】服务之间的调用方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 102、SOA、分布式、微服务之间有什么关系和区别?

    分布式架构是指将单体架构中的各个部分拆分,然后部署到不同的机器或进程中去,SOA和微服务基本上都是分布式架构师 SOA是一种面向服务的架构,系统的所有服务都注册在总线上,当调用服务时,从总线上查找服务信息,然后调用 微服务是一种更彻底的面向服务的架构,

    2024年02月15日
    浏览(68)
  • 【SkyWalking】分布式服务追踪与调用链系统

    SkyWalking是一个开源的观测平台,官网:Apache SkyWalking; 可监控: 分布式追踪调用链 、jvm内存变化、监控报警、查看服务器基本配置信息。 在整个skywalking的系统中,有三个角色: 1.skywalking agent 和业务系统(jar)关联在一起 ,负责收集各种监控数据; 2.skywalking oapservice负责处

    2024年02月11日
    浏览(44)
  • 利用Java代码调用Lua脚本改造分布式锁

    4.8 利用Java代码调用Lua脚本改造分布式锁 lua脚本本身并不需要大家花费太多时间去研究,只需要知道如何调用,大致是什么意思即可,所以在笔记中并不会详细的去解释这些lua表达式的含义。 我们的RedisTemplate中,可以利用execute方法去执行lua脚本,参数对应关系就如下图股

    2024年04月10日
    浏览(55)
  • 分布式系统面试全集通第一篇(dubbo+redis+zookeeper----分布式+CAP+BASE+分布式事务+分布式锁)

    什么是分布式 一个系统各组件分别部署在不同服务器。彼此通过网络通信和协调的系统。 也可以指多个不同组件分布在网络上互相协作,比如说电商网站 也可以一个组件的多个副本组成集群,互相协作如同一个组件,比如数据存储服务中为了数据不丢失而采取的多个服务备

    2024年04月11日
    浏览(50)
  • 分布式RPC框架Dubbo详解

    目录   1.架构演进 1.1 单体架构 1.2  垂直架构 1.3 分布式架构 1.4 SOA架构 1.5 微服务架构 2.RPC框架 2.1 RPC基本概念介绍 2.1.1 RPC协议 2.1.2 RPC框架 2.1.3 RPC与HTTP、TCP/ UDP、Socket的区别 2.1.4 RPC的运行流程  2.1.5 为什么需要RPC 2.2 Dubbo  2.2.1 Dubbo 概述 2.2.2 Dubbo实战   架构演进如下图: 这

    2024年02月07日
    浏览(40)
  • 单体架构 微服务架构 分布式 微服务通信方式 网关与nginx

    单体架构 优点:架构简单,维护成本低 缺点:各个模块耦合度太高,当对一个模块进行更新修改时,会影响到其他模块,要一起进行修改。当存在性能瓶颈的时候,需要对整个服务进行扩容,不能有针对性的扩容,如一个程序的主要功能时其中某个服务,要对其增加机器,

    2024年02月10日
    浏览(60)
  • 分布式事务,zookeeper,dubbo,rocketmq

    CAP理论是分布式领域中非常重要的一个指导理论,C(Consistency)表示强一致性,A(Availability)表示可用性,P(Partition Tolerance)表示分区容错性,CAP理论指出在目前的硬件条件下,一个分布式系统是必须要保证分区容错性的,而在这个前提下,分布式系统要么保证CP,要么保

    2024年04月12日
    浏览(47)
  • seata分布式事务(与dubbo集成)

            Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。 @GlobalTransactional:全局事务注解,添加了以后可实现分布式事务的回滚和提交,用法与spring的@Transactional注解类似,注解参数的作用也基本一致         se

    2024年01月21日
    浏览(44)
  • 基于Dubbo分布式网上售票系统

    民航售票是一个高度依赖信息业的行业。但在机票销售的管理和规范这方面上存在着很多各种各样的问题。例如订票是客运行业中的一个最基本的业务,表面上看,它只是机票站业务的一个简单的部分,但是它涉及到管理与客户服务等多方面,关系到民航公司能否正常运作。

    2024年02月16日
    浏览(38)
  • Redis学习(八)Java三种方式实现分布式锁

    在分布式服务中,经常有例如 定时任务 这样的场景。 在定时任务中,如果不使用 quartz 这样的分布式定时工具,只是简单使用 @Schedule 注解来实现定时任务, 在服务分布式部署中 ,就有可能存在 定时任务并发重复执行问题 。 对于解决以上场景中的问题,我们引入了 分布式

    2024年02月12日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包