SpringCloud学习笔记(三)_服务提供者集群与服务发现Discovery

news2025/1/12 8:46:02

服务提供者集群

既然SpringCloud的是微服务结构,那么对于同一种服务,当然不可能只有一个节点,需要部署多个节点

架构图如下:

由上可以看出存在多个同一种服务提供者(Service Provider)

搭建服务提供者集群

1、参考:SpringCloud 快速入门搭建单机版的:Eureka Server、Service Provider、Service Consumer

2、根据支付模块服务提供者(test-springcloud-provider-payment8001),在父工程中,同样新建一个支付模块的服务提供者(test-springcloud-provider-payment8002)

服务8001与8002的配置中,除端口外,其他都相同,且spring.application.name应用名称必须相同,表明2个服务是同一种服务

服务8002配置文件如下:

 1 # 端口
 2 server:
 3   port: 8002
 4 
 5 spring:
 6   application:
 7     name: cloud-payment-service
 8   #   数据源基本配置
 9   datasource:
10     driver-class-name: com.mysql.cj.jdbc.Driver
11     url: jdbc:mysql://localhost:3306/test_springcloud?allowPublicKeyRetrieval=true&useSSL=true
12     username: admin
13     password: 123456
14 
15 eureka:
16   client:
17     # 表示将自己注册进Eureka Server默认为true
18     register-with-eureka: true
19     # 是否从Eureka Server抓去已有的注册信息,默认是true
20     fetch-registry: true
21     # 设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
22     service-url:
23       defaultZone: http://localhost:8761/eureka
24 
25 mybatis:
26   mapperLocations: classpath:mapper/*Mapper.xml
27   # 所有entity别名类所在的包
28   type-aliases-pachage: com.test.springcloud.entities

View Code

3、重新启动项目,打开Eureka查看,发现有2个支付服务

4、使用订单模块消费者调用支付服务

消费者部分代码模块如下:

 1 @Configuration
 2 public class AppConfig {
 3 
 4     /**
 5      * 注入restTemplate,请用请求rest接口
 6      * @return
 7      */
 8     @Bean
 9     // 标注此注解后,RestTemplate就具有了客户端负载均衡能力
10     // 负载均衡技术依赖于的是Ribbon组件~
11     // RestTemplate都塞入一个loadBalancerInterceptor 让其具备有负载均衡的能力
12     @LoadBalanced
13     public RestTemplate restTemplate(){
14         return new RestTemplate();
15     }
16 }
17 
18 
19 @RestController
20 @Slf4j
21 public class OrderController {
22 
23     public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";
24 
25     @Autowired
26     private RestTemplate restTemplate;
27 
28     @GetMapping("/consumer/payment/get/{id}")
29     public CommonResult<Payment> getPayment(@PathVariable("id") Long id){
30         return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, CommonResult.class);
31     }
32 
33     ...
34 }

由上可以,通过配置向容器中注入了RestTemplate对象,而RestTemplate又被标注此@LoadBalanced注解后,RestTemplate就具有了客户端负载均衡能力,也就是说RestTemplate会轮流调用服务的各个节点,到达均衡的目的

5、测试调用,启动项目,使用地址:http://localhost:8000/consumer/payment/get/1,进行访问,可以看到已到达负载均衡的目的

服务发现Discovery

服务发现就是对于注册进eureka里面的微服务,可以通过服务发现获得该服务的信息

案例如下:

1、在微服务中使用@EnableDiscoveryClient注解,启用服务发现

 1 // Eureka客户端
 2 @EnableEurekaClient
 3 // 启用服务发现
 4 @EnableDiscoveryClient
 5 @SpringBootApplication
 6 public class PaymentMain8001 {
 7     public static void main(String[] args) {
 8         SpringApplication.run(PaymentMain8001.class, args);
 9     }
10 }

2、编辑Controller,启用服务发现之后,它会自动向容器注入DiscoveryClient(服务发现客户端)

通过调用DiscoveryClient的getServices方法,从注册中心获取服务列表

