微服务 01

微服务是一种软件架构风格,它是以专注于单一职责的很多小型项目为基础,组合出复杂的大型应用。 (对应的是单体架构风格)

一、认识微服务

1、单体架构

单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署

优:架构简单、部署成本低

缺:团队协作成本高、系统发布效率低、系统可用性差

2、微服务

微服务架构:是服务化思想指导下的一套最佳实践架构方案。服务化,就是把单体架构中的功能模块拆分为多个独立项目。 

3、SpringCloud

SpringCloud集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验。

二、微服务拆分

1、服务拆分原则

什么时候拆分:

        创业型项目:先采用单体架构,快速开发,快速试错。随着规模扩大,逐渐拆分。

        确定的大型项目:资金充足,目标明确,可以直接选择微服务架构,避免后续拆分的麻烦。

怎么拆分:

        高内聚:每个微服务的职责要尽量单一,包含的业务相互关联度高、完整度高。

        低耦合:每个微服务的功能要相对独立,尽量减少对其他微服务的依赖。

拆分方式:

        纵向拆分:按照业务模块来拆分。

        横向拆分:抽取公共服务,提高复用性。

2、拆分服务

工程结构有两种:独立Project(多个项目) 和 maven聚合(一个项目多个模块)

远程调用

Spring给我们提供了一个RestTemplate的API,可以方便的实现Http请求的发送。使用步骤如下:

        ①注入Rest Template到Spring容器 (项目中写到启动类了)

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

        ②发起远程调用

  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, ",")));

三、服务注册和发现

1、注册中心原理

 

服务提供者通过心跳机制向注册中心报告自己的健康状况,当心跳异常时注册中心会将异常服务剔除,并通知订阅了该服务的消费者。

 

2、Nacos注册中心

基于Docker来部署Nacos的注册中心,首先我们要准备MySQL数据库表,用来存储Nacos的数据。由于是Docker部署,所以需要将资料中的SQL文件导入到Docker中的MySQL容器中。

然后,找到课前资料下的nacos文件夹其中的nacos/custom.env文件中,有一个MYSQL_SERVICE_HOST也就是mysql地址,需要修改为你自己的虚拟机IP地址

然后,将课前资料中的nacos目录上传至虚拟机的/root目录。

进入root目录,然后执行下面的docker命令:

docker run -d \
--name nacos \
--env-file ./nacos/custom.env \
-p 8848:8848 \
-p 9848:9848 \
-p 9849:9849 \
--restart=always \
nacos/nacos-server:v2.1.0-slim

启动完成后,访问下面地址:http://192.168.100.128:8848/nacos/,注意将192.168.100.128替换为你自己的虚拟机IP地址。

首次访问会跳转到登录页,账号密码都是nacos

3、服务注册

①在item-servicepom.xml中添加依赖:

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

 ②在item-serviceapplication.yml中添加nacos地址配置:

spring:application:name: cart-service  #微服务名称cloud:nacos:server-addr: 192.168.100.128:8848 # nacos地址

4、服务发现

①我们在cart-service中的pom.xml中添加下面的依赖:

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

这里Nacos的依赖于服务注册时一致,这个依赖中同时包含了服务注册和发现的功能。因为任何一个微服务都可以调用别人,也可以被别人调用,即可以是调用者,也可以是提供者。 

 ②在cart-serviceapplication.yml中添加nacos地址配置:

spring:cloud:nacos:server-addr: 192.168.150.101:8848

 ③服务发现

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

private final DiscoveryClient discoveryClient;
// 2.查询商品//2.1 根据服务名称获取服务的实例列表List<ServiceInstance> instances = discoveryClient.getInstances("item-service");//获取实例,填写服务的名称if(CollUtils.isEmpty(instances)){//判断是否为空return;}//2.2 手写负载均衡,从实例列表中挑选实例ServiceInstance instance = instances.get(RandomUtil.randomInt(instances.size()));//随机使用实例instance.getUri();//2.3 利用restTemplate发起http请求,得到http的响应ResponseEntity<List<ItemDTO>> response = restTemplate.exchange(instance.getUri()+"/items?ids={ids}",  //修改这里HttpMethod.GET,null,new ParameterizedTypeReference<List<ItemDTO>>() {},Map.of("ids", CollUtil.join(itemIds, ",")));

