SpringCloud入门——微服务调用的方式 RestTemplate的使用 使用nacos的服务名初步(Ribbon负载均衡)

目录

  • 引出
  • 微服务之间的调用
    • 几种调用方法
    • spring提供的组件
  • RestTemplate的使用
    • 导入依赖
    • 生产者模块
    • 单个配置的情况
    • 多个配置的情况
      • 没加.yaml的报错【报错】
      • 两个同名配置【细节】
    • 完整代码
      • config配置
      • 主启动类
      • controller层
    • 消费者模块
      • 进行配置
      • restTemplate配置类
      • controller层
  • 使用nacos的服务名【报错】
    • 添加Ribbon负载均衡
    • 改造config
    • controller调用
  • 总结

引出


1.微服务调用的几种方式,异步消息传递,http调用,服务网关调用,服务发现调用nacos;
2.spring提供的restTemplate,发送HTTP请求的客户端工具类;
3.nacos使用服务名报错,需要加Ribbon负载均衡;

微服务之间的调用

在这里插入图片描述

几种调用方法

RPC(Remote Procedure Call)远程过程调用协议,一种通过网络从远程计算机上请求服务,而不需要了解底层网络技术的协议。RPC它假定某些协议的存在,例如TPC/UDP等,为通信程序之间携带信息数据。在OSI网络七层模型中,RPC跨越了传输层和应用层,RPC使得开发,包括网络分布式多程序在内的应用程序更加容易。

在这里插入图片描述

微服务之间的调用可以有以下几种方式:

  1. 同步HTTP调用:微服务可以通过HTTP协议进行同步调用。一个微服务可以发送HTTP请求到另一个微服务的API接口,并等待响应。这种方式简单直接,适用于简单的请求和响应场景。
  2. 异步消息传递:微服务可以通过消息队列或消息中间件进行异步消息传递。一个微服务可以将消息发送到消息队列,另一个微服务可以从队列中接收并处理消息。这种方式可以实现解耦和异步处理,适用于高并发和异步场景。
  3. RPC调用:微服务可以使用远程过程调用(RPC)框架进行调用。RPC框架可以隐藏底层通信细节,使得微服务之间的调用像本地方法调用一样简单。常见的RPC框架有gRPC、Dubbo等。
  4. 服务网关调用:微服务可以通过服务网关进行调用。服务网关作为微服务的入口,可以对外提供统一的API接口,并将请求转发给相应的微服务。服务网关可以实现负载均衡、安全认证等功能。
  5. 服务发现调用:微服务可以通过服务发现机制进行调用。微服务注册到服务注册中心,其他微服务可以通过服务注册中心获取到服务的地址和端口,并进行调用。常见的服务发现工具有Consul、Eureka等。Nacos(全称为"Naming and Configuration Service")是一个开源的动态服务发现、配置管理和服务管理平台。它由阿里巴巴集团开发并开源,旨在帮助开发者更好地构建和管理微服务架构。

spring提供的组件

  • RestTemplate
  • Ribbon+RestTemplate
  • OpenFeign

RestTemplate是Spring Framework提供的一个用于发送HTTP请求的客户端工具类。它简化了在Java应用程序中进行HTTP通信的过程,封装了底层的HTTP连接和请求/响应处理逻辑。

RestTemplate的主要特点和功能包括:

  1. 支持多种HTTP方法:RestTemplate支持常见的HTTP方法,如GET、POST、PUT、DELETE等,可以根据需要选择合适的方法来发送请求。
  2. 提供丰富的请求和响应处理方法:RestTemplate提供了多种方法来处理请求和响应,如添加请求头、设置请求参数、发送请求、获取响应等。开发者可以根据需要选择合适的方法来处理HTTP请求和响应。
  3. 支持请求和响应的序列化和反序列化:RestTemplate可以将请求和响应的数据进行序列化和反序列化,支持多种数据格式,如JSON、XML等。开发者可以根据需要选择合适的序列化和反序列化方式。
  4. 支持错误处理和异常处理:RestTemplate可以处理HTTP请求过程中的错误和异常,如连接超时、请求失败等。开发者可以根据需要进行错误处理和异常处理。
  5. 可扩展性和定制化:RestTemplate提供了一些扩展点和配置选项,可以进行定制化配置。开发者可以根据需要进行扩展和定制,以满足特定的业务需求。

