微服务思想以及实现
文章目录
- 前言
- 一、什么时候需要拆分微服务
- 1. 创业型项目
- 2. 大型项目
- 二、怎么拆
- 1. 拆分目标
- 2. 拆分方式
- 三、微服务之间远程调用
- 1. 实现方式
- 2. 手动发送Http请求(RestTemplate)
- 3. 服务注册中心
- 3.1 原理
- 3.2 Nacos注册中心
- 3.3 服务注册
- 3.4 服务发现(DiscoveryClient)
- 4. OpenFeign
- 4.1 实现步骤
- 4.2 连接池
- 5. 抽取Fegin客户端
- 实现方式
- 6. 日志
- 6.1 级别
- 6.2 实现步骤
前言
什么时候去拆分微服务?怎么拆分?拆分后微服务项目之间的业务怎么调用?
一、什么时候需要拆分微服务
1. 创业型项目
如果是创业型公司,最好先用单体架构快速迭代开发,验证市场运作模型,快速试错。当业务跑通以后,随着业务规模扩大、人员规模增加,再考虑拆分微服务。
2. 大型项目
如果是大型企业,有充足的资源,可以在项目开始之初就搭建微服务架构。
二、怎么拆
1. 拆分目标
- 高内聚:每个微服务的职责要尽量单一,包含的业务相互关联度高、完整度高。
- 低耦合:每个微服务的功能要相对独立,尽量减少对其它微服务的依赖。
2. 拆分方式
- 纵向拆分:按照业务模块来拆分
- 横向拆分:抽取公共服务,提高复用性
三、微服务之间远程调用
1. 实现方式
- 基于Http协议(不关心服务提供者的具体技术实现,只要对外暴露Http接口即可,更符合微服务的需要)
- 基于Dubbo协议
2. 手动发送Http请求(RestTemplate)
Java发送http请求可以使用Spring提供的RestTemplate
实现步骤:
1、注入RestTemplate到Spring容器
@Bean
public RestTemplate restTemplate(){return new RestTemplate();
}
2、发起远程调用
// 利用RestTemplate发起http请求,得到http的响应
ResponseEntity<List<ItemDTO>> response = restTemplate.exchange("http://localhost:8081/items?ids={ids}",HttpMethod.GET,null,new ParameterizedTypeReference<List<ItemDTO>>() {},Map.of("ids", CollUtil.join(itemIds, ","))
);
3. 服务注册中心
问题引入:微服务项目a(服务提供者)多实例部署,每个实例其IP或端口不同,当微服务项目b(服务消费者)要远程调用a时不知道调用哪个。
3.1 原理

三个角色
服务提供者:暴露服务接口,供其它服务调用
服务消费者:调用其它服务提供的接口
注册中心:记录并监控微服务各实例状态,推送服务变更信息
流程
- 服务启动时就会注册自己的服务信息(服务名、IP、端口)到注册中心
- 调用者可以从注册中心订阅想要的服务,获取服务对应的实例列表(1个服务可能多实例部署)
- 调用者自己对实例列表负载均衡,挑选一个实例
- 调用者向该实例发起远程调用
服务状态变更
服务提供者通过心跳机制向注册中心报告自己的健康状态,当心跳异常时注册中心会将异常服务剔除,并通知订阅了该服务的消费者
3.2 Nacos注册中心
Alibaba公司出品,目前被集成在SpringCloudAlibaba中
基于Docker来部署Nacos的注册中心
(1)准备nacos.sql数据库表,并导入到sql客户端
(2)再将sql文件导入到Docker中的MySQL容器中
3.3 服务注册
1、引入依赖
<!--nacos 服务注册发现--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>
2、配置Nacos地址
spring:application:name: item-service # 服务名称cloud:nacos:server-addr: 192.168.xxx.xxx:xxx # nacos地址
3、启动服务实例

3.4 服务发现(DiscoveryClient)
服务的消费者要去nacos订阅服务,这个过程就是服务发现。
步骤(步骤1、2和前面一样)
1、引入依赖
2、配置Nacos地址
3、发现并调用服务
DiscoveryClient,SpringCloud已经自动装配,只要注入就好。

