@[TOC]
1 什么是微服务
微服务是分布式架构的一种,是在设计分布式架构设计过程中,不断踩坑,然后,形成的一种经过良好架构设计的分布式架构方案。分布式架构就是把服务做拆分,在拆分的过程中会产生很多问题,而springcloud仅仅是解决了服务拆分时的治理问题。
微服务包含的技术栈
- 微服务治理:注册发现、远程调用、负载均衡、配置管理、网关路由、熔断降级、分布式事务、Seata等。
- 缓存技术:redis持久化、缓存数据同步、Nginx本地缓存等。
- 搜索技术:DSL语句、ES集群、竞价排名、集群脑裂、地理坐标等。
- 异步通信技术:MQ消息模型、消息堆积问题、镜像集群、延迟队列等。
- DevOps技术:Docker使用、DockerCompose、SkyWalkingJenkins等。
1.1 单体架构
- 单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署。 优点:架构简单、部署简单。缺点:耦合度高。
1.2 分布式架构
- 分布式架构:根据业务功能对系统进行拆分,每个业务模块作为独立项目开发,称为一个服务。优点:降低服务耦合度、有利于服务升级拓展。缺点:服务拆分粒度如何、服务集群地址如何维护、服务之间如何实现远程调用、服务健康状态如何感知等问题。
特征: - 单一职责,每个服务对应唯一的业务能力,避免重复开发
- 面向服务:微服务对外暴露业务接口,服务间可以相互调用
- 自治:团队独立、技术独立、数据独立、部署独立
- 隔离性强:服务调用做好隔离、容错、降级,避免出现级联失败
1.3 服务拆分注意事项
- 不同微服务,不要重复开发相同业务
- 微服务数据库独立,不要访问其它微服务的数据库
- 微服务可以将自己的业务暴露为接口,供其它微服务调用
1.4 微服务远程调用
使用RestTemplate,Bean的注入只能写到配置类中,@SpringBootApplication本身也是配置类。RestTemplate是Spring-web中的类,前提有Spring。也可以手写get、post请求,用java的URL类。@Bean public RestTemplate restTemplate(){ return new RestTemplate(); }
//第一个参数请求地址,第二个参数返回值类型的class restTemplate.getForObject(); //第一个参数请求地址,第二个参数requestBody,第三个参数返回值类型的class restTemplate.postForObject();
- 服务提供者:一次业务中,被其他微服务调用的业务。
- 服务消费者:一次业务中,调用其他微服务的服务。
- 服务消费者和提供者是相对的,既可以是消费者,也可以是服务者。
2 注册中心Eureka
- 解决的问题:当服务的提供者有很多时的情况,服务多实例,服务集群的情况。就不能写死请求地址了。如果有过个服务提供者,消费者该如何选择?消费者如何得知服务提供者的健康状态?
- Eureka-server注册中心负责记录和管理微服务。微服务在启动时,会将自己的信息注册给Eureka-service,例如ip、端口等,并且有心跳监控(每隔30s更新一次)。服务的消费者向Eureka拉取服务信息。
- 负载均衡注解
@LoadBalanced
,SpringCloud-common
中的注解,轮循负载均衡、随机负载均衡@Bean @LoadBalanced //负载均衡 public RestTemplate getRestTemplate(){ return new RestTemplate(); }
3 Ribbon负载均衡
- 规则接口是IRule,默认实现ZoneAvoidanceRule,根据zone(地区,上海或北京)选择服务列表,然后轮循。
- 轮循机制:轮流调用
- 随机机制:随机调用
- 懒加载:默认懒加载,第一次访问时才会去创建LoadBalanceClient,请求时间很长。
- 饥饿加载:会在项目启动时创建,降低第一次访问的耗时。开启姐加载指定微服务名称。
4 Nacos注册中心
- 相对于Eureka更强大,不仅有
Service registration and discovery
(服务的注册和发现)功能,还有Distributed Configuration
分布式配置等功能。4.1 Nacos的使用
第一步 父级工程中引入依赖
<!-- SpringCloud 微服务 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> <!-- SpringCloud Alibaba 微服务 nacos的管理依赖 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>${spring-cloud-alibaba.version}</version> <type>pom</type> <scope>import</scope> </dependency>
- 第二步 添加nacos的客户端依赖
<!-- SpringCloud Alibaba Nacos --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
- 第三部 修改yml配置文件
# Spring
spring:
application:
# 应用名称
name: test-demo
profiles:
# 环境配置
active: dev
cloud:
nacos:
discovery:
# 服务注册地址
server-addr: localhost:8848 #nacos服务地址
4.2 Nacos服务分级储存模型
- 一级:是服务,例如:提供用户功能的user-service
- 二级:是集群,以机房划分集群,例如:杭州集群、上海集群
- 三级:是实例,例如:端口为8080的user-service微服务
服务跨集群调用问题:尽可能选择本地集群的服务,跨集群调用延迟较高,本地集群不可访问时,再去访问其它集群4.3Nacos服务集群属性配置
- 修改yml配置文件
# Spring spring: cloud: nacos: discovery: cluster-name: SH #配置集群名 机房位置:上海地区
4.4 Nacos根据集群负载均衡
当本地集群有问题时,访问其它地区访问。test-demo: ribbon: NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule #默认随机访问本地区集群
4.5 Nacos根据权重负载均衡
- 实际部署中会出现这样的场景:服务器设备性能有差异,部分实例所在及其性能较好,另外一些老的机器性能较差,我们希望性能好的机器承担更多的业务量,Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高。
- 权重值在0-1之间,只能是小数,权重设置为0时,则不会被访问!在服务升级时可以做到平滑升级!
4.6 Nacos环境隔离-namespace
- Nacos中服务储存和数据储存的外层都是一个名为namespace的东西,用来做最外层隔离,依次是:
namespace>group>Service/Data>cluster>instance
- 每个namespace都有唯一id,不同namespace下的服务不可见,不能访问
- 第一步 新建命名空间
- 第二步 yml配置文件
# Spring spring: cloud: nacos: discovery: namespace: 12345678-1234-1234-5634681 #填写命名空间的id
4.7 Nacos设置临时实例和非临时实例
- 临时实例:和Eureka一样采用心跳监测,隔一段时间向nacos注册中心发送一次信息,告诉nacos还在不在。
- 非临时实例:由nacos注册中心主动询问服务提供者,是否还健康。
- 通过yml文件配置
spring: cloud: nacos: discovery: ephemeral: true # 默认为临时实例,系统上线后,可以设置为非临时实例
- 服务消费者端:Eureka通过定时拉取服务pull,然后缓存服务列表,nacos则主动推送变更消息,来修改服务列表。
5 Nacos配置管理
- 读取nacos的配置管理结合本地的配置结合使用。
- 当nacos配置管理服务发生改变后,会主动通知微服务,配置修改了,并实现热部署,不用重启,自动生效。
5.1 实现配置管理
5.2微服务读取Nacos配置
- 第一步 引入依赖
<!-- SpringCloud Alibaba Nacos Config --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
- 第二步 新建
bootstrap.yml
文件,bootstrap.yml
引导文件优先级高于application.yml
。# Spring spring: application: # 应用名称 name: test-demo profiles: # 环境配置 active: dev cloud: nacos: config: # 配置中心地址 server-addr: 127.0.0.1:8848 # 配置文件格式 file-extension: yml
5.3 配置热更新
方式一:在
@Value
注解所在的类添加注解@RefreshScope
方式二:在
@ConfigurationProperties(prefix = "sd")
自动实现刷新,不需要@RefreshScope
5.4 配置共享
- 微服务启动时会从nacos读取多个配置文件,其中test.yaml文件一定会加载,因此可以将共享配置写入这个文件。
- 多种配置的优先级:nacos中的配置(服务名-rpofile.yml>服务名称.yml)>本地配置
6 Nacos集群搭建
- 一、配置每个nacos集群ip
#it is ip #example 192.168.16.101:8080 192.168.16.102:8081 192.168.16.103:8082
- 二、配置数据库信息和端口号
server.port=8848 spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://127.0.0.1:3306/nacos-config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC db.user=root db.password=yuan159951.
- 三、启动
startup.cmd
默认集群启动,startup.cmd -m standalone
单机版。 - 四、Nginx反向代理
upstream nacos-cluster{
server 127.0.0.1:8080;
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
server {
# 前台接口
listen 80;
server_name localhost;
location /nacos {
proxy_pass http://nacos-cluster;
}
}