四、OpenFeign

1、快速入门

OpenFeign是一个声明式的http客户端,是SpringCloud在Eureka公司开源的Feign基础上改造而来。其作用就是基于SpringMVC的常见注解,帮我们优雅的实现http请求的发送。

①引入依赖,包括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>

②通过@EnableFeignClients注解,启动OpenFeign功能

        在启动类上添加@EnableFeignClients注解( basePackages = "com.hmall.api.client")

③在cart-service中,定义一个新的接口,编写Feign客户端:(代替前面写的复杂的代码)

@FeignClient("item-service") //根据服务名称,去拉取实例列表
public interface ItemClient {@GetMapping("/items")List<ItemDTO> queryItemByIds(@RequestParam("ids") Collection<Long> ids);
}

④使用FeignClient,实现远程调用

private final ItemClient itemClient;List<ItemDTO> items = itemClient.queryItemByIds(itemIds);

2、连接池

Feign底层发起http请求,依赖于其它的框架。其底层支持的http客户端实现包括:

  • HttpURLConnection:默认实现,不支持连接池

  • Apache HttpClient :支持连接池

  • OKHttp:支持连接池

因此我们通常会使用带有连接池的客户端来代替默认的HttpURLConnection。比如,我们使用OK Http.

①在cart-servicepom.xml中引入依赖:

<!--OK http 的依赖 -->
<dependency><groupId>io.github.openfeign</groupId><artifactId>feign-okhttp</artifactId>
</dependency>

 在cart-serviceapplication.yml配置文件中开启Feign的连接池功能:

feign:okhttp:enabled: true # 开启OKHttp功能

3、最佳实践

  • 思路1:抽取到微服务之外的公共module

  • 思路2:每个微服务自己抽取一个module

  • 方案1抽取更加简单,工程结构也比较清晰,但缺点是整个项目耦合度偏高。

    方案2抽取相对麻烦,工程结构相对更复杂,但服务之间耦合度降低。

    由于item-service已经创建好,无法继续拆分,因此这里我们采用方案1将itemClient接口抽取到hm-api模块中。

定义的FeignClient不存在SpringBootApplication的扫描包范围时,这些FeignClient无法使用。解决方案:

①在启动类的注解EnablefeignClients上指定FeignClient所在包

@EnableFeignClients(basePackages = "com.hmall.api.client")

②指定FeignClient字节码

@EnableFeignClients(clients = {ItemClient.class})

4、日志

OpenFeign只会在FeignClient所在包的日志级别为DEBUG时,才会输出日志。而且其日志级别有4级:

  • NONE:不记录任何日志信息,这是默认值。

  • BASIC:仅记录请求的方法,URL以及响应状态码和执行时间

  • HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息

  • FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。

Feign默认的日志级别就是NONE,所以默认我们看不到请求日志。

在hm-api模块下新建一个配置类,定义Feign的日志级别:

public class DefaultFeignConfig {@Beanpublic Logger.Level feignLogLevel(){return Logger.Level.FULL;}
}

接下来,要让日志级别生效,还需要配置这个类。有两种方式:

  • 局部生效:在某个FeignClient中配置,只对当前FeignClient生效。

@FeignClient(value = "item-service", configuration = DefaultFeignConfig.class)
  • 全局生效:在@EnableFeignClients中配置,针对所有FeignClient生效。

@EnableFeignClients(defaultConfiguration = DefaultFeignConfig.class)

一般去情况下不开启日志。

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

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

相关文章

20250726让荣品的PRO-RK3566开发板使用TF卡启动

