首页 > 编程语言 >微服务之间相互调用的三种最常见方式(含源码)

微服务之间相互调用的三种最常见方式(含源码)

时间:2022-08-25 11:58:24浏览次数:93  
标签:info goods log 调用 number id 源码 三种 order

相信大家平时开发的时候没少碰见,在微服务架构中需要调用很多服务才能完成一项功能。这时候,如何互相调用就变成微服务架构中的一个关键问题。在这里我介绍三个常用的方法

一、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;
    }
View Code

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

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

二、引入Nacos注册中心
1.在服务的提供者与消费者的pom文件中引入依赖

<!--nacos客户端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

2.在application.yml中添加配置

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.206.151:8848

3.在对应的微服务上添加

@EnableDiscoveryClient

4.代码

   @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>

2.在启动类上添加注解

@EnableFeignClients

3.新建client包,并创建接口(把服务提供者controller对应的方法名复制过来,注意路径要完整。

@FeignClient("goods-service")
public interface GoodsService {
 
    @RequestMapping("/goods/getGoods/{id}")
    public Goods goods(@PathVariable("id") Integer id);
}

4.代码

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

 

标签:info,goods,log,调用,number,id,源码,三种,order
From: https://www.cnblogs.com/AllWjw/p/16623818.html

相关文章

  • SpringBoot利用@Async注解实现异步调用
    前言:异步编程是让程序并发运行的一种手段,使用异步编程可以大大提高我们程序的吞吐量,减少用户的等待时间。在Java并发编程中实现异步功能,一般是需要使用线程或者线程池。而......
  • Spring Cloud 的 Feign 调用,即参数传递
    在启动类上添加@EnableFeignClients注解Feignclient类的编写,以及接参方式,特别关注get的两种方式:url路径参数和发送对象实体。参考地址/****@authorLambert*@......
  • 网页通过注册表调用本地程序
    要调用的本地程序地址E:\\PSWebPrint.exe编写txt文件,内容如下:WindowsRegistryEditorVersion5.00[HKEY_CLASSES_ROOT\PS.PrintShipLabel]"URLProtocol"="E:\\PSWe......
  • 从new File("")到jdk源码
    1.概述今天在项目中看到下面两行代码,看注释说是获取当前工作路径,之前也没有用过这种用法,比较好奇还能这样用,所以研究了一下源码。//获取当前工作路径Filefile=newF......
  • ForkJoinPool源码分析之三(ForkJoinTask源码)
    一、类结构及其成员变量1.1类结构和注释类前面的注释部分如下:ForkJoinTask是在ForkJoinPool中运行task的基础抽象类,ForkJoinTask是类似于线程的实体,其权重比普通线程要......
  • ForkJoinPool源码分析之四(ForkJoinWorkerThread源码)
    一、类结构及其成员变量1.1类结构和注释类结构代码如下:publicclassForkJoinWorkerThreadextendsThread{}ForkJoinWorkerThread继承了Thread类,ForkJoinWo......
  • java中遍历map的三种方式
    publicstaticvoidmain(String[]args){HashMap<String,String>map=newHashMap<>();map.put("1","A");map.put("2","B");......
  • 以太坊 layer2: optimism 源码学习(二) 提现原理
    作者:林冠宏/指尖下的幽灵。转载者,请:务必标明出处。掘金:https://juejin.im/user/1785262612681997博客:http://www.cnblogs.com/linguanh/GitHub:https://git......
  • 《Python源码剖析》PDF高清版试读
      《Python源码剖析》PDF高清版免费下载地址  内容简介  · · · · · ·作为主流的动态语言,Python不仅简单易学、移植性好,而且拥有强大丰富的库的......
  • Spring 源码学习笔记10——Spring AOP
    Spring源码学习笔记10——SpringAOP参考书籍《Spring技术内幕》SpringAOP的实现章节书有点老,但是里面一些概念还是总结比较到位源码基于Spring-aop5.3.22可能和旧......