单体架构特点?
简单方便,高度耦合,扩展性差,适合小型项目。例如:学生管理系统
分布式架构特点?
松耦合,扩展性好,但架构复杂,难度大。适合大型互联网项目,例如:京东、淘宝
微服务:一种良好的分布式架构方案
优点:拆分粒度更小、服务更独立、耦合度更低
缺点:架构非常复杂,运维、监控、部署难度提高
SpringCloud是目前国内使用最广泛的微服务框架。官网地址:https://spring.io/projects/spring-cloud。
SpringCloud集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验:
单一职责:不同微服务,不要重复开发相同业务
数据独立:不要访问其它微服务的数据库
面向服务:将自己的业务暴露为接口,供其它微服务调用
基于RestTemplate发起的http请求实现远程调用
在启动类中注入
在业务逻辑层中访问封装
http请求做远程调用是与语言无关的调用,只要知道对方的ip、端口、接口路径、请求参数即可。
服务提供者:暴露接口给其它微服务调用
服务消费者:调用其它微服务提供的接口
提供者与消费者角色其实是相对的
一个服务可以同时是服务提供者和服务消费者
服务提供者启动时向eureka注册自己的信息
eureka保存这些信息
消费者根据服务名称向eureka拉取提供者信息
2.如果有多个服务提供者,消费者该如何选择?
服务消费者利用负载均衡算法,从服务列表中挑选一个
3.消费者如何感知服务提供者健康状态?
服务提供者会每隔30秒向EurekaServer发送心跳请求,报告健康状态
eureka会更新记录服务列表信息,心跳不正常会被剔除
消费者就可以拉取到最新的信息
搭建EurekaServer服务步骤如下:
2. 编写启动类,添加@EnableEurekaServer注解
3.添加application.yml文件,编写下面的配置:
server:
port: 10086 # 自定义端口号
spring:
application:
name: eurekaserver # 项目名称
eureka:
client:
service-url: # eureka地址信息
defaultZone: http://127.0.0.1:10086/eureka/
引入eureka-client依赖
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
在application.yml中配置eureka地址
eureka:
client:
service-url: # eureka地址信息
defaultZone: http://127.0.0.1:10086/eureka/
无论是消费者还是提供者,引入eureka-client依赖、知道eureka地址后,都可以完成服务注册
String url = "http://userserver/user/" + order.getUserId();
/**
* 创建RestTemplate并注入spring容器
* */
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高。
spring:
datasource:
url: jdbc:mysql://localhost:3306/cloud_order?useSSL=false
username: BLS
password: 123456
driver-class-name: com.mysql.jdbc.Driver
application:
name: orderserver
cloud:
nacos:
server-addr: localhost:8848
2.启动并测试:
Nacos服务搭建
下载安装包
解压
在bin目录下运行指令:startup.cmd -m standalone
Nacos服务注册或发现
引入nacos.discovery依赖
配置nacos地址spring.cloud.nacos.server-addr
spring:
datasource:
url: jdbc:mysql://localhost:3306/cloud_user?useSSL=false
username: BLS
password: 123456
driver-class-name: com.mysql.jdbc.Driver
application:
name: userserver # 项目名称
cloud:
nacos:
server-addr: localhost:8848 # nacos配置地址
discovery:
cluster-name: HZ # 配置集群名称,也就是机房位置,例如:HZ,杭州
2.在Nacos控制台可以创建namespace,用来隔离不同环境
3.然后填写一个新的命名空间信息:
4.保存后会在控制台看到这个命名空间的id:
5.修改order-service的application.yml,添加namespace:
6.重启order-service后,再来查看控制台:
7.此时访问order-service,因为namespace不同,会导致找不到userservice,控制台会报错:
都支持服务注册和服务拉取
都支持服务提供者心跳方式做健康检测
2.Nacos与Eureka的区别
Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
临时实例心跳不正常会被剔除,非临时实例则不会被剔除
Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式