SpringCloud-生产者和消费者

news2024/11/27 10:44:13

一、生产者和消费者的定义

在 Spring Cloud 中,术语 "生产者" 和 "消费者" 用于描述微服务架构中的两种基本角色。

角色定义
生产者
Provider
生产者是提供具体服务或功能的模块。它将业务逻辑封装成服务,供其他模块调用。生产者向服务注册中心注册自己提供的服务,使其他模块可以通过服务注册中心发现并调用这些服务。
消费者
Consumer
消费者是通过调用生产者提供的服务来完成特定功能的模块。消费者从服务注册中心获取生产者的信息,然后调用生产者的服务接口。消费者在运行时动态发现并连接到可用的生产者。

示例:一个在线商城系统中,订单服务可以被视为生产者,提供创建订单、查询订单等服务。购物车服务可以是一个消费者,它调用订单服务的创建订单服务来完成用户购物车中商品的下单。

简单在线商城购物流程服务结构图:

 

稍微复杂一点的在线商城系统的购物流程服务结构图:


二、生产者和消费者代码演示

1、创建父工程

在构建微服务项目时,首先需要创建一个父工程,以便统一管理依赖版本和项目属性。

我们来新建项目 SpringCloudTest。

父工程不需要太多引入,勾选 spring web 这一项即可。 

删除多余内容:

pom.xml 新增 packaging 标签


2、创建服务注册中心

微服务架构中,服务注册中心是整个系统的核心,负责服务的注册与发现。使用 Spring Cloud 的Eureka 组件,可以轻松搭建一个高可用的服务注册中心。在创建 Eureka 注册中心时,需要在项目中引入相应的依赖,并通过注解标记该服务为 Eureka Server。

新建模块 euraka-server。

勾选 eureka server。 

创建完成后,我们修改 eureka-server 的 pom.xml,使它的 <parent></parent> 标签里的内容对应父工程。

父工程:

eureka-server 的 pom.xml:

<parent>
    <groupId>com.example</groupId>
    <artifactId>SpringCloudTest</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath/>
</parent>

同时,我们需要在父工程的 pom.xml 里添加子模块的依赖关系。 

<modules>
    <module>eureka-server</module>
</modules>

创建 eureka-server 的 application.properties 配置文件重命名为 application.yml。

内容修改为: 

#服务端口
server:
  port: 8081
#服务名称
spring:
  application:
    name: eureka-server
 
#eureka地址
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8081/eureka/
    register-with-eureka: false
    fetch-registry: false
    

启动类上添加 @EnableEurekaServer 注解。 

测试启动 eurake 服务,选中 EurekaServerApplication 右键运行,启动 eurake-server 服务。确认控制台正常加载,在控制台上能够看到服务实例的信息,表示 Eureka 注册中心已成功启动。

访问我们设置的 eurake-server 服务的地址:localhost:8081,可以看到 Eureka 服务界面。


3、创建生产者

生产者是负责提供服务的模块,它将特定的业务逻辑封装成服务,供其他模块调用。在创建生产者时,需要定义服务接口,并使用 @RestController 或 @Service 等注解将业务逻辑发布为 RESTful API 或 RPC 服务。生产者将服务注册到 Eureka 注册中心,使消费者能够发现并调用这些服务。

① 创建生产者模块

父工程下创建模块 eureka-provider:

勾选 Eureka Discovery Client,用于注册到 eureka-server 服务注册中心。 

类似于 eureka-server 服务注册中心的创建,我们需要在 pom.xml 里引入父类标签,可以参考上面eureka-server 服务注册中心创建时的写法,内容是一样的,都指向父工程。

<parent>
    <groupId>com.example</groupId>
    <artifactId>SpringCloudTest</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath/>
</parent>

同理,为父工程增加新的子模块:eureka-provider:

<modules>
    <module>eureka-server</module>
    <module>eureka-provider</module>
</modules>

在主类上使用 @EnableEurekaClient 注解,注册该服务到 Eureka Server。


② 添加消费者配置

将 eureka-provider 的 application.properties 配置文件重命名为 application.yml。

配置 eureka-provider 的相关属性,如服务端口、注册中心地址等。

