目录

一、认识微服务

1.单体架构

2.微服务

3.SpringCloud 

二、微服务拆分

1.服务拆分原则

2.服务调用

3. RestTemplate

三、服务注册和发现

1. 注册中心原理

2. 服务发现

2.1 服务注册

2.2 服务发现

四、OpenFeign


一、认识微服务

1.单体架构

单体架构就是整个项目中所有功能模块都在一个工程中开发;项目部署时需要对所有模块一起编译、打包;项目的架构设计、开发模式都非常简单。

当项目规模较小时,单体架构上手简单、部署、运维都很方便。但是一旦项目规模变大,例如淘宝那样的,单体架构就远远不够了。

2.微服务

微服务架构就是将单体架构中的功能模块从单体架构中拆分出来,独立部署为多个服务。同时满足以下要求:

  • 单一职责:一个微服务负责一部分业务功能,并且其核心数据不依赖于其它模块。

  • 团队自治:每个微服务都有自己独立的开发、测试、发布、运维人员,团队人员规模不超过10人

  • 服务自治:每个微服务都独立打包部署,访问自己独立的数据库。并且要做好服务隔离,避免对其它服务产生影响

例如上面的商城项目就可以拆分为多个模块,然后独立部署。

3.SpringCloud 

微服务拆分以后碰到的各种问题都有对应的解决方案和微服务组件,而SpringCloud框架可以说是目前Java领域最全面的微服务组件的集合了。

SpringCloud依托于SpringBoot的自动装配能力,大大降低了其项目搭建、组件使用的成本。

在选择SpringCloud版本的时候,一定要选择与SpringBoot相对应的版本。

二、微服务拆分

1.服务拆分原则

拆分微服务时,要保证高内聚、低耦合的原则。即对一个微服务进行修改,不会对另一个微服务产生影响。

服务拆分方式有两种:纵向拆分和横向拆分。

所谓纵向拆分,就是按照项目的功能模块来拆分。例如商城项目中,就有用户管理功能、订单管理功能、购物车功能、商品管理功能、支付功能等。那么按照功能模块将他们拆分为一个个服务,就属于纵向拆分。这种拆分模式可以尽可能提高服务的内聚性。

横向拆分,是看各个功能模块之间有没有公共的业务部分,如果有将其抽取出来作为通用服务。例如用户登录是需要发送消息通知,记录风控数据,下单时也要发送短信,记录风控数据。因此消息发送、风控数据记录就是通用的业务功能,因此可以将他们分别抽取为公共服务:消息中心服务、风控管理服务。这样可以提高业务的复用性,避免重复开发。同时通用业务一般接口稳定性较强,也不会使服务之间过分耦合。

2.服务调用

因为上述的商城项目使用的是单体架构,一个功能可以随意调用另一个功能的方法。但是再拆分之后,两个模块之间没有任何联系。如果购物车业务中需要查询商品信息,此时就需要去访问商品模块,流程如下:

代码中需要变化的是这一步:

3. RestTemplate

Spring给我们提供了一个RestTemplate的API,可以方便的实现Http请求的发送。常见的Get、Post、Put、Delete请求都支持,如果请求参数比较复杂,还可以使用exchange方法来构造请求。

首先,需要在请求服务的微服务模块中定义一个配置类,将RestTemplate注册为一个Bean:

@Configuration
public class RemoteCallConfig {@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}

之后,在调用服务的Service类中进行远程调用:

此时,购物车模块就可以查询到商品的相关信息了。

在调用之前,要将RestTemplate这个Bean对象进行注入。

三、服务注册和发现

如果上述商品的微服务模块被调用的较多,为了应对更高的并发,进行了多实例部署,如图:

我们会发现,每一个实例的端口都是不一样的(实际上可能ip地址也不相同)。但是在上述代码中我们将ip地址写死了,导致不管部署多少个实例,都只会调用同一个实例。为了解决该问题,就需要引入注册中心的概念。

1. 注册中心原理

在微服务的远程调用过程中,包括两个角色:

  • 服务提供者:提供接口供其它微服务访问,比如item-service

  • 服务消费者:调用其它微服务提供的接口,比如cart-service

在大型微服务项目中,服务提供者的数量会非常多,为了管理这些服务就引入了注册中心的概念。注册中心、服务提供者、服务消费者三者间关系如下:

注册中心会知道服务提供者有多少个实例,然后告知服务调用者,服务调用者会采取某一个负载均衡算法来选择一个实例进行访问。如果服务提供者中有某一个实例宕机了,注册中心就会实时更新,告知服务调用者这个示例不可使用,防止白白访问,浪费资源。

2. 服务发现

2.1 服务注册

目前开源的注册中心框架有很多,这里使用阿里巴巴公司出品的Nacos。首先把item-service注册到Nacos(其实可能每一个微服务项目都需要注册,因为可能将来会被调用)。

注册步骤分为两步,添加依赖,进行配置

item-servicepom.xml中添加依赖:

<!--nacos 服务注册发现-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

item-serviceapplication.yml中添加nacos地址配置,nocos地址改为自己的ip地址。

