1. 单体架构
->将业务的所有功能集中在一个项目中开发,打成一个包部署
优点: 架构简单,部署成本低
缺点: 耦合度高
2.分布式架构
->根据业务功能进行系统的拆分,每隔业务模块作为独立项目开发,成为一个服务
优点:降低服务耦合,有利于升级拓展
服务拆分注意事项
1.不同的微服务,不要重复开发相同业务
2.微服务数据独立,不要访问其他微服务的数据库(一个微服务对应一个数据库)
3.微服务可以将自己的业务暴露为接口,供其他微服务调用
微服务调用方式
1.基于RestTemplate发起的http请求实现远程调用
2.http请求做远程调用是与语言无关的调用,只要直到对方的ip/端口/接口路径/请求参数就行
提供者与消费者
服务提供者 : 一次业务中,被其他微服务调用的服务。(提供接口给其他微服务)
服务消费者 : 一次业务中,调用其他微服务的服务。(调用其他微服务提供的接口)
思考
服务A调用服务B,服务B调用服务C,那么服务B是什么角色呢?
->如果是A调B这个业务,那么B就是提供者 B调用C,那么B就是消费者(一个业务既可以是提供者也可以是消费者,根据业务而定)
nacos注册中心
-
服务注册中心诞生背景? (服务多了,需要统一管理,例如所有公司需要在工商局进行备案)
-
服务注册中心的选型?(社区活跃度,稳定性,功能,性能,学习成本)
-
Nacos下载,安装(解压),配置(application.properties),启动(startup.cmd),访问(http://ip:port/nacos)
-
基于Nacos实现服务的注册?(添加依赖,服务配置,启动服务并检查)
-
基于RestTemplate实现服务的简易调用?(服务消费方调用服务提供方)
-
常见问题
如何理解服务注册中心?(存储服务信息的一个服务)
服务注册中心诞生的背景? (服务多了,需要对服务进行更好管理)
市场上常用的注册中心?(Zookeeper,Eureka,Nacos,Consul)
如何对注册中心进行选型?(社区活跃度,稳定性,功能,性能,学习成本)
Nacos 是什么?(是Alibaba公司基于SpringBoo技术实现的一个注册中心,本质上也是一个web服务)
Nacos 的基本架构?(Client/Server架构)
Nacos 主要提供了什么核心功能?(服务的注册,发现,配置)
Nacos 服务启动需要什么前置条件?(配置JDK的JAVA_HOME目录,安装MySQL5.7以上版本,配置连接的数据库)
Nacos 服务单机模式,window平台下启动时的指令是什么?(startup.cmd -m standalone)
实现Nacos服务注册需要添加什么依赖?(两个:web,discovery)
实现Nacos服务注册时,必须做哪些配置?(服务名,假如是本机服务注册可以省略服务地址)
Nacos如何检查服务状态?(通过心跳包实现,服务启动时会定时向nacos发送心跳包-BeatInfo)
服务之间进行服务调用时,使用了什么API?(RestTemplate,用此对象之前要先创建这个对象并交给spring管理) -
使用LoadBalancerClient这个对象实现对远程服务进行负载均衡方式的获取
-
优化上图代码,使用@LoadBalanced注解进行远程服务调用(负载均衡)
启动类
controller
9.Feign方式的远程调用
1.再使用方导入openfeign依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2. 在启动类上添加@EnableFeignClients注解
3.定义Http请求API,基于此API借助OpenFeign访问远端服务(接口)
@FeignClient(name="sca-provider")//sca-provider为服务提供者名称
public interface RemoteProviderService{
@GetMapping("/provider/echo/{string}")//前提是远端需要有这个服务
public String echoMessage(@PathVariable("string") String string);
}
//其中,@FeignClient描述的接口底层会为其创建实现类
4. 创建FeignConsumerController中并添加feign访问
@RestController
@RequestMapping("/consumer")
public class FeignConsumerController {
@Autowired
private RemoteProviderService remoteProviderService;
/**基于feign方式的服务调用*/
@GetMapping("/echo/{msg}")
public String doFeignEcho(@PathVariable String msg){
//基于feign方式进行远端服务调用(前提是服务必须存在)
return remoteProviderService.echoMessage(msg);
}
}
- 图解
1)添加依赖
2)启动类上加注解
3)定义接口
4)controller
注:服务熔断(fallbackFactory)
1.fallbackFactory这个属性在远程服务调用过程中,如果出现问题,会执行这个回调工厂接口对象
2.自定义服务熔断式的本地类(解决方案)
3.yml配置
nacos 配置
1. 日志配置
- **nacos可以在不停机的情况下,对配置进行更改!**在生产环境上我们可能把我们的日志级别调整为 error 级别,但是,在系统出问题我们希望对它 debug 的时候,我们需要动态的调整系统的行为的能力,把日志级别调整为 debug 级别
- 不用注册中心的
- nacos注册中心
2.分组配置
共享配置及读取
同一个namespace的多个配置文件中都有相同配置时,可以对这些配置进行提取,然后存储到nacos配置中心的一个或多个指定配置文件,哪个微服务需要,就在服务的配置中设置读取即可
缓存
双重校验
sentinel
概述
-
Sentinel (分布式系统的流量防卫兵) 是阿里开源的一套用于服务容错的综合性解决方案。它以流量为切入点, 从流量控制、熔断降级、系统负载保护等多个维度来保护服务的稳定性。
Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景, 例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。 -
官网地址
https://github.com/alibaba/Sentinel/releases
快速入门
-
第一步
添加了sentinel限流依赖,此依赖添加后,项目会默认注入一个spring mvc拦截器,用户在发起请求时,通过这个拦截器对象对请求进行拦截,拦截的目的就是为了流控单位时间的请求是否超出了一定的阈值,超出阈值,请求则不再放行 -
修改配置文件
-
写一个controller
-
启动访问8180端口 http://localhost:8180/#/dashboard/flow/sca-provider
拦截器
链路模式
链路模式只记录指定链路入口的流量。也就是当多个服务对指定资源调用时,假如流量超出了指定阈值,则进行限流。被调用的方法用@SentinelResource进行注解,然后分别用不同业务方法对此业务进行调用,假如A业务设置了链路模式的限流,在B业务中是不受影响的。现在对链路模式做一个实践
-
创建service业务
-
controller
-
页面测试
这样的话所有的节点都会到sentinel_spring_web_context这个入口下,所以当创建订单和查询订单时,为了限流查询订单,需要配置文件
此时单链路被限流会显示500
可是这样的500异常不太友好,我们自己可以定义
定义web拦截器
sentinel降级
自定义限流,熔断等异常处理器
为什么不调用底层的限流异常处理类
sentinel热点限流
何为热点?热点即经常访问的数据。比如:
商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制。
用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制。
在这里插入图片描述
sentinel黑白名单
黑白名单规则(AuthorityRule)非常简单,主要有以下配置项:
资源名:即限流规则的作用对象
流控应用:对应的黑名单/白名单中设置的规则值,多个值用逗号隔开.
授权类型:白名单,黑名单(不允许访问)
网关学习Gateway
概述:网关本质上要提供一个各种服务访问的入口,并提供服务接收并转发所有内外部的客户端调用,还有就是权限认证,限流控制等等。
快速入门
- pom添加依赖
- 配置yml
- 启动类
- 访问
注意:用网关访问服务,这样做的目的可以保护服务请求地址不被暴露在外边
负载均衡设计
为什么要负载均衡?
网关才是服务访问的入口,所有服务都会在网关层面进行底层映射,所以在访问服务时,要基于服务serivce id(服务名)去查找对应的服务,让请求从网关层进行均衡转发,以平衡服务实例的处理能力。
网关限流
- 在原有spring-cloud-starter-gateway依赖的基础上再添加如下两个依赖
- 修改配置文件
- 启动网关项目,检测sentinel控制台的网关菜单。
启动时,添加sentinel的jvm参数,通过此菜单可以让网关服务在sentinel控制台显示不一样的菜单,代码如下。
-Dcsp.sentinel.app.type=1
- 项目启动后访问 Sentinel 控制台
假如没有发现请求链路,API管理,关闭网关项目,关闭sentinel,然后重启sentinel,重启网关项目
限流成功
可以基于自定义API维度限流(重点)