# 服务器端口
server:
  port: 8082

# 配置发布服务地址
spring:
  application:
    name: eureka-provider

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8081/eureka


③ 编写生产者代码 

生产者模块需要将特定的业务逻辑封装成服务,供其他模块调用。所以我们需要创建实体类并且写一些供我们调用的接口。

这里是创建 eureka-provider 模块时勾选 Eureka Discovery Client 自带的代码,包含两个控制器接口类和一个实体类,我们直接拿来用就可以。

实体类 User 如下:

控制器基类 BaseController: 


④ 测试生产者服务可用

接着,我们运行应用,根据我们刚刚的配置,运行地址是 localhost:8082,我们看看访问这个地址能否显示 Hello World 的主页。如果可以访问,说明项目运行成功,我们再来访问 Eureka Server 的控制台,确保 eureka-provider 成功注册到服务注册中心。 


4、创建消费者

消费者是通过调用生产者提供的服务来完成特定功能的模块。在创建消费者时,需要引入 Eureka 客户端依赖,以便消费者能够从服务注册中心发现并调用生产者提供的服务。通过使用 @LoadBalanced 注解配置 RestTemplate,可以实现基于服务名称的负载均衡。

① 创建消费者模块

父工程下创建模块 eureka-consumer:

勾选 Eureka Discovery Client,用于注册到 eureka-server 服务注册中心。  

类似于 eureka-server 服务注册中心的创建,我们需要在 pom.xml 里引入父类标签,可以参考上面eureka-server 服务注册中心创建时的写法,内容是一样的,都指向父工程。

<parent>
    <groupId>com.example</groupId>
    <artifactId>SpringCloudTest</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath/>
</parent>

同理,为父工程增加新的子模块:eureka-consumer:

<modules>
    <module>eureka-server</module>
    <module>eureka-provider</module>
    <module>eureka-consumer</module>
</modules>

 在主类上使用 @EnableEurekaClient 注解,注册该服务到 Eureka Server。


② 添加消费者配置

将 eureka-consumer 的 application.properties 配置文件重命名为 application.yml。

配置 eureka-consumer 的相关属性,如服务端口、注册中心地址等。 

# 服务器端口
server:
  port: 8083

# 配置发布服务地址
spring:
  application:
    name: eureka-consumer

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8081/eureka


③ 编辑消费者代码 

使用 RestTemplate 或 Feign 等方式调用生产者提供的服务,确保服务的负载均衡。
这里我们使用的是 RestTemplate。

启动类里添加:

@Bean   // 交给spring容器管理
@LoadBalanced  // 支持使用服务名称发现服务进行调用,且支持负载
public RestTemplate getRestTemplate() {
    return new RestTemplate();
}

创建调用生产者服务的接口类 UserController。

UserController: 

package com.example.eurekaconsumer.demos.web;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;

@RestController
public class UserController {

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping("/showUser")
    @ResponseBody
    public User showUser() {
        String baseUrl = "http://" + "eureka-provider" + "/user";
        User userInfo = restTemplate.getForObject(baseUrl, User.class);
        return userInfo;
    }

}

我们这里的接口调用地址是 /showUser,调用的是生产者服务的 /user 接口。


④ 测试消费者服务可用 

接着,我们运行应用,根据我们刚刚的配置,运行地址是 localhost:8083,我们看看访问这个地址能否显示 Hello World 的主页。如果可以访问,说明项目运行成功,我们再来访问 Eureka Server 的控制台,确保 eureka-consumer 成功注册到服务注册中心。 


5、消费者调用生产者服务

生产者和消费者模块准备完成之后,我们就来演示消费者调用生产者服务的过程。

首先,我们启动项目,按照 eureka-server、eureka-provier 、eureka-consumer 的顺序启动。

然后,我们来直接调用生产者 eureka-provier 的用户服务接口 /user。访问地址:localhost:8082/user,可以看到成功返回给我们一个 User 对象。

接着,我们来通过消费者 eureka-consumer 来调用生产者 eureka-provier 的用户服务接口,访问地址:localhost:8083/showUser,可以看到也是成功返回给我们一个 User 对象。这里的对象就是eureka-provier 的用户服务接口 /user 返回给我们的。