通过调用DiscoveryClient的getInstances方法,从注册中心获取服务实例集

 1 public class PaymentController {
 2 
 3     @Autowired
 4     private DiscoveryClient discoveryClient;
 5 
 6     @GetMapping(value = "/payment/discovery")
 7     public Object discovery(){
 8         // 获取服务列表
 9         List<String> services = discoveryClient.getServices();
10         for (String element : services) {
11             log.info("=====element:" + element);
12         }
13         
14         // 获取服务实例集
15         List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
16         for (ServiceInstance instance : instances) {
17             log.info("服务发现" + "\n"
18                     + "getServiceId === " + instance.getServiceId() + "\n"
19                     + "getHost === " + instance.getHost() + "\n"
20                     + "getPort === " + instance.getPort() + "\n"
21                     + "getUri === " + instance.getUri() );
22         }
23 
24         return  this.discoveryClient;
25     }
26 
27 } 

3、启用服务,使用地址:http://localhost:8001/payment/discovery,进行访问

页面结果:

后台日志:

由上可知,通过DiscoveryClient能获取到注册进eureka里面的微服务信息。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Python的图书馆大数据可视化分析系统设计与实现

博主介绍&#xff1a;✌csdn特邀作者、博客专家、java领域优质创作者、博客之星&#xff0c;擅长Java、微信小程序、Python、Android等技术&#xff0c;专注于Java、Python等技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; …

u盘数据丢失但占内存如何恢复?不要着急,这里有拯救方案

U盘数据丢失但占内存如何恢复&#xff1f;数据丢失是一种让人非常头疼的问题&#xff0c;尤其是当我们的U盘数据丢失了&#xff0c;但内存仍然被占用时&#xff0c;更令人困惑和焦虑。然而&#xff0c;不要慌张&#xff01;在本文中&#xff0c;将为大家介绍一些有效的方法来恢…

STM32F4X 定时器PWM

STM32F4X 定时器PWM 什么是PWMSTM32F4X PWM使用GPIO引脚复用STM32F4X PWM配置参数定时器PWM输出通道定时器PWM输出模式定时器PWM有效电平定时器PWM工作过程定时器PWM频率计算 STM32F4X PWM配置步骤STM32F4X PWM配置函数 上节说到了定时器的定时功能&#xff0c;这节说一下定时器…

10种最流行的3D模型文件格式及转换方法

3D 文件格式用于存储有关 3D 模型的信息。 你可能听说过一些最流行的格式&#xff0c;包括 STL、OBJ、FBX 和 DAE。 它们广泛应用于从视频游戏动画到工业增材制造的各种应用中。 在本文中&#xff0c;我们将考虑为什么有这么多不同的格式&#xff0c;探讨 3D 文件格式存储的四…

已解决W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library ‘c

已解决W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library ‘cudart64_110.dll’; dlerror: cudart64_110.dll not found I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not ha…

C++ 二叉搜索树的概念特性

1. 二叉搜索树 1.1 二叉搜索树概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树 &#xff0c;或者是具有以下性质的二叉树 : 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值 若它的右子树不为空&#xff0c;则右子树上所有节点的值都大…

华为云部署JDK环境

一、确定系统内核 在下载jdk之前要先确定自己的内核是什么版本&#xff0c;因为我选的云服务器是CentOS7&#xff0c;所以一定是Linux_86_64版本。 若不确定可以在命令行中输入“uname -a”来查看系统内核。 二、下载JDK 到官网下载对应统信系统版本的jdk安装包 jdk官网&…

Java进阶(5)——创建多线程的方法extends Thread和implements Runnable的对比 线程池及常用的线程池

目录 引出创建多线程的方法Thread类创建多线程Runnable接口创建多线程Thread类的常用方法两者的对比 线程池是啥&#xff1f;为啥用&#xff1f;结合案例理解常用的线程池继承Runnable接口的工人实体类newSingleThreadExecutor&#xff08;单线程&#xff09;newFixedThreadPoo…

Simulink仿真模块 - Clock

Clock&#xff1a;显示并提供仿真时间 库&#xff1a; Simulink / Sources 模型为&#xff1a; 说明 Clock 模块在每个仿真时间步输出当前仿真时间。此模块对需要仿真时间的其他模块非常有用。 当在离散系统中需要当前时间时&#xff0c;请使用Digital Clock模块。 实例 模块…

