【spring Cloud】微服务通信的三种方式RestTemplate、Feign远程调用与Dubbo的使用

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

目录

一、通过RestTemplate调用微服务

二、通过Feign远程调用

三、Dubbo 


分布式中的远程调用大概分为两种

RESTful接口 

REST,即Representational State Transfer的缩写,如果一个架构符合REST原则,就称它为RESTful架构。

  • 每一个URI代表一种资源;
  • 客户端和服务器之间,传递这种资源的某种表现层;
  • 客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。

RPC协议

RPC( Remote Procedure Call )一种进程间通信方式。允许像调用本地服务一样调用远程服务。 RPC框架的主要目标就是让远程服务调用更简单、透明。 RPC框架负责屏蔽底层的传输方式(TCP或者UDP)、序列化方式(XML/JSON/二进制)和通信细节。开发人员在使用的时候只需要了解谁在什么位置提供了什么样的远程服务接口即可,并不需要关心底层通信细节和调用过程。

区别与联系 

比较项

RESTful

RPC

通讯协议

HTTP

一般使用TCP

性能

略低

较高

灵活度

应用

微服务架构

SOA架构

首先说下我这个案例的基本模型,通过订单微服务与商品微服务,查询商品实现下订单。

前两种方法都是用RESTful接口最后一个用的是RPC协议

一、通过RestTemplate调用微服务

配置RestTemplate交给spring管理

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

写配置类或者启动类中都行

通过restTemplate调用商品微服务

订单微服务中控制器层自动注入RestTemplate 

通过 restTemplate.getForObject 方法获取商品对象

    @Autowired
    private RestTemplate restTemplate;

    ......

    Product pr = restTemplate.getForObject("http://localhost:8081/product/" + pid, Product.class);

缺点

  • 代码可读性差,编程体验不统一
  • 参数复杂URL难以维护 

二、通过Feign远程调用

首先加入导入坐标

<!--fegin组件-->

<dependency>

        <groupId>org.springframework.cloud</groupId>

        <artifactId>spring-cloud-starter-openfeign</artifactId>

</dependency>

在启动类上添加Fegin的注解

@EnableFeignClients//开启Fegin

在订单微服务中创建一个service,并使用Fegin实现微服务调用

@FeignClient("service-product")//声明调用的提供者的name 
public interface ProductService {
    //指定调用提供者的哪个方法 
    //@FeignClient+@GetMapping 就是一个完整的请求路径 http://service- product/product/{pid} 
    @GetMapping(value = "/product/{pid}")
    Product findById(@PathVariable("pid") int pid);
}

订单微服务中控制器层改写方法 获取商品对象

    @Autowired
    private ProductService productService;
    
    ......

    Product pr = productService.findById(pid);

配置文件中

feign:  
  client:
    config: 
      service-product: # 针对某个微服务的配置
      # default: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
         loggerLevel: FULL #  日志级别 
#需要把日志级别设置
logging:
  level:
    com.apesource: debug

而日志的级别分为四种:

  1. NONE:不记录任何日志信息,这是默认值。
  2. BASIC:仅记录请求的方法, URL以及响应状态码和执行时间
  3. HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息
  4. FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。

Feign使用优化 

Feign底层发起http请求,依赖于其它的框架。其底层客户端实现包括:

  • URLConnection:默认实现,不支持连接池
  • Apache HttpClient :支持连接池
  • OKHttp:支持连接池

因此提高Feign的性能主要手段就是使用连接池代替默认的URLConnection
这里我们用Apache的HttpClient来演示

导入依赖

<!--httpClient的依赖 -->

<dependency>

        <groupId>io.github.openfeign</groupId>

        <artifactId>feign-httpclient</artifactId>

</dependency>

配置文件

feign:
  client:
    config:
      default: # default全局的配置
        loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息
  httpclient:
    enabled: true # 开启feign对HttpClient的支持
    max-connections: 200 # 最大的连接数
    max-connections-per-route: 50 # 每个路径的最大连接数

总结:

  1. 日志级别尽量用basic
  2. 使用HttpClient或OKHttp代替URLConnection

三、Dubbo 

Dubbo是阿里巴巴开源的基于Java的高性能RPC一种远程调用) 分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。

首先在common服务中添加一个IProductService接口

public interface IProductService {
    Product findById(int pid);
}