以上就是消费者服务调用生产者服务的简单示例。


三、实现服务调用的负载均衡

在上面代码的演示中,我们已经用到了负载均衡的措施,这一节,我就再系统描述一下 Spring Cloud 中基于 RestTemplate 实现负载均衡的具体步骤。

负载均衡是一种将网络或计算负载分配到多个服务器或网络路径的技术,以实现资源的均匀利用和提高系统的可用性。在微服务架构中,负载均衡起到了关键的作用,确保请求能够被均匀分发到多个服务实例上,避免某个实例过载而影响系统性能。 

在 Spring Cloud 中,RestTemplate 通过整合 Ribbon 负载均衡器,可以实现在服务消费者端的负载均衡。以下是使用 RestTemplate 进行负载均衡的基本用法:

1、引入Ribbon依赖

在消费者项目的 pom.xml 中引入 Spring Cloud Netflix Ribbon 依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

2、创建RestTemplate

在消费者的配置类或者项目启动类中创建一个带有 @LoadBalanced 注解的 RestTemplate Bean,该注解启用了 Ribbon 的负载均衡功能:

启动类里添加方法:

@Bean   // 交给spring容器管理
@LoadBalanced  // 支持使用服务名称发现服务进行调用,且支持负载
public RestTemplate getRestTemplate() {
    return new RestTemplate();
}