总之,RestTemplate是一个方便易用的HTTP客户端工具类,可以在Java应用程序中发送HTTP请求并处理响应。它是Spring Framework的一部分,与Spring的其他组件集成良好,如Spring Boot、Spring Cloud等。然而,从Spring 5.0版本开始,官方推荐使用WebClient来替代RestTemplate,因为WebClient提供了更强大和灵活的功能。

Ribbon是Netflix开源的一个负载均衡器,它是Spring Cloud中的一个组件,用于在微服务架构中实现客户端的负载均衡。Ribbon可以将客户端请求均匀地分发到多个服务实例上,以提高系统的可用性和性能。

Ribbon的主要特点和功能包括:

  1. 客户端负载均衡:Ribbon可以根据配置的负载均衡策略,将客户端请求分发到多个服务实例上。它支持多种负载均衡算法,如轮询、随机、加权轮询等。
  2. 服务发现和注册:Ribbon集成了服务注册中心,可以自动发现和获取可用的服务实例。它可以与Eureka、Consul等服务注册中心进行集成。
  3. 故障转移和容错:Ribbon可以检测服务实例的健康状态,并在服务不可用时自动切换到其他可用的实例。它还支持熔断机制,可以在服务出现故障时进行快速失败,避免级联故障。
  4. 定制化配置:Ribbon提供了丰富的配置选项,可以根据需要进行定制化配置。开发者可以配置负载均衡策略、超时时间、重试次数等参数。
  5. 与Spring Cloud集成:Ribbon与Spring Cloud的其他组件集成良好,如Eureka、Feign等。它可以作为Feign的默认负载均衡器,实现服务间的调用和负载均衡。

总之,Ribbon是一个强大的负载均衡器,可以在微服务架构中实现客户端的负载均衡。它与Spring Cloud的其他组件紧密结合,为构建和管理微服务架构提供了重要的支持。

OpenFeign是一个声明式的Web服务客户端,它是Spring Cloud中的一个组件,用于简化和优化微服务架构中的服务间调用。OpenFeign基于Netflix的Feign库进行了扩展和增强。

OpenFeign的主要特点和功能包括:

  1. 声明式的API定义:通过使用注解,开发者可以定义和描述服务间的API接口,包括请求方法、路径、参数、请求头等信息。这样可以使得服务间的调用代码更加简洁和易于维护。
  2. 自动化的服务发现和负载均衡:OpenFeign集成了服务注册中心,可以自动发现和调用其他微服务。它还支持负载均衡,可以根据配置的负载均衡策略选择合适的服务实例进行调用。
  3. 内置的请求和响应拦截器:OpenFeign提供了一些内置的拦截器,可以在请求和响应的不同阶段进行拦截和处理。开发者可以自定义拦截器来实现日志记录、错误处理等功能。
  4. 支持多种编码器和解码器:OpenFeign支持多种编码器和解码器,可以处理不同的数据格式,如JSON、XML等。开发者可以根据需要选择合适的编码器和解码器。
  5. 整合了Hystrix和Ribbon:OpenFeign与Hystrix和Ribbon等其他Spring Cloud组件集成,可以实现服务的容错和熔断机制,提高系统的可靠性和稳定性。

总之,OpenFeign简化了微服务架构中的服务间调用,提供了一种简洁、声明式的方式来定义和调用服务API。它与Spring Cloud的其他组件集成良好,是构建和管理微服务架构的重要工具之一。

RestTemplate的使用

微服务之间的调用:

生产者(被使用者) —provider

消费者(应用的服务) — consumer

将两个服务注册到nacos

在这里插入图片描述

导入依赖

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.tianju</groupId><artifactId>springcloud-restTemplate</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><modules><module>springcloud-consumer</module><module>springcloud-provider</module></modules><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.13</version></parent><!--    依赖的管理--><dependencyManagement><dependencies><!--整合springcloud --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>2021.0.5</version><type>pom</type><scope>import</scope></dependency><!--整合springcloud alibaba--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2021.0.5.0</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--        为了让别人发现--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>
<!--        注册配置--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency></dependencies></project>

生产者模块

在这里插入图片描述

单个配置的情况