20250726让荣品的PRO-RK3566开发板使用TF卡启动 2025/7/26 8:58缘起&#xff1a;需要升级 荣品的PRO-RK3566核心板的 底板上的FPGA程序。 由于没有使用RK809的电量计功能&#xff0c;板子一上电就会被关机&#xff01;^_于是给生产线制作了一张TF卡/启动卡&#xff0c;插到底板…

Selenium使用指南

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 概述selenium是网页应用中最流行的自动化测试工具&#xff0c;可以用来做自动化测试或者浏览器爬虫等。官网地址为&#xff1a;相对于另外一款web自动化测试工具QT…

[机缘参悟-235]:通过AI人工升级网络的工作方式和特征理解人的思维方式

AI人工神经网络通过模拟生物神经元连接机制、构建层级化特征提取结构&#xff0c;并结合数据驱动的学习方式&#xff0c;为理解人类思维方式提供了技术参照框架&#xff0c;但其本质仍是基于统计的模式匹配&#xff0c;与人类意识层面的思维存在根本差异。以下从其工作方式、基…

【C#补全计划:类和对象(七)—— 重写虚方法】

一、virtual和override1. 问题引入&#xff1a;使用里氏替换原则时&#xff0c;使用父类容器装载子类对象&#xff0c;若不使用virtual和override而是使用new&#xff0c;当子类调用两个类共有的方法时&#xff0c;调用的是父类的方法而不是子类的方法&#xff1a;using System…

TCPIP之常用协议

一、TCPIP之网络支撑协议 1.ARP ARP是网络层协议&#xff0c;在同一广播域内&#xff0c;将IP地址解析成MAC地址. 1.1 无故ARP 请求型无故ARP 设备在网络中不管是自动获取ip地址还是手动配置ip地址&#xff0c;设备都会发送请求型无故ARP检查这个ip地址是否有重复的。 应…

网络之路24:VLAN基础实验

正文共&#xff1a;2345 字 18 图&#xff0c;预估阅读时间&#xff1a;3 分钟目录网络之路第一章&#xff1a;Windows系统中的网络0、序言1、Windows系统中的网络 1.1、桌面中的网卡 1.2、命令行中的网卡 1.3、路由表 1.4、家用路由器网络之路第二章&#xff1a;认识企业设备2…

基于Verilog的神经网络加速器设计

本设计实现了一个高效的神经网络加速器,专注于卷积神经网络(CNN)的核心计算功能。该设计具有以下创新点: 并行处理架构:同时处理多个卷积窗口,提高计算吞吐量 动态权重加载:支持运行时更新卷积核权重 流水线优化:卷积、激活、池化三级流水线设计 可配置参数:支持不同尺寸…

基于springboot的零食商城的设计与实现/零食销售系统的设计与实现

用户&#xff1a;注册&#xff0c;登录&#xff0c;商品信息&#xff0c;团购商品&#xff0c;公告资讯&#xff0c;后台管理&#xff0c;在线客服&#xff0c;购物车&#xff0c;个人中心管理员&#xff1a;登录&#xff0c;个人中心&#xff0c;用户管理&#xff0c;商品类型…

《剑指offer》-算法篇-位运算

题目二进制中“1”的个数代码实现二进制中“1”的个数题目描述&#xff1a;输入一个整数&#xff0c;输出该数二进制表示中1的个数。其中负数用补码表示。思路&#xff1a;求“1”的个数等价于求n-1与n进行“与”运算后不等于0所需要的运算次数。注意&#xff1a;这里的整数可能…

项目上线中的跨域问题

本文将深入解析跨域问题的本质&#xff0c;并提供实用的解决方案。引言 跨域问题可以说是前端开发者的"老朋友"了&#xff0c;特别是在项目从开发环境迁移到生产环境时&#xff0c;这个问题更是频繁出现。许多开发者对跨域的理解停留在表面&#xff0c;导致在项目上线…

