ps网站怎么做超链接,做网站要学什么语言,触屏手机网站模板,网络推广最好的网站文章目录 前言一、什么时候需要拆分微服务1. 创业型项目2. 大型项目 二、怎么拆1. 拆分目标2. 拆分方式 三、微服务之间远程调用1. 实现方式2. 手动发送Http请求#xff08;RestTemplate#xff09;3. 服务注册中心3.1 原理3.2 Nacos注册中心3.3 服务注册3.4 服务发现(Discov… 文章目录 前言一、什么时候需要拆分微服务1. 创业型项目2. 大型项目 二、怎么拆1. 拆分目标2. 拆分方式 三、微服务之间远程调用1. 实现方式2. 手动发送Http请求RestTemplate3. 服务注册中心3.1 原理3.2 Nacos注册中心3.3 服务注册3.4 服务发现(DiscoveryClient) 4. OpenFeign4.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的响应
ResponseEntityListItemDTO response restTemplate.exchange(http://localhost:8081/items?ids{ids},HttpMethod.GET,null,new ParameterizedTypeReferenceListItemDTO() {},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 服务注册发现--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependency2、配置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、发现并调用服务 DiscoveryClientSpringCloud已经自动装配只要注入就好。
4. OpenFeign
问题引入利用RestTemplate实现了服务的远程调用代码复杂。如何让远程调用像本地方法调用一样简单 概念声明式的http客户端利用SpringMVC的常见注解基于动态代理生成远程调用的代码而无需手动再编写非常方便。
4.1 实现步骤
1、引入依赖包括OpenFeign和负载均衡组件SpringCloudLoadBalancer !--openFeign--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactId/dependency!--负载均衡器--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-loadbalancer/artifactId/dependency2、在启动类中添加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) //声明请求方式、请求路径ListItemDTO queryItemByIds(RequestParam(ids) CollectionLong ids);
}4、使用FeignClient,实现远程调用
ListItemDTO items itemClient.queryItemByIds(List.of(1,2,3))4.2 连接池
Feign底层发起http请求依赖于其它的框架。其底层支持的http客户端实现包括:
HttpURLConnection默认实现不支持连接池Apache HttpClient 支持连接池OKHttp支持连接池 使用OKHttp步骤 1、引入依赖
!--OK http 的依赖 --
dependencygroupIdio.github.openfeign/groupIdartifactIdfeign-okhttp/artifactId
/dependency2、开启连接池
feign:okhttp:enabled: true # 开启OKHttp功能5. 抽取Fegin客户端
问题引入微服务项目之间的调用复杂不同的微服务项目调用同一个微服务项目会出现代码重复的问题。
实现方式
思路1抽取到微服务之外的公共module。结构清晰但耦合度偏高思路2每个微服务自己抽取一个module。结构复杂但耦合度低 具体代码实现参考黑马微服务开发https://www.bilibili.com/video/BV1S142197x7?p64vd_sourced7aecc6c1f43adaae25fcb7e1a25fec2
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)