文章目录

  • 常见的远程调用方式有两种
  • RPC和HTTP对比
    • RPC有几个特点
    • HTTP其实就是一种网络传输协议
  • 微服务之间相互调用的三种最常见方式
    • RestTemplate方式
    • 引入Nacos注册中心
    • Fegin实现服务调用

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

(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方式

@Beanpublic RestTemplate getRestTemplate(){return new RestTemplate();}

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

@Autowiredprivate 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. 代码
 @Autowiredprivate RestTemplate restTemplate;@Autowiredprivate 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.代码

@Autowiredprivate 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;}

【微服务】服务之间的调用方式相关推荐

  1. 微服务采用何种远程调用方式?

    无论是微服务还是SOA,都面临着服务间的远程调用.那么服务间的远程调用方式有哪些呢? 常见的远程调用方式有以下几种: RPC:Remote Produce Call远程过程调用,类似的还有RMI.自定 ...

  2. 接口(服务)之间的调用方式有哪些?/软件系统之间接口的几种通讯方式?

    常见的接口调用方式有三种(设计接口的时候要考虑选用哪种接口) 1.http接口:http是一种网络传输协议,基于TCP.(等价于:http+json) 现在浏览器客户端与服务器端通信基本都是采用htt ...

  3. 微服务之间的调用方式RestTemplate和FeignClient

    SpringCloud服务间的调用有两种方式:RestTemplate和FeignClient.不管是什么方式,他都是通过REST接口调用服务的http接口,参数和结果默认都是通过jackson序列化 ...

  4. 提交响应后无法调用sendredirect_微服务的那些事(三),微服务的远程调用方式。RPC和HTTP...

    2.远程调用方式 无论是微服务还是SOA,都面临着服务间的远程调用.那么服务间的远程调用方式有哪些呢? 常见的远程调用方式有以下几种: RPC:Remote Produce Call远程过程调用,类似 ...

  5. 实现远程调用_微服务的那些事(三),微服务的远程调用方式。RPC和HTTP

    2.远程调用方式 无论是微服务还是SOA,都面临着服务间的远程调用.那么服务间的远程调用方式有哪些呢? 常见的远程调用方式有以下几种: RPC:Remote Produce Call远程过程调用,类似 ...

  6. eureka自我保护时间_spring cloud中微服务之间的调用以及eureka的自我保护机制详解...

    上篇讲了spring cloud注册中心及客户端的注册,所以这篇主要讲一下服务和服务之间是怎样调用的 基于上一篇的搭建我又自己搭建了一个客户端微服务: 所以现在有两个微服务,我们所实现的就是微服务1和 ...

  7. vue 调用webservice_c#:WebService及其几种调用方式

    之前做移动端开发,都不清楚WebService是啥东东,现在接触c#,项目中有三处WebService调用,就不得不与其打交道了,最近碰上第三方接口地址更换,而自己项目因功能也需要增加WebServi ...

  8. 微服务之间的最佳调用方式

    上一篇:3600万中国人在抖音"上清华" 0.2T架构师学习资料干货分享 茉莉花,别名:茉莉,拉丁文名:Jasminum sambac (L.) Ait,木犀科.素馨属直立或攀援灌 ...

  9. feign调用service_微服务之间的调用(Ribbon与Feign)

    概述 在前面的文章中,我们讲了使用Eureka作为服务注册中心,在服务启动后,各个微服务会将自己注册到Eureka server.那么服务之间是如何调用?又是如何进行负载均衡的呢?本文讲讲服务之间调用 ...

最新文章

  1. ASP.NET中TimeSpan的用法
  2. Qomolangma实现篇(七):Qomo的接口机制
  3. Amqp整合com.rabbitmq.client.ShutdownSignalException: channel error; protocol method异常处理
  4. 管理Vim插件的插件——Vundle
  5. Apache Ignite(五):Ignite的集群部署
  6. iOS 登录功能的实现
  7. 基于Android系统开发的简易音乐播放器
  8. 第一次在Linux服务器上部署项目,看完这篇轻松应对
  9. ubuntu core 文件产生
  10. Python+os+openpyxl 批量获取Excel的文件名和最大行数
  11. SCI论文之数据可用性陈述--Data availability statement
  12. mybatis加载属性
  13. perl学习二:简单变量
  14. 关于windows2008重新启动需要重新设置分辨率的问题
  15. Ubuntu默认Python版本选择
  16. 深度学习在58同城首页推荐中的应用
  17. 统计学(第七版 贾俊平)第七章 期末复习笔记(详细 附例题详解及公式)
  18. JS+html+css实现的一个小小的贪吃蛇游戏
  19. C#textBox控件保留上次输入
  20. 电影票务大排行:猫眼第一,淘票票、格瓦拉分列二、三位!

热门文章

  1. web前端Vue 报错:Uncaught (in promise) TypeError: Cannot read properties of nu
  2. Cinemachine(二)制作不会穿墙(会避开障碍物)的摄像头(Cinemachine Collider)
  3. [答疑]提前进行跑batch或者某种方式汇总购买货物的历史记录
  4. idea导入android工程,idea怎样导入Android studio 项目?
  5. 深入.NET平台和C#编程_深入.NET框架
  6. 这几种好用的英语图片翻译方法,你们千万不能错过
  7. kodexplorer可道云目录结构
  8. chrony服务配置
  9. 【转】微软早期员工因何机缘加盟微软?
  10. Verliog 七人投票表决器及其验证代码