一、项目架构图
项目微服务架构图
微服务划分图
二、分布式基础概念
1)微服务
微服务架构风格,就像是把一个单独的应用程序开发成一套小服务,每个小服务运行在自己的进程中,并使用轻量级机制通信,通常是 HTTP API 这些服务围绕业务能力来构建, 并通过完全自动化部署机制来独立部署,这些服务使用不同的编程语言书写,以及不同数据存储技术,并保持最低限度的集中式管理。
简而言之:拒绝大型单体应用,基于业务边界进行服务拆分,每个服务独立部署运行。
2)集群&分布式&节点
集群是个物理状态,分布式是个工作方式。
只要是一堆机器,也可以叫做集群,他不是不是一起协作干活,这谁也不知;
《分布式系统原理与范型》定义:
“分布式系统是若干独立计算机的集合,这些计算机对于用户来说像但各相关系统”
分布式系统 (distributed system) 是建立网络之上的软件系统。
分布式是指:将不同的业务分布在不同的地方。
集群指的是:将几台服务器集中在一起,实现同一业务。
例如:京东是一个分布式系统,众多业务运行在不同的机器上,所有业务构成一个大型的业务集群。每一个小的业务,比如用户系统,访问压力大的时候一台服务器是不够的,我们就应该将用户系统部署到多个服务器,也就是每个一业务系统也可以做集群化;
分布式中的每一个节点,都可以做集群。而集群并不一定就是分布式的。
节点:集群中的一个服务器
3)远程调用
在分布式系统中,各个服务可能处于不同主机,但是服务之间不可避免的需要互相调用,我们称之为远程调用。
SpringCloud 中使用 HTTP+JSON 的方式来完成远程调用
4)负载均衡
分布式系统中,A 服务需要调用 B 服务,B 服务在多台机器中都存在, A 调用任意一个服务器均可完成功能。
为了使每一个服务器都不要太或者太闲,我们可以负载均衡调用每一个服务器,提升网站的健壮性。
常见的负载均衡算法:
轮询:为第一个请求选择键康齿中的每一个后端服务器,然后按顺序往后依次选择,直到最后一个,然后循环
最小连接:优先选择链接数最少,也就是压力最小的后端服务器,在会话较长的情况下可以考虑采取这种方式
5)服务注册/发现&注册中心
A服务调用B服务,A服务并不知道B服务当前在哪几台服务器有,哪些正常的,哪些服务已经下线。解决这个问题可以引入注册中心;
如果某些服务下线,我们其他人可以实时的感知到其他服务的状态,从而避免调用不可用的服务
6)配置中心
每一个服务最终都有大量配置,并且每个服务都可能部署在多台服务器上,我们经常需要变更配置,我们可以让每个服务在配置中心获取自己的位置。
配置中心用来集中管理微服务的配置信息
7)服务熔断&服务降级
在微服务架构中,微服务之间通过网络进行通信,存在相互依赖;当其中一个服务不可用时,有可能会造成雪崩效应,要防止这种情况,必须要有容错机制来保护服务
1、服务熔断
设置服务的超时,当被调用的服务经常失败到达某个阈值,我们可以开启断路保护机制,后来的请求不再去调用这个服务,本地直接返回默认的数据
2、服务降级
在运维期间,当系统处于高峰期,系统资源紧张,我们可以让非核心业务降级运行,降级:某些服务不处理,或者简单处理【抛异常,返回NULL,调用 Mock数据,调用 FallBack 处理逻辑】
8)API网关
在微服务架构中,API Gateway 作为整体架构的重要组件,他抽象了微服务中都需要的公共功能,同时它提供了客户端负载均衡,服务自动熔断,灰度发布,统一认证,限流监控,日志统计等丰富功能,帮助我们解决很多 API 管理的难题
三、环境搭建
四、服务创建
五、SpringCloud Alibaba
1)简介
Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。
依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。
2)为什么要使用
3)SpringClouid的几大痛点
SpringCloud部分组件停止维护和更新,给开发带来不便;
SpringCloud部分环境搭建复杂,没有完善的可视化界面,我们需要大量的二次开发和定制
SpringCloud配置复杂,难以上手,部分配置差别难以区分和合理应用
4)SpringCloud Alibaba的优势
阿里使用过的组件经历了考验,性能强悍,设计合理,现在开源出来大家用
成套的产品搭配完善的可视化界面给开发运维带来极大的便利
搭建简单,学习曲线低。
5)SpringCloud Alibaba技术搭配方案
SpringCloud Alibaba - Nacos : 注册中心 (服务发现/注册)
SpringCloud Alibaba- Nacos: 配置中心 (动态配置管理)
SpringCloud - Ribbon: 负载均衡
SpringCloud - Feign: 声明式HTTP客户端(调用远程服务)
SpringCloud Alibaba - Sentinel: 服务容错(限流、降级、熔断)
SpringCloud - Gateway: API 网关 (webflux 编程模式)
SpringCloud - Sleuth:调用链监控
SpringCloud Alibaba - Seata: 原Fescar, 即分布式事务解决方案
5.1、SpringCloud Alibaba - Nacos [作为注册中心]
Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现,配置管理和服务管理平台,他是使用 java 编写的,需要依赖 java 环境
Nacos 文档地址: https://nacos.io/zh-cn/docs/quick-start.html
下载 nacos-server:https://github.com/alibaba/nacos/releases
启动 nacos-server
- cmd 运行startup.cmd 文件
- 访问localhost:8848/nacos/
- 使用默认的账号/密码: nacos/nacos 登录
1)服务注册到Nacos
1、首先,修改 ,引入nacos作为服务注册/发现中心的依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
在公共服务common的pom.xml文件中引入nacos依赖,其他微服务如果需要将服务注册到nacos,引入公共服务common依赖即可。
2、在应用的 /resource /application.properties 中配置 Nacos Server地址
服务注册中心地址:spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
3、在服务启动类上使用@EnableDiscoveryClient 开启服务注册发现功能
@SpringBootApplication
@EnableDiscoveryClient //开启服务注册发现
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
4、启动应用、观察 nacos 服务列表是否已经注册上服务
注意每一个应用都应该有名字,这样才能往册上去。修改pplicaion.propertes文件
服务注册名称:spring.application.name: 服务名(例:gulimall-order)
服务端口:server.port=8000
5、注册更多的服务上去,测试使用 feign 远程
Nacos 使用三步
1)、导包
2)、写配置,指定 nacos 地址,指定应用的名字
3)、开启服务注册发现功能 @EnableDiscoveryClient
Feign 使用三步
1)、导包 openfeign
2)、开启 @EnableFeignClients 功能
3)、编写接口,进行远程调用
5.2、SpringCloud Alibaba - Nacos [作为配置中心]
使用步骤与Nacos作为注册中心一样
pom.xml 引入 Nacos Config Starter
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
在应用的 resource 下 bootstrap.properties
spring.application.name=gulimall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
在 nacos 中添加配置:
Data ID 改成 gulimall-coupon.properties 默认规则 用户名.应用名.properties
在应用中使用@Value 和 @RefreshScope,配置中心数据更改,服务随即获得更新
@RefreshScope // 刷新对应controller
@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
@Autowired
private CouponService couponService;
@Value("${coupon.user.name}")
private String name;
@Value("${coupon.user.age}")
private Integer age;
@RequestMapping("/test")
public R test() {
return R.ok().put("name",name).put("age",age);
}
Nacos进阶
核心概念
1)、命名空间:
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 DatalD的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
2)、配置集
一组相关或者不相关的配置项的集合称为配置集。在系统中,一个配置文件通常就是一个配置集,包含了系统各个方面的配置。例如,一个配置集可能包含了数据源、线程池、日志级别等配置项。
2.1)、配置集ID:
Nacos 中的某个配置集的 ID,配置集 ID 是组织划分配置的维度之一,**Data ID** 通常用于组织划分系统的配置集,一个系统或者应用可以包含多个配置集,一个系统应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识,Data ID 通常采用类 Java 包 如 ( com.taobao.tc.refund.log.level ) 的命名规则保证全局唯一性,此命名规则非强制
2.2)、配置分组:
Nacos 中的一组配置集,是组织配置的维度之一,通过一个有意义的字符串,(如 Buy 或 Trade ) 对配置集进行分组,从而区分 Data ID 相同的配置集,当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用,DEFAULT_GROUP 配置分组的常见场景,不同的应用或组件采用了相同的配置类型,如 database_url 配置和 MQ_topic 配置
3)、bootstrap.properties 配置
```properties
spring.application.name=gulimall-coupon # 服务的名称
spring.cloud.nacos.config.server-addr=127.0.0.1:8848 # 服务注册地址
spring.cloud.nacos.config.namespace=ae34901c-9215-4409-ae61-c6b8d6c8f9b0 # 命名空间地址
#spring.cloud.nacos.config.group=111 # 对应分组
spring.cloud.nacos.config.ext-config[0].data-id=datasource.yml # 配置集指定data_id
spring.cloud.nacos.config.ext-config[0].group=dev # 配置集指定 group 分组
spring.cloud.nacos.config.ext-config[0].refresh=true #是否动态刷新在配置中心修改后,微服务自动刷新
/**
* 1、如何使用 Nacos作为配置中心统一管理配置
* 1.1 引入依赖
* <dependency>
* <groupId>com.alibaba.cloud</groupId>
* <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
* </dependency>
* 1.2 创建一个bootstrap.properties
* spring.application.name=gulimall-coupon
* spring.cloud.nacos.config.server-addr=127.0.0.1:8848
* 1.3 需要给配置中心默认添加一个叫 数据集 (Data Id) gulimall-coupon.properties 默认规则 用户名.应用名.properties
* 1.4 给 应用名.properties 添加任何配置
* 1.5 动态获取配置
* @RefreshScope: 动态获取并刷新配置
* @Value$("${配置项的名字}")
* 如果配置中心和当前应用的配置文件中都配置了相同的配置文件,优先使用配置中心的文件
*
* 2、细节
* 1、命名空间:配置隔离:
* 默认:public(保留空间);默认新增的所有配置都在 public 空间
* 1、开发 测试 生产 利用命名空间来做环境隔离
* 注意: 在bootstrap.properties配置上 需要使用哪个命名空间下的配置
* spring.cloud.nacos.config.namespace=b1e89ce0-784f-4a80-9de0-e9b080eeaca5
* 2、每一个微服务之间互相隔离配置,每一个微服务都创建自己的命名空间,只加载自己命名空间下的所有配置
*
*
* 2、配置集:所有配置的集合
*
* 3、配置集ID:类似文件名
* Data ID:类型文件名
*
* 4、配置分组:
* 默认所有的配置都属于 DEFAULT_GROUP
*
* 每个微服务创建自己的命名空间,使用配置分组区分环境,dev、test、prod
*
* 3、同时加载多个配置集
* 1、微服务任何配置信息,任何配置文件多可以放在配置中心中
* 2、只要在 bootstrap.properties 说明加载配置中心中哪些配置文件即可
* 3、@Value,@ConfigurationProperties...
* 以前SpringBoot的任何方式从配置文件中获取值,都能使用
* 配置中心有的优先使用配置中心的
* /
微服务基础总结
1、分布式基础概念
微服务、注册中心、配置中心、远程调用、Feign、网关
2、基础开发
SpringBoot2.0、SpringCloud、Mybatis-Plus、Vue组件化、阿里云对象存储
3、环境
Vagrant、Linux、Docker、MySQL、Redis、逆向工程&人人开源
4、开发规范
数据校验JSR303、全局异常处理、全局统一返回、全局跨域处理
枚举状态、业务状态码、VO与TO与PO划分、逻辑删除
Lombok:@Data、@Slf4j