配置类例子:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class AppConfig {

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

3. 使用RestTemplate进行服务调用

在消费者的服务类中使用 RestTemplate 进行服务调用。使用服务名称而不是硬编码的 URL,Ribbon 会根据服务名称自动选择可用的实例:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class ConsumerService {

    private final RestTemplate restTemplate;

    @Autowired
    public ConsumerService(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    public String consumeService() {
        // 使用服务名称而不是具体的URL
        String serviceUrl = "http://producer-service/produce";
        return restTemplate.getForObject(serviceUrl, String.class);
    }
}

上述代码中,http://producer-service 是服务提供者的服务名称,而不是具体的服务实例的URL。Ribbon 会根据负载均衡策略选择一个可用的服务实例进行调用。

通过这种方式,RestTemplate 在消费者端实现了对服务提供者的负载均衡。你可以根据具体的业务需求选择不同的负载均衡策略,例如轮询、随机、权重等。


四、生产者和消费者知识总结

生产者(Provider):

生产者是提供具体服务或功能的模块,将业务逻辑封装成服务,供其他模块调用。

要点内容
服务注册生产者将自身注册到服务注册中心,使其他模块能够发现并调用这些服务。
服务标识生产者有唯一的标识,通常是服务的名称,通过服务注册中心进行标识和发现。
服务提供实现具体的服务接口,可以是RESTful API或RPC接口,对外提供服务功能。
负载均衡通过服务注册中心和负载均衡器,使请求能够均匀分布到多个生产者实例,提高性能和可用性。

消费者(Consumer):

消费者是通过调用生产者提供的服务来完成特定功能的模块,使用其他服务以满足业务需求。

要点内容
服务发现消费者通过服务注册中心获取生产者的实例信息,实现动态发现服务。
负载均衡使用负载均衡器决定选择哪个生产者实例进行服务调用,确保请求分发均衡。
服务调用通过 HTTP RESTful API 或 RPC 调用生产者的服务接口,完成特定的业务需求。
动态感知消费者能够动态感知生产者实例的上线和下线,保持与服务注册中心的实时同步。

负载均衡与服务注册中心:

要点内容
Ribbon
负载均衡器
作为客户端负载均衡器,通过配置策略决定选择哪个生产者实例进行服务调用。
Eureka
服务注册中心
用于生产者注册和消费者服务发现,提供服务实例信息和状态。
服务发现
与注册
生产者通过 Eureka 注册服务,消费者通过 Eureka 发现服务,实现解耦的服务调用。
动态感知
与适应性
负载均衡器和服务注册中心能够动态感知实例变化,保持对系统变化的及时适应性。

以上知识点总结了生产者和消费者在微服务架构中的基本概念和操作,强调了服务注册中心和负载均衡在实现服务发现和调用过程中的关键作用。这些概念为搭建稳健、高性能的微服务系统提供了基础。

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

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

相关文章

线性表 —— 数组、栈、队、链表

本文以 typescript 实现数据结构&#xff0c;虽说是 ts 实现&#xff0c;但更准确说是面向对象的方式实现&#xff0c;因此可以无缝切换成 Java 等面向对象语言。 什么是数据结构&#xff08;Data Structure&#xff09;&#xff1f; “数据结构是ADT&#xff08;抽象数据类型…

一文学会Axios的使用

异步请求 同步发送请求过程如下 浏览器页面在发送请求给服务器&#xff0c;在服务器处理请求的过程中&#xff0c;浏览器页面不能做其他的操作。只能等到服务器响应结束后才能&#xff0c;浏览器页面才能继续做其他的操作。 异步发送请求过程如下浏览器页面发送请求给服务器&…

蓝桥杯第八届省赛题笔记------基于单片机的电子钟程序设计与调试

题目要求&#xff1a; 一、基本要求 1.1 使用 CT107D 单片机竞赛板&#xff0c;完成“电子钟”功能的程序设计与调试&#xff1b; 1.2 设计与调试过程中&#xff0c;可参考组委会提供的“资源数据包”&#xff1b; 1.3 Keil 工程文件以准考证号命名&#xff0c;保存在…

032-安全开发-JavaEE应用Servlet路由技术JDBCMybatis数据库生命周期

032-安全开发-JavaEE应用&Servlet路由技术&JDBC&Mybatis数据库&生命周期 #知识点&#xff1a; 1、JavaEE-HTTP-Servlet技术 2、JavaEE-数据库-JDBC&Mybatis 演示案例&#xff1a; ➢JavaEE-HTTP-Servlet&路由&周期 ➢JavaEE-数据库-JDBC&Mybat…

MiniCPM:揭示端侧大语言模型的无限潜力

技术博客链接&#xff1a; &#x1f517;https://shengdinghu.notion.site/MiniCPM ➤ Github地址&#xff1a; &#x1f517;https://github.com/OpenBMB/MiniCPM ➤ Hugging Face地址&#xff1a; &#x1f517;https://huggingface.co/openbmb/MiniCPM-2B-sft-bf16 1 …

目标检测及相关算法介绍

文章目录 目标检测介绍目标检测算法分类目标检测算法模型组成经典目标检测论文 目标检测介绍 目标检测是计算机视觉领域中的一项重要任务&#xff0c;旨在识别图像或视频中的特定对象的位置并将其与不同类别中的对象进行分类。与图像分类任务不同&#xff0c;目标检测不仅需要…

工信部颁发的《计算机视觉处理设计开发工程师》中级证书

计算机视觉&#xff08;Computer Vision&#xff09;是一门研究如何让计算机能够理解和分析数字图像或视频的学科。简单来说&#xff0c;计算机视觉的目标是让计算机能够像人类一样对视觉信息进行处理和理解。为实现这个目标&#xff0c;计算机视觉结合了图像处理、机器学习、模…

RabbitMQ——基于 KeepAlived + HAProxy 搭建 RabbitMQ 高可用负载均衡集群

一、集群简介 1.1 集 群架构 当单台 RabbitMQ 服务器的处理消息的能力达到瓶颈时&#xff0c;此时可以通过 RabbitMQ 集群来进行扩展&#xff0c;从而达到提升吞吐量的目的。 RabbitMQ 集群是一个或多个节点的逻辑分组&#xff0c;集群中的每个节点都是对等的&#xff0c;每…

职业性格测试在求职应聘跳槽中的应用

人的性格总是千奇百怪&#xff0c;有的人总是想迎接挑战&#xff0c;超越自己&#xff0c;不停的奔着高处走&#xff0c;然而有的人总是喜欢随遇而安&#xff0c;踏踏实实一辈子&#xff0c;有份安稳的工作&#xff0c;有吃有喝就好。那么对于哪些喜欢迎接挑战&#xff0c;但又…

Adobe Camera Raw for Mac v16.1.0中文激活版

Adobe Camera Raw for Mac是一款强大的RAW格式图像编辑工具&#xff0c;它能够处理和编辑来自各种数码相机的原始图像。以下是关于Adobe Camera Raw for Mac的一些主要特点和功能&#xff1a; 软件下载&#xff1a;Adobe Camera Raw for Mac v16.1.0中文激活版 RAW格式支持&…

MyBatis一些常见知识点!

什么是 ORM 框架&#xff1f; MyBatis 有哪些优缺点&#xff1f; 典型回答&#xff1a; ORM&#xff08;Object-Relational Mapping&#xff0c;对象关系映射&#xff09;框架是一种将关系型数据库中的数据 与 应用程序中的对象进行映射的技术。它通过在程序代码中定义的类和属…

Unity类银河恶魔城学习记录1-12 PlayerComboAttack源代码 P39

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili PlayerPrimaryAttack.cs using System.Collections; using System.Collect…

七月论文审稿GPT第2.5版:微调GPT3.5 turbo 16K和llama2 13B以扩大对GPT4的优势

前言 我司自去年7月份成立大模型项目团队以来&#xff0c;至今已有5个项目组&#xff0c;其中 第一个项目组的AIGC模特生成系统已经上线在七月官网第二项目组的论文审稿GPT则将在今年3 4月份对外上线发布第三项目组的RAG知识库问答第1版则在春节之前已就绪至于第四、第五项目…

LLaVA:GPT-4V(ision) 的新开源替代品

LLaVA&#xff1a;GPT-4V(ision) 的新开源替代品。 LLaVA &#xff08;https://llava-vl.github.io/&#xff0c;是 Large Language 和Visual A ssistant的缩写&#xff09;。它是一种很有前景的开源生成式 AI 模型&#xff0c;它复制了 OpenAI GPT-4 在与图像对话方面的一些功…

(5)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—12种聚类算法说明与归纳

目录 一、12种聚类(无监督学习)算法说明和区分比较 聚类算法的类型(一) ​编辑导入函数库 加载数据集 ​编辑 (1)K-Means --Centroid models (2)Mini-Batch K-Means -- Centroid models (3)AffinityPropagation (Hierarchical) -- Connectivity models (4)Mean Shift…

最新GPT4.0使用教程,AI绘画,GPT语音对话使用,DALL-E3文生图

一、前言 ChatGPT3.5、GPT4.0、GPT语音对话、Midjourney绘画&#xff0c;文档对话总结DALL-E3文生图&#xff0c;相信对大家应该不感到陌生吧&#xff1f;简单来说&#xff0c;GPT-4技术比之前的GPT-3.5相对来说更加智能&#xff0c;会根据用户的要求生成多种内容甚至也可以和…

算法练习-三数之和(思路+流程图+代码)

难度参考 难度&#xff1a;中等 分类&#xff1a;数组 难度与分类由我所参与的培训课程提供&#xff0c;但需要注意的是&#xff0c;难度与分类仅供参考。且所在课程未提供测试平台&#xff0c;故实现代码主要为自行测试的那种&#xff0c;以下内容均为个人笔记&#xff0c;旨在…

openGauss学习笔记-214 openGauss 性能调优-确定性能调优范围

文章目录 openGauss学习笔记-214 openGauss 性能调优-确定性能调优范围214.1 性能因素214.2 调优范围确定 openGauss学习笔记-214 openGauss 性能调优-确定性能调优范围 数据库性能调优通常发生在用户对业务的执行效率不满意&#xff0c;期望通过调优加快业务执行的情况下。正…

机器学习的整个流程

机器学习的整个流程定义了数据科学团队执行以创建和交付机器学习模型的工作流。此外&#xff0c;机器学习流程还定义了团队如何协作合作&#xff0c;以创建最有用的预测模型。 机器学习high level的流程 机器学习流程的关键步骤包括问题探索&#xff08;Problem Exploration&a…

《dx12 龙书》第四部分学习笔记——预备知识(下)

7、多重采样技术的原理 由于屏幕中显示的像素不可能是无穷小的&#xff0c;所以并不是任意一条直线都能在显示器上“平滑”而完美地呈现出来。即为以像素矩阵 &#xff08;matrix of pixels&#xff0c; 可以理解为“像素2D数组”&#xff09;逼近直线的方法所产生的“阶梯” &…