利用python批量掩膜提取遥感图像

&#xff08;1&#xff09; 前言 遥感影像的提取和分析在地理信息系统、环境监测、农业、城市规划等领域具有重要的应用价值。按掩膜提取遥感影像是一种常用的方法&#xff0c;它可以通过定义掩膜来选择感兴趣的区域&#xff0c;并排除其他干扰因素。 按掩膜提取遥感影像的方…

ssm网上服装销售系统源码和论文

ssm网上服装销售系统047 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 目前互联网上的网上销售系统每天以惊人的速度增加&#xff0c;网上购物越来越成为现代年轻人的首选&#xff0c;足不出门便能选购好自己…

H5商城公众号商城系统源码 积分兑换商城系统独立后台

网购商城系统源码 积分兑换商城系统源码 独立后台附教程 测试环境&#xff1a;NginxPHP7.0MySQL5.6thinkphp伪静态

胖小酱之广告

广告是一种宣传手段&#xff0c;通过一定形式的媒体&#xff0c;向公众传递信息的方式。广告可以分为广义和狭义两种&#xff0c;其中广义广告是指不以营利为目的的广告&#xff0c;如政府公告、社会团体声明等&#xff1b;狭义广告则是指以营利为目的的广告&#xff0c;通常是…

【JAVA基础】 IO详解

【JAVA基础】 IO详解 文章目录 【JAVA基础】 IO详解一、概述二、IO流的作用三、IO流的使用场景四、IO流的分类4.1 传输数据的单位分&#xff1a;4.2 数据传输的方向分&#xff1a;4.3 流的角色的不同分&#xff1a; 五、IO流体系六、字节输入流InputStream七、字节输出流 Outpu…

Python 从入门到实践第3版(中文版)正式版+编制版+电子版

Python编程&#xff1a;从入门到实践&#xff08;第3版&#xff09; ([美] 埃里克 • 马瑟斯&#xff08;Eric Matthes&#xff09;) 2023 (Z-Library)

【算法日志】动态规划刷题:01背包问题(day36)

代码随想录刷题60Day 前言 今天主要讨论背包问题中的01背包问题&#xff0c;这类问题的难点在于怎样对问题进行数学建模。一旦思考好问题的解决方式&#xff0c;剩下的步骤就比较简单了。 分割等和子集 本题可采用暴力回溯&#xff0c;但复杂度比较高&#xff0c;所以采取动态…

解决Win10运行软件程序提示【管理员已阻止你运行此应用】

一、问题描述 在Win10系统打开软件&#xff0c;弹窗提示【管理员已阻止你运行此应用】&#xff0c;如下图所示&#xff1a; 二、问题分析 是由于Windows系统的安全策略设置影响&#xff0c;保护你的电脑不被恶意程序破坏&#xff1b;只用修改系统的安全策略即可。 三、解决办法…

多目标优化算法知识点梳理

EA进化算法 MOEA多目标进化算法 1.MOEA的分类 1.1 按不同的进化机制分类 基于分解的MOEA&#xff1a;是比较早起所使用的方法&#xff1a;聚集函数法。将被优化的所有子目标组合或聚集为单个目标&#xff0c;从而将多目标优化问题转换为单目标优化问题。 基于支配关系的MOE…

ACME协议申请泛域名证书

ACME协议申请泛域名证书 注册域名 namecheap迁移DNS到cloudflare创建API令牌 区域选择域名生成证书安装证书参考 注册域名 namecheap 迁移DNS到cloudflare 创建API令牌 区域选择域名 复制此令牌&#xff0c;令牌只显示一次。 生成证书 export CF_Token"API令牌"a…

从零实现深度学习框架——Transformer从菜鸟到高手(二)

引言 &#x1f4a1;本文为&#x1f517;[从零实现深度学习框架]系列文章内部限免文章&#xff0c;更多限免文章见 &#x1f517;专栏目录。 本着“凡我不能创造的&#xff0c;我就不能理解”的思想&#xff0c;系列文章会基于纯Python和NumPy从零创建自己的类PyTorch深度学习框…