一. 微服务
1.单体架构和分布式架构
- 单体架构
- 分布式架构
根据业务功能对系统进行拆分,每个业务模块作为独立项目开发,成为一个服务
优点:
缺点:服务拆分力度、服务集群地址如何维护、服务之间实现远程调用、服务健康状态如何感知 - 微服务
- 特点:
- 单一职责:拆分力度小
- 面向服务:微服务对外暴露业务接口
- 自治:团队独立、技术独立、数据独立、部署独立
- 结构
- 服务集群
- 注册中心
- 配置中心
- 服务网关
- 服务监控和保护
- 框架
- springcloud
- Dubbo
- 特点:
2.springcloud
- 1.简介
- 功能
- 服务注册发现
- 服务远程调用
- 服务链路监控
- 统一配置管理
- 统一网关路由
- 流控、降级、保护
- springcloud与springboot版本兼容
- 功能
二. 服务拆分和远程调用
服务拆分
- 拆分注意事项
- 1.不同微服务,不要重复开发相同业务
- 2.微服务数据独立,不要访问其他微服务的数据库
- 3.微服务可将自己的业务暴露为接口,供其他微服务调用
- 拆分demo
- 1.项目分离
- 2.数据库分离
远程调用
- 远程调用
- 要求:在订单模块查询订单信息,并且要求返回用户信息。
- 步骤
-
1)注册RestTemplate
-
2)在OrderService中利用template的api发出http请求
-
注意:
1、当请求时post时,相应的api是postForObject
2、两个application应当都在运行中
- 提供者和消费者
- 服务提供者:一次业务中,被其他微服务调用的服务。
- 服务消费者:一次业务中,调用其他微服务的服务。-
三. Eureka注册中心
eureka注册
- eureka角色
- eureka-server注册中心:保存client的地址信息、心跳监控
- eureka-client客户端:
- 提供者:注册自己的信息、发送心跳、
- 消费者:拉取服务列表信息、发出远程调用
- 作用
- 提供提供者的信息
提供者启动时向eureka注册自己的信息
eureka保存信息
消费者根据服务名称向eureka拉去提供者信息 - 消费者从多个提供者选择一个合适的提供者
采用负载均衡算法,从服务列表选择一个 - 帮助消费者感知提供者健康状态
提供者每隔30秒向eureka-server发送心跳请求,报告健康状态
eureka更新记录服务列表信息,心跳正常不会被剔除
消费者拉取到最新信息
- 提供提供者的信息
- 动手实践
-
1.搭建注册中心:注册EurekaServer
<dependency> <groupId>org.springframework.cloud</groupId> <!-- 不要写错依赖呀,否则yml文件无法识别--> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
@EnableEurekaServer @SpringBootApplication public class EurekaApplication { public static void main(String[] args) { SpringApplication.run(EurekaApplication.class,args); } }
server: port: 10086 spring: application: name: eurecaserver eureka: client: register-with-eureka: false #是否将自己注册到eureka中 fetch-registry: false #是否从eureka中获取信息 service-url: defaultZone: http://127.0.0.1:10086/eureka/
-
2.注册服务:将User-Service、Order-Service注册到Eureka
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
spring: application: name: orderservice eureka: client: service-url: defaultZone: http://127.0.0.1:10086/eureka/
-
3.服务发现:在order-service中完成服务拉取,然后通过负载均衡挑选一个服务,实现远程调用
@MapperScan("cn.itcast.order.mapper") @SpringBootApplication public class OrderApplication { public static void main(String[] args) { SpringApplication.run(OrderApplication.class, args); } @Bean @LoadBalanced public RestTemplate restTemplate(){return new RestTemplate();} }
@Service public class OrderService { @Autowired private OrderMapper orderMapper; @Autowired private RestTemplate restTemplate; public Order queryOrderById(Long orderId) { // 1.查询订单 Order order = orderMapper.findById(orderId); // 2.利用resttemplate发出http请求,查询用户 String url = "http://userservice/user/" + order.getUserId(); User user = restTemplate.getForObject(url, User.class); // 3.为order封装user order.setUser(user); // 4.返回 return order; } }
-
Ribbon负载均衡
-
Ribbon负载均衡
- 原理
- 规则接口是IRule
- 默认实现是ZoneAvoidanceRule,根据zone选择服务列表,然后轮询
-
负载均衡策略
-
改变负载均衡策略
-
1.代码方式:在order-service中的OrderApplication类中,定义一个新的IRule:(作用范围:全体service)
@Bean public IRule randomRule(){ return new RandomRule(); }
-
2.配置文件方式:在order-service的application.yml文件中,添加新的配置也可以修改规则(只针对某个服务)
userservice: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule#
-
-
饥饿加载
- Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。而饥饿加载则会在项目启动时创建,降低第一次访问的耗时
- 配置饥饿加载:
ribbon: eager-load: enabled: true # 开启饥饿加载 clients: userservice # 指定对userservice这个服务饥饿加载
-
四. Nacos注册中心
4.1、认识和安装nacos
- Nacos:是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高
- 安装:
- 默认端口:8848
- 启动:进入安装路径的bin目录-》执行命令:startup.cmd -m standalone
- 登录:默认账号密码都是nacos
4.2、nacos快速入门(注册)
-
nacos注册中心
-
注意:首先启动nacos;然后order–service和userservice才的application才能启动成功,否则会报错
<!--nacos管理依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.5.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency>
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
spring: cloud: nacos: server-addr: localhost:8848 #nacos服务端地址
4.3、nacos服务分级存储模型和NacosRule负载均衡
- 分级存储模型
- 一级是服务,例如userservice
- 二级是集群,例如杭州或上海
- 三级是实例,例如杭州机房的某台部署了userservice的服务器
- 集群
- 概念:类似于以地名为名的分组
- 设置实例的集群属性:为userservice配置集群
修改userservie的application.yml:
在nacos控制台查看集群变化:spring: cloud: nacos: server-addr: localhost:8848 # nacos 服务端地址 discovery: cluster-name: HZ # 配置集群名称,也就是机房位置,例如:HZ,杭州
- NacosRule负载均衡
-
设置NacosRule负载均衡
在消费者orderservice的application.yml文件中设置负载均衡的IRule为NacosRuleuserservice: ribbon: NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
-
NacosRule优先同集群的负载均衡特性
- 优先选择同集群的服务实例列表
- 本地集群找不到提供者,才会跨集群访问并发出警告
- 确定可用实例列表后,再采用随机负载均衡挑选实例
-
- 根据权重负载均衡
- 实例的权重控制
1)Nacos控制台可以设置实例的权重值,0~1之间
2)同集群内的多个实例,权重越高被访问的频率越高
3)权重设置为0则完全不会被访问 - 设置实例的权重值:
- 实例的权重控制
4.4、nacos环境隔离
-
环境隔离 namespace:Nacos中服务存储和数据存储的最外层都是一个名为namespace的东西,用来做最外层隔离
- 特性:
1)每个namespace都有唯一id
2)服务设置namespace时要写id而不是名称
3)不同namespace下的服务互相不可见
- 特性:
-
添加namespace:
-
为order-service服务添加命名空间
修改order-service的application.yml,添加namespace的idspring: datasource: url: jdbc:mysql://localhost:3306/heima?useSSL=false username: root password: 123 driver-class-name: com.mysql.jdbc.Driver cloud: nacos: server-addr: localhost:8848 discovery: cluster-name: SH # 上海 namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空间,填ID
然后重启order-service,查看控制台
五. Nacos VS Eureka
5.1、区别
- Nacos与eureka的共同点
都支持服务注册和服务拉取
都支持服务提供者心跳方式做健康检测 - Nacos与Eureka的区别
1)Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
临时实例心跳不正常会被剔除,非临时实例则不会被剔除
2)Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
3)Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式
5.2、临时实例和非临时实例
- 临时实例和非临时实例
-
服务注册到Nacos时:可以选择注册为临时或非临时实例。默认是临时实例
-
配置非临时实例
在服务的application.yml中:spring: cloud: nacos: discovery: ephemeral: false # 设置为非临时实例
-
区别:(推荐临时实例)
1)临时实例采用心跳模式,非临时实例采用主动检测模式
2)临时实例宕机时,会从nacos的服务列表中剔除,而非临时实例则不会
-