1、微服务
什么是微服务
就是将一个大的应用,拆分成多个小的模块,每个模块都有自己的功能和职责,每个模块可以进行交互,这就是微服务
比如有空调开关模块、温度模块、模式模块,一个模块要调用其他模块,需要储存他们的端口,如果模块足够多会导致端口过多
所以使用微服务来管理这么一些端口
微服务特点
1)可以使用多种语言进行交互
2)微服务的数据库独立,多个模块之间可以不使用相同的数据库
3)自动化部署(CI/CD)(持续集成、持续交付)
4)服务集中化管理
5)可以根据功能划分为独立运行的程序,即服务单元
6)通过http协议进行交互
7)分布式系统
微服务的缺点
微服务的复杂度、
分布式事务问题、
服务的划分(应该按照功能划分还是组件)、
服务部署(不适用自动化部署)
2、SpringCloud
SpringCloud简介
SpringCloud是java的微服务框架,依赖于SpringBoot,提供很多组件来管理微服务
三个相关公司
spring官方、netflix、alibaba
目前开发中常用的落地实现有三种:
Dubbo+Zookeeper 半自动化的微服务实现架构 (别的管理没有)
SpringCloud Netflix 一站式微服务架构
SpringCloud Alibaba 新的一站式微服务架构
SpringCloud、SpringBoot、相关版本的关系
假如你使用alibaba:2021.0.1.0版本,就应该对应的使用SpringBoot:2.6.3版本,以及SpringCloud:2021.0.1
下图是alibabab版本的对应关系(具体使用请上对应官网查看)
常用组件表
注册和发现:三个公司所使用的都不一样,依次是spring官方、netflix、alibaba
3、Eureka
是Netflix公司的服务注册与发现的组件,是给SpringCloud的一个框架
Eureka和Zookeeper的区别
面试一般这么问就是在问CAP原则,指的是一个分布式系统中,
一致性、可用性、分区容错性,这三个要素最多只能实现两点
CAP原则
4、SpringCloud(Eureka)在idea的使用
application.yml的配置(1)
server:
port: 8761 # eureka的默认端口 6379 8080 3306 8848
spring:
application:
name: eureka-server # 一般填写应用名称,建议加入name这个标签
Application的配置
@SpringBootApplication
@EnableEurekaServer // 开启eureka的注册中心功能
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
应用程序注册到eureka-server(上面写的8761端口)中
server:
port: 8081
spring:
application:
name: eureka-client-b
eureka:
client:
service-url: # 指定注册地址
defaultZone: http://localhost:8761/eureka
复制client
相关事项
脏读:也就是当B噶了的时候,A不知道,仍然去读取B的数据
application.yml的配置(2)
server:
port: 8761 # eureka端口名一般是 6379 8080 3306 8848
spring:
application:
name: eureka-server # 应用名称,建议加入name这个标签
eureka: # eureka的配置分为三类 server client 实例的 eureka-server既是服务端又是客户端
server:
eviction-interval-timer-in-ms: 10000 # 服务端间隔多少毫秒做定期删除的操作
renewal-percent-threshold: 0.85 # 续约百分比 超过85%的应用没有和你续约 那么eureka会保护服务 不会剔除任何一个
client:
service-url:
dafaultZone: ${EUREKA_SERVER_URL:http://localhost:8761/eureka}
register-with-eureka: ${REGISTER_WITH_EUREKA:true} # 先将server自己注册自己的开关关掉
fetch-registry: true
instance:
instance-id: # 主机名称 : 应用名称 : 端口号${eureka.instance.hostname}:${spring.application.name}:${server.port}
hostname: localhost # 主机名称 或者服务的ip
prefer-ip-address: true # 以ip的形式显示具体的服务信息
lease-renewal-interval-in-seconds: 5 # 服务实例的续约时间间隔,单位是秒,必须比上面的定期删除小
去中心化模式集群
方案一(建立3个server项目)
每个server中都需要配置其他两个server的service-url
eureka:
client:
service-url:
# 其他两个是1,2/2,3
defaultZone: http://peer1:8761/eureka,http://peer3:8763/eureka
instance: # 实例的配置
instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port} # 主机名称 : 应用名称 : 端口号
hostname: peer2 # 主机名称 或者服务的ip
prefer-ip-address: true # 以ip的形式显示具体的服务信息
lease-renewal-interval-in-seconds: 5 # 服务实例的续约的时间间隔
方案二(建立一个server项目,之后复制出2个相同的项目)
直接给一个server项目添加3个service-url
eureka:
client:
service-url: # 你不写 默认 8761
defaultZone: http://peer1:8761/eureka,http://peer2:8762/eureka,http://peer3:8763/eureka
instance: # 实例的配置
instance-id: ${spring.application.name}:${server.port} # 主机名称 : 应用名称 : 端口号
# hostname: peer1 # 主机名称 或者服务的ip
prefer-ip-address: true # 以ip的形式显示具体的服务信息
lease-renewal-interval-in-seconds: 5 # 服务实例的续约的时间间隔
而client则是需要配置全部的server
eureka:
client: # 客户端的相关配置
service-url: # 指定注册的地址
defaultZone: http://peer1:8761/eureka,http://peer2:8762/eureka,http://peer3:8763/eureka
register-with-eureka: true # 可以不往eureka-server注册
fetch-registry: true # 应用是否去拉去服务列表到本地
registry-fetch-interval-seconds: 10 # 为了缓解服务列表的脏读问题 时间越短脏读越少 性能消耗大
instance:
hostname: localhost # 应用的主机名称 最好写主机ip
instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
prefer-ip-address: true # 显示ip
lease-renewal-interval-in-seconds: 10 # 示例续约的时间
特点
在Eureka的去中心化集群模式下,多个Eureka Server节点形成一个集群,每个节点都可以独立地提供服务注册和发现的功能,并且彼此之间可以互相发现和同步服务信息。
具体来说,每个服务实例都可以向任意一个Eureka Server节点进行注册,并向其汇报自己的元数据信息
这种去中心化集群模式的优点在于,它可以有效地减少单点故障的风险,提高系统的可靠性和可用性。同时,由于各个节点之间是对等的,所以它也可以很好地适应系统的扩展和动态变化,可以随时添加或删除节点,而不会影响整个系统的运行
主从模式集群
少数服从多数的形式进行数据管理
主机的选择
最开始有一个0到300ms的时间,这时候集群里面会有一个先苏醒,这个先苏醒的就是主机,这个过程也叫做选举超时
如果有两个一起苏醒,那么会初始化,重新开始上面的选取步骤
当主机噶了,从机之间会重复上面的步骤,选举出一个主机
服务发现
在两个从机都向主机注册之后,从机A可以通过服务发现来获取从机B的信息
@GetMapping("test")
public String doDiscovery(String serviceName){
// 这就是服务发现 通过服务的应用名 找到服务的具体信息
List<ServiceInstance> instances = discoveryClient.getInstances(serviceName);
instances.forEach(System.out::println);
ServiceInstance serviceInstance = instances.get(0);
String ip = serviceInstance.getHost();
int port = serviceInstance.getPort();
System.out.println(ip+":"+port);
// 这里去找b的ip和port
return instances.get(0).toString();
}
获取到的信息
[EurekaDiscoveryClient.EurekaServiceInstance@101c8dd8
instance = InstanceInfo
[instanceId = LAPTOP-QTEF5Q30.mshome.net:eureka-client-b:8081,
appName = EUREKA-CLIENT-B, hostName = LAPTOP-QTEF5Q30.mshome.net, status = UP, ipAddr = 192.168.137.1, port = 8081,securePort = 443, dataCenterInfo = com.netflix.appinfo.MyDataCenterInfo@c816ec0]
LAPTOP-QTEF5Q30.mshome.net:8081
5、docker
docker是啥
docker和springcloud结合使用
docker是一个工具,因为每次使用都需要起一下server,所以在docker上部署服务器,把东西打包之后放在里面,这样就会在服务器里面运行好,不需要自己启动
nfo = com.netflix.appinfo.MyDataCenterInfo@c816ec0]
LAPTOP-QTEF5Q30.mshome.net:8081
## 5、docker
#### docker是啥
[外链图片转存中...(img-Im5G5eIj-1681892555567)]
#### docker和springcloud结合使用
docker是一个工具,因为每次使用都需要起一下server,所以在docker上部署服务器,把东西打包之后放在里面,这样就会在服务器里面运行好,不需要自己启动