在这里插入图片描述

spring:cloud:nacos:discovery:# 能够注册register-enabled: trueserver-addr: http://192.168.111.130:8848/config:server-addr: ${spring.cloud.nacos.discovery.server-addr}# namespace的idnamespace: 57bca93f-1161-4649-aec3-da79c3aa7cc2#        # 配置单个group: DEVname: book-cofigfile-extension: yamlapplication:name: springCloud-provider

多个配置的情况

在这里插入图片描述

没加.yaml的报错【报错】

org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘providerController’: Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder ‘book.name’ in value “${book.name}”

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder ‘book.name’ in value “${book.name}”

在这里插入图片描述

两个同名配置【细节】

在这里插入图片描述

完整代码

在这里插入图片描述

config配置

bootstrap.yml

spring:cloud:nacos:discovery:# 能够注册register-enabled: trueserver-addr: http://192.168.111.130:8848/config:server-addr: ${spring.cloud.nacos.discovery.server-addr}# namespace的idnamespace: 57bca93f-1161-4649-aec3-da79c3aa7cc2#        # 配置单个
#        group: DEV
#        name: book-cofig
#        file-extension: yaml# 配置多个 TODO:配置多个的时候,要加上.yaml后缀,nacos中的命名也要加.yaml# TODO:如果两个配置里面的值相同,则后面加载进来的会覆盖前面的;extension-configs:
#          - data-id: book-cofig
#            group: DEV
#            refresh: true- data-id: book-config1.yamlgroup: DEVrefresh: true- data-id: book-config2.yamlgroup: DEVrefresh: trueapplication:name: springCloud-provider

application.yml

server:port: 9099

主启动类

package com.tianju.cloud.provider;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApp {public static void main(String[] args) {SpringApplication.run(ProviderApp.class, args);}
}

controller层

package com.tianju.cloud.provider.controller;import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/api/provider")
public class ProviderController {@Value("${book.name}")private String movieName;@Value("${spring.application.name}")private String serverId;@Value("${server.port}")private int port;@GetMapping("/hello")public String hello(){String s = "服务"+serverId+",端口:"+port+",电影名:"+movieName;System.out.println(s);return s;}
}

消费者模块

在这里插入图片描述

进行配置

在这里插入图片描述

spring:cloud:nacos:discovery:# 能够注册register-enabled: trueserver-addr: http://192.168.111.130:8848/application:name: springCloud-consumer

restTemplate配置类

package com.tianju.consumer.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;@Configuration
public class RestTemplateConfig {@Bean(name = "restTemplateA") // 定义名称public RestTemplate restTemplate(){return new RestTemplate();}
}

在这里插入图片描述

controller层

package com.tianju.consumer.controller;import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;import javax.annotation.Resource;@RestController
@RequestMapping("/api/consumer")
public class ConsumerController {@Resource // 根据名称注入private RestTemplate restTemplateA;@GetMapping("/nihao")public String nihao(){String url = "http://localhost:9099/api/provider/hello";ResponseEntity<String> forEntity = restTemplateA.getForEntity(url,String.class);String body = forEntity.getBody();System.out.println("消费者获取生产者提供的数据"+body);return body;}}

使用nacos的服务名【报错】

在这里插入图片描述

在这里插入图片描述

添加Ribbon负载均衡