spring:application:name: item-service # 服务名称cloud:nacos:server-addr: 192.168.150.101:8848 # nacos地址

完成上述两步之后,就相当于已经注册好了。 

2.2 服务发现

在服务调用者的模块中也要进行上述两步配置。

然后,服务调用者cart-service就可以去订阅item-service服务了。

服务发现需要用到一个工具,DiscoveryClient,SpringCloud已经帮我们自动装配,我们可以直接注入使用:

然后对原来的远程调用进行修改,将写死的ip和端口改为方法调用来获取:

四、OpenFeign

我们发现修改之后的代码,从一行变成了九行,使用RestTemplate实现服务的远程调用增加了代码的复杂度。为了简化代码,就需要用到OpenFeign组件了。

1.1 首先在购物车微服务模块中引入OpenFeign的依赖和loadBalancer依赖:

  <!--openFeign--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!--负载均衡器--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>

1.2 在购物车启动类中上添加注解,启动OpenFeign功能:

1.3 编写OpenFeign客户端:

在模块中,定义一个新的接口,编写Feign客户端,这里是定义了一个商品模块的客户端。

package com.hmall.cart.client;import com.hmall.cart.domain.dto.ItemDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;import java.util.List;@FeignClient("item-service")
public interface ItemClient {@GetMapping("/items")List<ItemDTO> queryItemByIds(@RequestParam("ids") Collection<Long> ids);
}

1.4 使用FeignClient:

首先在代码中注入ItemClient,然后直接调用ItemClient中的方法。这里我理解的是购物车模块通过客户端调用该方法,就相当于在浏览器中直接访问ip(这里不是通过浏览器,而是通过Nacos),然后商品模块中的相应方法就会执行,查询数据库之后将结果进行返回。

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

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

相关文章

Deep Multi-scale Convolutional Neural Network for Dynamic Scene Deblurring 论文阅读

用于动态场景去模糊的深度多尺度卷积神经网络 摘要 针对一般动态场景的非均匀盲去模糊是一个具有挑战性的计算机视觉问题&#xff0c;因为模糊不仅来源于多个物体运动&#xff0c;还来源于相机抖动和场景深度变化。为了去除这些复杂的运动模糊&#xff0c;传统的基于能量优化的…

PDF 拆分合并PDFSam:开源免费 多文件合并 + 按页码拆分 本地处理

各位打工人和学生党们&#xff0c;你知道吗&#xff0c;处理PDF文件简直是咱们的日常噩梦啊&#xff0c;尤其是遇到要合并好几个文件&#xff0c;或者从中抠几页出来的时候&#xff0c;简直头大如斗&#xff01;今天给你们安利一个神仙工具&#xff0c;PDFSam&#xff0c;听我的…

AI产品经理面试宝典第32天:AI+工业场景落地核心问题与应答策略

一、AI+工业落地价值怎么答? 面试官:AI在工业领域能创造哪些核心价值?请用具体案例说明 你的回答: AI在工业领域创造价值的底层逻辑是"数据闭环"。以阿里云ET工业大脑为例,通过采集生产线3000+传感器数据,构建出影响良品率的60个关键变量模型。当数据流经AI…

【09】MFC入门到精通——MFC 属性页对话框的 CPropertyPage类 和 CPropertySheet 类

文章目录九、属性页对话框的类CPropertyPage类 和 CPropertySheet 类。9.1 CPropertyPage 类&#xff08;1&#xff09;构造函数&#xff08;2&#xff09;CancelToClose()函数&#xff08;3&#xff09;SetModified()函数&#xff08;4&#xff09;可重载函数9.2 CPropertyShe…

Python学习笔记4

时间:2025.7.18学习内容&#xff1a;【语法基础】if判断、比较运算符与逻辑运算符一、if判断if判断基本格式&#xff1a;if要判断的条件&#xff0c;条件成立时要做的事情注意&#xff1a;input内默认存储的是字符串age17 if age<18:print(未成年不能上网) scoreinput(你的成…

20250718-2-Kubernetes 应用程序生命周期管理-Pod对象:基本概念(豌豆荚)_笔记

二、Kubernetes应用程序生命周期管理&#xfeff;1. 课程内容概述主要内容&#xff1a;Pod资源共享实现机制管理命令应用自修复&#xff08;重启策略健康检查&#xff09;环境变量Init container静态Pod2. Pod对象介绍&#xfeff;1&#xff09;Pod基本概念&#xfeff;&#x…

为Notepad++插上JSON格式化的翅膀

文章目录概要安装步骤效果展示概要 JSMinNPP.dll 是一个 Notepad 插件&#xff0c;用于压缩 JavaScript 代码和格式化JSON字符床。以下是安装和使用的详细步骤&#xff1a; 安装步骤 下载 JSMinNPP.dll 插件 https://pan.quark.cn/s/73dd0ac225be 放置 DLL 文件 打开 Notepa…

STM32-第七节-TIM定时器-3(输入捕获)

一、简介&#xff1a;1.名称&#xff1a;IC&#xff0c;输入捕获2.电路&#xff1a;如图为通用定时器框图&#xff0c;下半部分的左半模块&#xff0c;与输出比较部分共用捕获/比较寄存器与引脚。3.功能&#xff1a;当通道输入引脚出现电平跳变时&#xff0c;当前CNT的值&#…