4. OpenFeign
问题引入:利用RestTemplate实现了服务的远程调用,代码复杂。如何让远程调用像本地方法调用一样简单
概念:声明式的http客户端,利用SpringMVC的常见注解,基于动态代理生成远程调用的代码,而无需手动再编写,非常方便。
4.1 实现步骤
1、引入依赖,包括OpenFeign和负载均衡组件SpringCloudLoadBalancer
<!--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>
2、在启动类中添加@EnableFeignClients注解,启用OpenFeign功能
@EnableFeignClients(basePackages = "com.hmall.api.client", defaultConfiguration = DefaultFeignConfig.class)
//basePackages = "com.hmall.api.client"因为是把微服务项目业务抽取到hm-api这个模块中,要调用这个模块中的方法,需要扫描到这个包下,并在FeignClient中药声明服务名称
@MapperScan("com.hmall.cart.mapper")
@SpringBootApplication
public class CartApplication {public static void main(String[] args) {SpringApplication.run(CartApplication.class, args);}
}
3、声明接口,无需实现方法,在接口上添加FeignClient注解
@FeignClient("item-service") //声明服务名称
public interface ItemClient {@GetMapping("/items") //声明请求方式、请求路径List<ItemDTO> queryItemByIds(@RequestParam("ids") Collection<Long> ids);
}
4、使用FeignClient,实现远程调用
List<ItemDTO> items = itemClient.queryItemByIds(List.of(1,2,3))
4.2 连接池
Feign底层发起http请求,依赖于其它的框架。其底层支持的http客户端实现包括:
- HttpURLConnection:默认实现,不支持连接池
- Apache HttpClient :支持连接池
- OKHttp:支持连接池
使用OKHttp步骤
1、引入依赖
<!--OK http 的依赖 -->
<dependency><groupId>io.github.openfeign</groupId><artifactId>feign-okhttp</artifactId>
</dependency>
2、开启连接池
feign:okhttp:enabled: true # 开启OKHttp功能
5. 抽取Fegin客户端
问题引入:微服务项目之间的调用复杂,不同的微服务项目调用同一个微服务项目,会出现代码重复的问题。
实现方式
- 思路1:抽取到微服务之外的公共module。结构清晰但耦合度偏高
- 思路2:每个微服务自己抽取一个module。结构复杂但耦合度低