在商品微服务中(服务提供者

添加Dobbo依赖

<!--dubbo-->

<dependency>

        <groupId>com.alibaba.cloud</groupId>

        <artifactId>spring-cloud-starter-dubbo</artifactId>

</dependency>

添加dubbo配置

dubbo: 
    scan: 
        base-packages: com.cc.service.impl # 开启包扫描
    protocols: 
        dubbo: 
            name: dubbo # 服务协议 
            port: -1 # 服务端口 使用随机端口
    registry: 
        address: spring-cloud://localhost # 注册中心

创建IProductServiceImpl实现类

//暴露服务:注意这里使用的是dubbo提供的注解@Service,而不是Spring的
@Service
public class IProductServiceImpl implements IProductService {
    @Autowired
    private ProductMapper productMapper;

    @Override
    public Product findById(int pid) {
        return productMapper.selectById(pid);
    }
}

在订单微服务中(服务消费者

导入Dobbo依赖

<!--dubbo-->

<dependency>

        <groupId>com.alibaba.cloud</groupId>

        <artifactId>spring-cloud-starter-dubbo</artifactId>

</dependency>

添加dobbo配置

dubbo: 
    registry: 
        address: spring-cloud://localhost # 注册中心
    cloud: 
        subscribed-services: service-product # 订阅的提供者名称

 在订单微服务中控制器层改写方法 获取商品对象文章来源地址https://www.toymoban.com/news/detail-848007.html

    @Reference
    private IProductService productService;

    ......

    Product pr = productService.findById(pid);

到了这里,关于【spring Cloud】微服务通信的三种方式RestTemplate、Feign远程调用与Dubbo的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Spring常见的三种注入方式

    基于构造器的依赖注入 基于Setter的依赖注入 基于字段变量的依赖注入 (当然还有其它不常用的注入方式:静态工厂方法注入、动态工厂方法注入) 2.1 构造器注入 2.2 Setter注入 2.3 字段变量注入 字段变量注入是基于注解实现的,即@Resource或者@Autowired, @Autowired :表示自动注

    2024年02月09日
    浏览(80)
  • Spring Boot 禁用 Swagger 的三种方式

    禁用方法1: ====== 使用注解 @Value() 推荐使用 package com.dc.config; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; impo

    2024年04月22日
    浏览(30)
  • 微服务系列-如何使用 RestTemplate 进行 Spring Boot 微服务通信示例

    下面我们将学习如何创建多个 Spring boot 微服务以及如何使用 RestTemplate 类在多个微服务之间进行同步通信。 微服务通信有两种风格: 同步通讯 异步通信 在同步通信的情况下,客户端发送请求并等待服务的响应。这里重要的一点是协议(HTTP/HTTPS)是同步的,客户端代码只有

    2024年02月05日
    浏览(36)
  • spring中bean实例化的三种方式 -- Spring入门(二)

    为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。当然,如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚,文章中如果有记录错误,欢迎读者朋友们批评指正。 (博客的参考源码以及可以在我主页的资源里找到,如果在学

    2024年02月16日
    浏览(27)
  • Spring 框架入门介绍及IoC的三种注入方式

    目录 一、Spring 简介 1. 简介 2. spring 的核心模块 ⭐  二、IoC 的概念 2.1 IoC 详解 2.2 IoC的好处 2.3 谈谈你对IoC的理解 三、IoC的三种注入方式 3.1 构造方法注入 3.2 setter方法注入 3.3 接口注入(自动分配) 3.4 spring上下文与tomcat整合 3.5 总结         Spring框架 是 Java 平台的一个

    2024年02月12日
    浏览(36)
  • spring boot请求http接口的三种方式

    HttpURLConnection 是 Java 中的 HTTP 客户端实现,,适用于简单的请求需要。 HttpURLConnection主要工作内容:打开socket连接,封装http请求报文,解析请求报文。 OkHttp 是一个第三方的 HTTP 客户端库,它比 Java 标准的 HttpURLConnection 更高效、更实用。主要特点包括: 比 HttpURLConnection 快得多

    2024年02月14日
    浏览(49)
  • Spring Boot获取resources目录下的文件的三种方式

    在Spring Boot项目中,经常需要获取 resources 目录下的文件。这些文件可以包括配置文件、模板文件、静态资源等。本文将介绍三种常用的方法来获取 resources 目录下的文件。 ResourceLoader 接口是Spring框架提供的用于加载各种资源的接口,包括 classpath 下的资源。在Spring Boot中,可

    2024年02月16日
    浏览(40)
  • K8s暴露服务的三种方式

    在 Kubernetes 中,我们可以使用三种方式来暴露服务,以便外部应用程序可以访问它们。这些方式包括: NodePort NodePort 是 Kubernetes 中最简单的一种暴露服务的方式。它允许我们将容器端口映射到主机的某个端口上。这样,我们就可以通过主机的 IP 地址和该端口访问服务。Node

    2024年02月11日
    浏览(34)
  • 量化分析革新金融服务软件的三种方式

    金融服务软件行业爱死量化分析了。 为什么呢?因为在这个本质上不可预测的行业中,量化分析提供了一种确定性,或者至少是类似于确定性的东西。 市场总是在变动,利润也起伏不定。交易达成了,然后落空,又再次达成,从交易大厅到董事会,纳秒级的差异可能成就巨

    2024年02月08日
    浏览(41)
  • 【Spring Cloud系列】- RestTemplate使用详解

    RestTemplate是Spring框架提供用于调用Rest接口的一个应用,它简化了与http服务通信方式。RestTemplate统一Restfull调用的标准,封装HTTP链接,只要需提供URL及返回值类型即可完成调用。相比传统的HttpClient与Okhttp,RestTemplate是一种优雅,简洁调用RESTfull服务的方式。 RestTemplate默认依赖

    2024年02月08日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包