Console 纳管 Elasticsearch 9(二):日志监控

前面介绍过 INFINI Console 纳管 Elasticsearch 9&#xff08;一&#xff09;&#xff0c;进行指标监控、数据管理、DSL 语句执行&#xff0c;但日志监控功能需要结合 Agent 才能使用。现在来实现一下&#xff1a; Agent 需要和 ES 部署到同一机器上&#xff0c;这里是在我本地…

实训十——路由器与TCP/IP模型

补充拓扑图&#xff08;交换机串联通信&#xff09;电脑A——交换机S1——交换机S2——电脑B问&#xff1a;A和B如何通信&#xff1f;首先A会将通信的数据封装好&#xff0c;将源端口、目标端口&#xff0c;源地址、目标地址&#xff0c;源MAC、目标MAC封装起来&#xff0c;但是…

【Android】ViewBinding(视图绑定)

一、什么是ViewBindingViewBinding是Android Studio 3.6推出的新特性&#xff0c;旨在替代findViewById(内部实现还是使用findViewById)。通过ViewBinding&#xff0c;可以更轻松地编写可与视图交互的代码。在模块中启用ViewBinding之后&#xff0c;系统会为该模块中的每个 XML…

泛型与类型安全深度解析及响应式API实战

一、泛型通配符&#xff1a;灵活与安全的平衡术 在Java动物收容所系统中&#xff0c;我们常需要处理不同动物类型的集合。通过泛型通配符&#xff0c;可以构建更灵活的API&#xff1a; class Shelter<T extends Animal> {private List<T> animals new ArrayList&l…

Cookie 与 Session概述

在 Web 开发中&#xff0c;会话跟踪是一个核心问题。HTTP 协议是无状态的&#xff0c;这意味着服务器无法直接记住客户端的状态。而 Cookie 和 Session 技术的出现&#xff0c;正是为了解决这一难题。一、Cookie概述Cookie&#xff0c;翻译成中文是小甜点、小饼干的意思。在 HT…

阿里云alicloud liunux3-安装docker

你这个错误&#xff1a;Curl error (35): SSL connect error for https://download.docker.com/linux/centos/8/x86_64/stable/... Error: Failed to download metadata for repo docker-ce-stable: Yum repo downloading error说明你的机器访问 download.docker.com 的 HTTPS …

【世纪龙科技】汽车故障诊断与排除仿真教学软件

在汽车产业智能化、电动化转型加速的今天&#xff0c;汽车维修行业对技术人才的要求已从传统经验型向“理论实践数字化”复合型转变。然而&#xff0c;实车实训成本高、安全隐患大、教学场景受限等问题&#xff0c;始终制约着职业教育的高质量发展。江苏世纪龙科技有限公司立足…

柴油机活塞cad【4张】三维图+设计说明书

1015柴油机活塞结构设计及温度场分析 摘 要 随着科研的进步&#xff0c;内燃机技术得到了快速的发展&#xff0c;低排放高效率的内燃机的发展成为内燃机发展的主要趋势&#xff0c;活塞作为内燃机的主要组成部件&#xff0c;在内燃机中扮演着至关重要的作用。活塞在内燃机中始终…

雪豹大模型驱动效率革命 华鼎冷链科技重构餐饮供应链神经网络

当餐饮行业的开店率高达67.5%、闭店率达61.2%时&#xff0c;供应链该如何进行革新与升级&#xff1f; 在郑州盛大启幕的第三届中国火锅烧烤领潮峰会上&#xff0c;华鼎冷链科技CEO王君以“AI驱动智慧供应链赋能餐饮行业新升级”为主题分享时称&#xff0c;当前餐饮行业高闭店率…

汽车功能安全 -- TC3xx外部看门狗

之前聊过TC3xx SMU关于内部看门狗&#xff08;CPU Watchdog 和Safety Watchdog&#xff09;Alarm的处理方法。 汽车功能安全--TC3xx SMU之看门狗alarm处理 在里面我们提到了这些Alarm关联的功能安全机制&#xff1a; SM[HW]:SCU:ENDINIT_WATCHDOG SM[HW]:SCU:SAFETY_WATCHD…

如何为“地方升学导向型”语校建模?Prompt 框架下的宇都宫日建工科专门学校解析(7 / 500)

如何为“地方升学导向型”语校建模&#xff1f;Prompt 框架下的宇都宫日建工科专门学校解析&#xff08;7 / 500&#xff09; 系列说明 500 所日本语言学校结构化建模实战&#xff0c;第 7 篇。每篇拆解 1 所学校在 Prompt-QA 系统中的建模策略&#xff0c;分享工程经验&#x…

Flutter 入门指南:从基础到实战

介绍 Flutter Flutter 是 Google 开发的开源移动应用软件开发工具包&#xff08;SDK&#xff09;&#xff0c;用于快速在 iOS 和 Android 上构建高质量的原生界面。Flutter 的一大特点是其跨平台功能&#xff0c;让开发者能够使用同一套代码基础为两个平台构建应用。这一点通过…