dubbo应用之3.0新特性(响应式编程)(2)

一、介绍 Dubbo 3.0 的响应式编程基于 Triple 协议和 Reactor/RxJava 实现,支持全链路异步非阻塞通信。它通过引入 Mono、Flux 等响应式类型,打通跨进程的数据流式传输,天然支持反压、限流等控制能力。相比传统基于 CompletableFuture 的异步方式,响应式编程更适用于高并发…

力扣-22.括号生成

题目链接 22.括号生成 class Solution {List<String> res new ArrayList<>();StringBuilder path new StringBuilder();void backtracking(int n, int left, int right) {if (left right 2 * n) {res.add(path.toString());return;}if (left < n) {path.a…

架构实战——互联网架构模板(“网络层”技术)

目录 一、负载均衡 1.1、DNS 1.1.1、DNS 负载均衡的优点 1.1.2、DNS 负载均衡的缺点 1.2、Nginx 、LVS 、F5 1.2.1、软件和硬件的区别 1.2.2、4 层和 7 层的区别 二、CDN 三、多机房 3.1、同城多机房 3.2、跨城多机房 3.3、跨国多机房 四、多中心 本文来源:极客时间vip课程笔记…

TCP/IP 网络编程面试题及解答

在Qt/C面试中&#xff0c;若涉及“熟悉TCP/IP网络编程”&#xff0c;面试官通常会结合TCP/IP协议基础、Qt网络编程框架&#xff08;如Qt Network模块&#xff09;、C网络编程实现以及实际场景问题来提问。以下是常见面试题及解答&#xff1a; 一、TCP/IP协议基础 1. TCP和UDP的…

unity开发中Hash、Queue、LinkedList简单介绍

在Unity游戏开发中&#xff0c;除了Dictionary和List外&#xff0c;以下三种数据结构能高效解决特定问题场景&#xff1a;1. HashSet<T>&#xff1a;闪电级存在性检查 核心特点&#xff1a;基于哈希表实现的高效集合&#xff0c;元素唯一且无视顺序 优势&#xff1a; O(1…

智慧园区:科技与生活的完美融合

在城市的喧嚣中&#xff0c;我们常常渴望一片宁静而充满活力的绿洲。如今&#xff0c;随着科技的飞速发展&#xff0c;智慧园区应运而生&#xff0c;它不仅满足了我们对美好生活的向往&#xff0c;更以其独特的魅力&#xff0c;成为现代城市中一道亮丽的风景线。今天&#xff0…

继续打卡day6

383. 赎金信 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:bool canConstruct(string ransomNote, string magazine) {unordered_map<char, int> us;for(auto c: ransomNote){us[c]; // 将字符串存储}for(auto c: magazine){if(us.count(c)){us[c]-…

LIMA:大语言模型对齐的“少即是多”革命——原理、实验与范式重构

“千样本激活千亿参数&#xff1a;重新定义大模型对齐的本质” LIMA&#xff08;Less Is More for Alignment&#xff09; 是由 Meta AI 联合 卡内基梅隆大学 等机构于 2023年 提出的突破性大模型对齐框架&#xff0c;其核心颠覆了传统对齐需海量数据的认知&#xff0c;证明仅用…

vite.config.js常用配置

vite.config.js常用配置 import { defineConfig } from vite import { resolve } from "path"; import vue from vitejs/plugin-vueexport default defineConfig({plugins: [vue(), ], // 配置需要使用的插件列表base: ./, // 在生产中服务时的基本公共路径publicD…

JVM知识点(2)

目录 Java中可作为GC Roots的引用有哪几种&#xff1f; finalize方法 垃圾回收算法 标记-清除 标记-复制 标记-整理 分代收集算法 为什么要用分代收集 标记复制的标记过程和复制会不会停顿 MinorGC&#xff0c;MajorGC&#xff0c;MixedGC&#xff0c;FullGC FullGC…