具体代码实现参考黑马微服务开发https://www.bilibili.com/video/BV1S142197x7?p=64&vd_source=d7aecc6c1f43adaae25fcb7e1a25fec2
6. 日志
FeignClient所在包的日志级别为DEBUG时,才会输出日志
6.1 级别
- NONE:不记录任何日志信息,这是默认值。
- BASIC:仅记录请求的方法,URL以及响应状态码和执行时间
- HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息
- FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。
6.2 实现步骤
1、在抽取各个微服务通用业务的hm-api模块下新建一个配置类
package com.hmall.api.config;
import feign.Logger;
import org.springframework.context.annotation.Bean;
public class DefaultFeignConfig {@Beanpublic Logger.Level feignLogLevel(){return Logger.Level.FULL;}
}
2、配置,让日志级别生效
局部配置:在某个FeignClient中配置,只对当前FeignClient生效
@FeignClient(value = "item-service", configuration = DefaultFeignConfig.class)
全局配置:在@EnableFeignClients中配置,针对所有FeignClient生效
@EnableFeignClients(defaultConfiguration = DefaultFeignConfig.class)
相关文章:
微服务思想以及实现
文章目录 前言一、什么时候需要拆分微服务1. 创业型项目2. 大型项目 二、怎么拆1. 拆分目标2. 拆分方式 三、微服务之间远程调用1. 实现方式2. 手动发送Http请求(RestTemplate)3. 服务注册中心3.1 原理3.2 Nacos注册中心3.3 服务注册3.4 服务发现(Discov…...
C语法:格式符号%f和%lf引发的错误
今天编程时有如下代码: #include"stdio.h"int main(void) {double profit;double bonus;printf("请输入本月利润\n");scanf("%f",&profit);//错误:此行profit是double类型,格式符为%f,当输入8时࿰…...
Java基础入门day48
day48 JDBC调用关系 tomcat 简介 tomcat是Apache下的一个核心项目,免费开源,支持servlet和jsp。 tomcat技术先进,性能稳定,目前比较流行的web应用服务器 安装 官网: Apache Tomcat - Welcome! 下载 tomcat8.5 解压&a…...
C++笔记(体系结构与内核分析)
1.OOP面向对象编程 vs. GP泛型编程 OOP将data和method放在一起,目的是通过封装、继承、多态提高软件的可维护性和可扩展性GP将data和method分开,可以将任何容器与任何算法结合使用,只要容器满足塞饭所需的迭代器类型 2.算法与仿函数的区别 …...
c++ 唤醒指定线程
在C中,直接唤醒一个特定的线程并不像在Java的Thread类中有interrupt()方法或者某些操作系统特定的API(如POSIX的pthread_cond_signal或Windows的SetEvent)那样简单。C标准库没有提供一个直接的方法来"唤醒"一个正在等待的线程。然而…...
java报错:使用mybatis plus查询一个只返回一条数据的sql,却报错返回了1000多条
今天遇到一个问题 系统线上问题,经常出现这样的问题,刚重启系统时不报错了,可是运行一段时间又会出现。sql已经写了limit 1,mybatis的debug日志也返回total为1,可是却报错返回了1805条数据 乍一看,感觉太不…...
AI图书推荐:利用生成式AI实现业务流程超自动化
《利用生成式AI实现业务流程超自动化》(Hyperautomation with Generative AI)这本书探索了广泛的用例和示例,展示了超自动化在不同行业、领域和特定部门的多样化应用, 让您熟悉UiPath、Automation Anywhere和IBM等流行工具和平台&…...
什么事防抖和节流,有什么区别,如何实现
防抖和节流,本质上是优化高频率执行代码的一种手段,比如:resize、scroll、keypress、mousemove这些事件在触发的时候,会不断调用绑定在事件上的回调函数,这样极大浪费资源,降低前端性能。 为了优化体验&am…...
PanguSync大数据量初始化脚本
由于数据库增量同步软件PanguSync初始化最大超时时间为600s,如果初始数据量很大,第一次部署时可能会超时,可以先停止任务,使用以下Sql语句进行初始化,以下语句可以分步执行,初始化完成后,后续无需再执行耗时…...
DELL T630服务器iDRAC分辨率调整办法
对于Dell T630服务器的iDRAC分辨率调整,您需要登录到iDRAC的Web界面。以下是详细的步骤: 登录iDRAC:在浏览器中输入iDRAC的IP地址,然后使用用户名(通常是“root”)和密码登录。 导航到虚拟控制台ÿ…...
您真的会高效使用 Mac 吗?
文章目录 屏幕的保养快捷键预览修改文件名查看文件属性搜索编辑复制,粘贴,剪切,撤销删除 跳转窗口屏幕截图声音Dock强制退出查字典神奇的Option键鼠标与触控板切换桌面与应用程序打开通知中心打开Mission Control 安装与卸载Mac应用程序压缩和…...
Vue11 Vue3完结撒花
shallowRef和shallowReactive shallowRef 作用:创建一个响应式数据,但只对顶层属性进行响应式处理 用法 let myVar shallowRef(initialValue)特点:只跟踪引用值变化,不关心值内部的属性变化 案例 <template><div c…...
CodeTop 高频笔试题总结(持续更新)
🏆 频率从高到低排序 👨🏫 参考的频率数据:CodeTop 👨🏫 力扣hot100 无重复字符的最长子串 双指针 滑动窗口 哈希👨🏫 力扣hot100 反转链表 指针 递归 一题多解👨…...
类和对象一(从封装开始讲述)
目录: 一.封装 二.封装扩展之包,自定义包 三.访问限定符 四.static成员 一.封装:封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行 交互。面向对象…...
LeetCode100题总结
LeetCode100题总结 前言LeetCode100题总结题型梳理双指针11. 盛最多水的容器234.回文链表75.颜色分类206.反转链表142.环形链表215.三数之和 滑动窗口3. 无重复字符的最长子串209. 长度最小的子数组438. 找到字符串中所有字母异位词 广搜102. 二叉树的层序遍历200. 岛屿数量617…...
基于截断傅里叶级数展开的抖动波形生成
1、背景 抖动是影响信号完整性的重要因素。随着信号速率的不断提高,抖动的影响日益显著。仿真生成抖动时钟或抖动信号,对系统极限性能验证具有重要意义。抖动是定义在时域上的概念,它表征真实跳变位置(如跳边沿或过零点)与理想跳变位…...
图片标注编辑平台搭建系列教程(9)——支持撤销的画线行为
文章目录 背景渲染行为mouseDownmouseMovemouseDbclick总结背景 编辑器中的绘制,要想做的足够好,是需要支持撤销形点的,因为作业员在绘制过程中,可能会点错位置,需要及时撤销,否则影响编辑效率。撤销我们知道,需要通过ID编辑器的history的undo来实现,那么意味着,每一…...
赶紧收藏!2024 年最常见 100道 Java 基础面试题(四十一)
上一篇地址:赶紧收藏!2024 年最常见 100道 Java 基础面试题(四十)-CSDN博客 八十一、tcp为什么要三次握手,两次不行吗?为什么? TCP(传输控制协议)使用三次握手…...
使用自关联方法处理多表关系
使用自关联方法处理多表关系 这里通过省市区之间的关系来解释自关联的情况 在设置地址的过程中 , 不可避免的需要设置 , 省份 ,市以及区 而省市区三者之间的具有一定的关联关系 一个省份对应多个市 一个市对应多个区 如果通过设置主表从表关系则需要设置三张标分别对应省…...
annaconda详细解读换源文件
annaconda换源详细解读文件 annaconda换源详细解读文件 annaconda换源详细解读文件 #踩坑/annaconda换源详细解读通道问题 如何准确使用国内源高效安装GPU版本的Pytorch - 知乎 文件中的custom通道,需要自己手动添加到默认通道里面,记得后面更上/包名…...
AI辅助前端设计:让快马平台生成酷炫的滚动视差与3D交互效果代码
AI辅助前端设计:让快马平台生成酷炫的滚动视差与3D交互效果代码 最近在做一个科技公司的产品介绍页,想实现一些炫酷的交互效果来提升用户体验。传统方式需要手动编写大量CSS和JavaScript代码,调试起来也很耗时。不过现在有了AI辅助开发工具&…...
忍者像素绘卷参数详解:CFG/Steps/画幅三要素调优指南
忍者像素绘卷参数详解:CFG/Steps/画幅三要素调优指南 1. 认识忍者像素绘卷 忍者像素绘卷是一款基于Z-Image-Turbo深度优化的图像生成工作站,它将忍者的热血意志与16-Bit复古游戏美学完美融合。这款工具采用明亮的"云端"视觉设计,…...
ide-eval-resetter:突破JetBrains IDE试用期限制的创新方案——2026开发者必备指南
ide-eval-resetter:突破JetBrains IDE试用期限制的创新方案——2026开发者必备指南 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter 问题引入:JetBrains IDE试用期限制的痛点分析 作为开发…...
Git从入门到精通:完整学习路线图,全面详细一次过
Git超详细使用教程:从入门到高级(全面详解|目录结构|口语化专业双轨|长文警告) ⚠️ 长文警告:全文共 6218 字,覆盖 Git 全生命周期操作,含 18 个核心章节、7 张结构化对…...
IntelliJ IDEA 2026.1 版本发布,多维度升级助力开发体验
AI 能力拓展:内置多 Agent 提升开发效率IntelliJ IDEA 2026.1 版本在 AI 方面有显著升级,内置支持更多 AI agent,如 Codex、Cursor 以及任何兼容 ACP 的 agent。ACP Registry 实现了一键浏览和安装 AI agent,方便开发者快速引入所…...
DeTikZify:AI驱动的科研图表代码自动化解决方案
DeTikZify:AI驱动的科研图表代码自动化解决方案 【免费下载链接】DeTikZify Synthesizing Graphics Programs for Scientific Figures and Sketches with TikZ 项目地址: https://gitcode.com/gh_mirrors/de/DeTikZify 一、科研绘图的隐形痛点:我…...
让ai替你思考架构:描述需求,快马智能生成带rabbitmq的微服务通知系统代码
最近在做一个微服务通知系统,用到了RabbitMQ这个强大的消息队列工具。说实话,消息队列的配置和绑定关系一开始让我有点头疼,好在发现了InsCode(快马)平台的AI辅助功能,整个过程变得轻松多了。下面分享下我的实现思路和经验。 系统…...
python基于flask的学生学业质量成绩分析系统演可视化大屏 大数据
目录同行可拿货,招校园代理 ,本人源头供货商功能模块分析可视化大屏设计大数据处理架构预警与决策支持技术实现要点项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 功能模块分析 数据采…...
增程式混合动力汽车MATLAB_simulink模型(串联)整车建模包括工况选择模型、驾驶员模型(PID控制)、整车工作模式控制模型、发动机模型、电机模型、电池模型、传动系统模型、整车动力学模型。
增程式混合动力汽车MATLAB/simulink模型(串联)整车建模包括工况选择模型、驾驶员模型(PID控制)、整车工作模式控制模型、发动机模型、电机模型、电池模型、传动系统模型、整车动力学模型。 此模型比较简单,当SOC低于SO…...
手机关键词 SEO 优化与网站速度优化有什么关系_手机关键词 SEO 优化与内容营销策略有什么联系
手机关键词 SEO 优化与网站速度优化有什么关系 在当今数字化时代,网站的流量和用户体验直接影响企业的品牌价值和市场竞争力。手机关键词 SEO 优化与网站速度优化这两个看似独立的环节,实际上有着密不可分的联系。本文将详细探讨它们之间的关系…...