       <!--客户端负载均衡loadbalancer--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>

在这里插入图片描述

改造config

package com.tianju.consumer.config;import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;@Configuration
public class RestTemplateConfig {@Bean(name = "restTemplateA") // 定义名称public RestTemplate restTemplate(){return new RestTemplate();}@LoadBalanced // 具有软件负载均衡能力@Bean(name = "restTemplateWith") // 定义名称public RestTemplate restTemplateWith(){return new RestTemplate();}
}

controller调用

package com.tianju.consumer.controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;import javax.annotation.Resource;@RestController
@RequestMapping("/api/consumer")
public class ConsumerController {@Resource // 根据名称注入private RestTemplate restTemplateA;@GetMapping("/nihao")public String nihao(){String url = "http://localhost:9099/api/provider/hello";ResponseEntity<String> forEntity = restTemplateA.getForEntity(url,String.class);String body = forEntity.getBody();System.out.println("消费者获取生产者提供的数据"+body);return body;}@Resourceprivate RestTemplate restTemplateWith;@GetMapping("/nihaox")public String nihaoX(){String url = "http://springCloud-provider/api/provider/hello";ResponseEntity<String> forEntity = restTemplateWith.getForEntity(url, String.class);String body = forEntity.getBody();System.out.println("消费者获取生产者提供的数据"+body);return body;}
}

总结

1.微服务调用的几种方式,异步消息传递,http调用,服务网关调用,服务发现调用nacos;
2.spring提供的restTemplate,发送HTTP请求的客户端工具类;
3.nacos使用服务名报错,需要加Ribbon负载均衡;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/110335.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

13.redis集群、主从复制、哨兵

1.redis主从复制 主从复制是指将一台redis服务器&#xff08;主节点-master&#xff09;的数据复制到其他的redis服务器&#xff08;从节点-slave&#xff09;&#xff0c;默认每台redis服务器都是主节点&#xff0c;每个主节点可以有多个或没有从节点&#xff0c;但一个从节点…

Flink Kubernates Native - 入门

创建 namespace [rootCentOSA flink-1.17.1]# kubectl create ns flink-native [rootCentOSA flink-1.17.1]# kubectl config set-context --current --namespaceflink-native命令空间添加资源限制 [rootCentOSA flink-1.17.1]# vim namespace-ResourceQuota.yamlapiVersion:…

Maven报错 [ERROR] Malformed \uxxxx encoding.

IDEA刷新项目&#xff0c;报错[ERROR] Malformed \uxxxx encoding. 现象 1.控制台报错 [ERROR] Malformed \uxxxx encoding.2.项目代码大部分爆红 3.Pom文件不爆红 4.IDEA未能构建Dependencies 尝试清除IDEA缓存无效&#xff0c;重新克隆项目无效&#xff0c;更换低版本mav…

精进面试技巧:如何在程序员面试中脱颖而出

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

DPI 设置和获取

DPI设置与获取之前请保证程序已经打开DPI感知或者在清单文件嵌入DPI感知&#xff0c;否则API可能获取的值不准确 方法一:GetScaleFactorForMonitor 通过枚举显示器获取不同设备的DPI&#xff0c;获取的是实际DPI static BOOL CALLBACK MonitorEnumProc(HMONITOR hMonitor,HDC…

服务器数据恢复-ESXi虚拟化误删除的数据恢复案例

服务器数据恢复环境&#xff1a; 一台服务器安装的ESXi虚拟化系统&#xff0c;该虚拟化系统连接了多个LUN&#xff0c;其中一个LUN上运行了数台虚拟机&#xff0c;虚拟机安装Windows Server操作系统。 服务器故障&分析&#xff1a; 管理员因误操作删除了一台虚拟机&#x…

报错处理:Permission denied错误

报错处理 Permission denied错误 报错环境 在Linux上运行任何需要访问系统资源、文件或目录的命令时均有可能出现。 排错思路 该错误表示当前用户没有足够的权限执行指定的操作。排查时可以先查看具体的报错信息&#xff0c;例如文件或目录的路径以及相应的权限设置&#xff0c…

字符设备驱动(内核态用户态内存交互)

前言 内核驱动&#xff1a;运行在内核态的动态模块&#xff0c;遵循内核模块框架接口&#xff0c;更倾向于插件。 应用程序&#xff1a;运行在用户态的进程。 应用程序与内核驱动交互通过既定接口&#xff0c;内核态和用户态访问依然遵循内核既定接口。 环境搭建 系统&#…

HHDESK一键改密功能

HHDESK新增实用功能——使用SSH连接&#xff0c;对服务器/端口进行密码修改。 1 测试 首页点击资源管理——客户端&#xff0c;选择需要修改的连接&#xff1b; 可以先对服务器及端口进行测试&#xff0c;看是否畅通&#xff1b; 右键——测试——ping&#xff1b; 以及右…

【Python数据分析】Matplotlib小技巧!

1. 添加标题-title matplotlib.pyplot 对象中有个 title() 可以设置表格的标题。 **import** numpy **as** np **import** matplotlib.pyplot **as** plt \# 显示中文 plt.rcParams\[font.sans-serif\] \[uSimHei\] plt.rcParams\[axes.unicode\_minus\] **False** …

Spark整合hive的时候出错

Spark整合hive的时候 连接Hdfs不从我hive所在的机器上找&#xff0c;而是去连接我的集群里的另外两台机器 但是我的集群没有开 所以下面就一直在retry 猜测&#xff1a; 出现这个错误的原因可能与core-site.xml和hdfs-site.xml有关&#xff0c;因为这里面配置了集群的nameno…

三---开关稳压器

通过控制系统反馈&#xff0c;当电压上升时通过反馈降低&#xff0c;当电压下降时通过反馈升高&#xff1b;形成一个控制环路&#xff1b;控制电路&#xff1a;PWM&#xff08;脉宽调制&#xff09;&#xff0c;PFM&#xff08;频率控制方式&#xff09;&#xff0c;移相控制方…

Java并发编程第6讲——线程池(万字详解)

Java中的线程池是运用场景最多的并发框架&#xff0c;几乎所有需要异步或并发执行任务的程序都可以使用线程池&#xff0c;本篇文章就详细介绍一下。 一、什么是线程池 定义&#xff1a;线程池是一种用于管理和重用线程的技术&#xff08;池化技术&#xff09;&#xff0c;它主…

AcWing 898. 数字三角形 (每日一题)

大家好 我是寸铁 希望这篇题解对你有用&#xff0c;麻烦动动手指点个赞或关注&#xff0c;感谢您的关注 注意 像数组下标出现i-1的&#xff0c;在循环的时候从i1开始。 关于0x3f3f3f3f和Integer.MAX_VALUE 0x3f3f3f3f:1061109567 Integer.MAX_VALUE:2147483647 在选用Integ…

【缓存设计】记一种不错的缓存设计思路

文章目录 前言场景设计思路小结 前言 之前与同事讨论接口性能问题时听他介绍了一种缓存设计思路&#xff0c;觉得不错&#xff0c;做个记录供以后参考。 场景 假设有个以下格式的接口&#xff1a; GET /api?keys{key1,key2,key3,...}&types{1,2,3,...}其中 keys 是业务…

C语言“牵手”天猫商品详情数据方法,天猫商品详情API接口申请指南

天猫商城平台是阿里巴巴集团旗下的一个综合性购物网站。 天猫商城的前身是淘宝商城&#xff0c;于2012年1月11日上午更名。天猫是一个整合数千家品牌商、生产商&#xff0c;为商家和消费者之间提供一站式解决方案的B2C&#xff08;Business-to-Consumer&#xff0c;商业零售&a…

【业务功能篇78】微服务-前端后端校验- 统一异常处理-JSR-303-validation注解

5. 前端校验 我们在前端提交的表单数据&#xff0c;我们也是需要对提交的数据做相关的校验的 Form 组件提供了表单验证的功能&#xff0c;只需要通过 rules 属性传入约定的验证规则&#xff0c;并将 Form-Item 的 prop 属性设置为需校验的字段名即可 校验的页面效果 前端数据…

超越界限:大模型应用领域扩展,探索文本分类、文本匹配、信息抽取和性格测试等多领域应用

超越界限&#xff1a;大模型应用领域扩展&#xff0c;探索文本分类、文本匹配、信息抽取和性格测试等多领域应用 随着 ChatGPT 和 GPT-4 等强大生成模型出现&#xff0c;自然语言处理任务方式正在逐步发生改变。鉴于大模型强大的任务处理能力&#xff0c;未来我们或将不再为每…

每天一道leetcode:542. 01 矩阵(图论中等广度优先遍历)

今日份题目&#xff1a; 给定一个由 0 和 1 组成的矩阵 mat &#xff0c;请输出一个大小相同的矩阵&#xff0c;其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。 两个相邻元素间的距离为 1 。 示例1 输入&#xff1a;mat [[0,0,0],[0,1,0],[0,0,0]] 输出&#xff…

Hadoop HA模式切换

Hadoop HA模式下 主从的切换&#xff08;操作命令&#xff09; YARN HA 获取所有RM节点的状态 yarn rmadmin -getAllServiceState获取 rm1 节点的状态 yarn rmadmin -getServiceState rm1手动将 rm1 的状态切换到STANDBY yarn rmadmin -transitionToStandby rm1 ##或者 y…