一、理论知识
二、SpringCloud导学
1、微服务技术栈
2、认识微服务
2.1、微服务架构演变
- 单体架构:将所有的功能集中在一个项目中开发,打成一个包部署
- 架构简单
- 部署成本低
缺点:耦合度高,扩展性差
- 分布式架构:根据业务对功能进行拆分,每个业务模块作为独立项目开发,称为一个服务
- 优点:
- 降低服务耦合
- 有利于服务升级扩展
- 需要考虑的问题
- 拆分粒度
- 集群维护
- 实现远程调用的方式
- 健康状态的维护
- 微服务:是一种经过良好架构设计的分布式架构方案
- 单一职责:微服务拆分粒度更小,每一个服务都对应的一个业务能力
- 面向服务:微服务对外暴露业务接口
- 自治:团队独立,技术独立,数据独立,部署独立
- 隔离性强:服务调用做好隔离、容错、降级、避免出现级联问题
3.2、微服务技术对比
3、SpringCloud
- SpringCloud 是目前国内使用最广泛的微服务框架
- 集成了各种微服务功能组件,并基于SpringBoot实现了组件的自动装配,从而提供了良好的开箱即用的体验。
4、服务拆分及远程调用
4.1、注意事项
- 不同微服务,不要重复开发相同业务
- 微服务数据独立,不要访问其他微服务的数据库
- 微服务可以将自己的业务暴露为接口,供其他的微服务调用
3.2、总结
- 微服务需要根据业务模块拆分,做到单一职责,不要重复开发相同业务
- 微服务可以将业务暴露为接口,供其他微服务使用
- 不同微服务都应该有自己的数据库
三、Eureka
1、基本含义:
本义是希腊语”发现了“,是NetFix公司开源的一个服务注册于发现的组件,并贡献给SpringCloud。2、与 Zookeeper的区别
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。2.1、CAP原则
CAP原则又称CAP定理,指的是在一个分布式系统中
- 一致性(Consistency)
- 集群中所有机器数据一致
- 可用性(Availability)
- 当有一个节点挂掉,集群仍然可以对外服务
- 分区容错性(Partition tolerance)
- 由于一些原因会导致机器中的数据不一样
CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。
2.2、分布式集群特征
- ZK侧重 CP 注重数据的一致性
- Eureka 侧重 AP 注重服务的可用性
3、Spring Cloud其他注册中心
3.1、Spring Cloud Consul
3.2、Nacos
4、快速入门
4.1、步骤(jdk 8,spring boot:2.3.12.RELEASE)
1、创建Eureka-Server
修改Pom文件 :::info
2.3.12.RELEASE 修改版本号 ::: :::infoHoxton.SR12 修改配置 :::更改启动类
- 配置文件中设置端口与名称
:::info
server:
port: 8761
spring:
application:
name: eureka-serve
:::
2、创建Eureka-Client
前几个步骤与Server一致,故省略
配置文件中设置端口与名称 :::tips server:
port: 8080 _#客户端 端口没有要求
_spring:
application:
name: erueka-client-a
#注册就是将一些信息发送过去 — > What ? Where ?
_eureka:
client:
service-url: # 注册地址
_defaultZone: http://localhost:8761/eureka
:::
4.2、查看启动情况
4.3、为单个服务创建集群
直接复制配置信息,更改端口之后启动:
查看:
4.4、相关配置
1、问题引出
2、相关配置
- server ```xml server: port: 8761
spring: application: name: eureka-serve
eureka: server: eviction-interval-timer-in-ms: 10000 #服务间隔多少毫秒做定期剔除的操作 renewal-percent-threshold: 0.85 #续约百分比,当达到阈值时,不会剔除服务 instance: instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port} #实例的配置 hostname: locahost #主机名称 prefer-ip-address: true # 以IP的形式显示具体的服务信息 lease-renewal-interval-in-seconds: 5 #服务实例心跳频率,要远小于检测时间
- **client**
```java
server:
port: 8080 #客户端 端口没有要求
spring:
application:
name: erueka-client-a
#注册就是将一些信息发送过去 -- > What ? Where ?
eureka:
client:
service-url: # 注册地址
defaultZone: http://localhost:8761/eureka
register-with-eureka: true #注册开关,默认false,开启后服务可以不在eureka中注册
fetch-registry: true # 应用是否拉去注册列表-fetch
registry-fetch-interval-seconds: 10 #拉取列表时间,时间短可以避免脏读
instance:
hostname: localhost # 应用的主机名称
instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
prefer-ip-address: true
lease-renewal-interval-in-seconds: 10
5、构建eureka的集群
1、server的配置
集群中的每一台机器都互相注册:
修改系统|host文件映射
然后使用peer在本地环境中测试开发
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com #eureka服务端的实例名称
client:
register-with-eureka: false #表示不向eureka服务端注册自己
fetch-registry: false #false表示自己就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
#设置与eureka server交互的地址查询服务和注册服务都需要这个地址
defaultZone: http://peer1:7001/eureka/,http://peer2:7002/eureka/,http://peer3:7003/eureka/
2、深入理解分布式概念
2.1、问题引出
- 主从模式中主机的选取
-
2.2、解决方法
Poxos zookeeper
- raft nacos ( 主要讲这个)
2.3、raft简介
https://zhuanlan.zhihu.com/p/32052223 https://thesecretlivesofdata.com/raft/
不同于Paxos算法直接从分布式一致性问题出发推导出来,Raft算法则是从多副本状态机的角度提出,用于管理多副本状态机的日志复制。Raft实现了和Paxos相同的功能,它将一致性分解为多个子问题:Leader选举(Leader election)、日志同步(Log replication)、安全性(Safety)、日志压缩(Log compaction)、成员变更(Membership change)等。同时,Raft算法使用了更强的假设来减少了需要考虑的状态,使之变的易于理解和实现。
Raft将系统中的角色分为领导者(Leader)、跟从者(Follower)和候选人(Candidate):
- Leader:接受客户端请求,并向Follower同步请求日志,当日志同步到大多数节点上后告诉Follower提交日志。
- Follower:接受并持久化Leader同步的日志,在Leader告之日志可以提交之后,提交日志。
- Candidate:Leader选举过程中的临时角色。
Raft算法将时间分为一个个的任期(term),每一个term的开始都是Leader选举。在成功选举Leader之后,Leader会在整个term内管理整个集群。如果Leader选举失败,该term就会因为没有Leader而结束。
6、Eureka的源码分析
1、基本概念
2、运行原理特点
- 对外提供Restful风格的服务
- 以http动词的形式url的资源进行操作 get,post,put,delete
3、源码解析
有点难,后续补上
7,服务发现
定义:两个Client通过服务的应用名称找到服务的具体实例的过程
@RestController
public class TestController {
@Autowired
private DiscoveryClient discoveryClient; //SpringCloud 的接口
@GetMapping("/test")
public String discover(String serviceName){
//通过名称找到对应的实例,
//因为一个名称可能会对应多个实例,因此需要用到集合
List<ServiceInstance> instances = discoveryClient.getInstances(serviceName);
instances.forEach(System.out::println);
return instances.toString();
}
}
8、基于docker进行部署server
1、配置文件
server:
port: 8761
eureka:
instance:
hostname: eureka-server #eureka服务端的实例名称
client:
register-with-eureka: ${REGISTER_WITH_EUREKA:true} #表示不向eureka服务端注册自己
fetch-registry: true #false表示自己就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
defaultZone: ${EUREKA_SERVER_URL:http://localhost:8761/eureka}
#设置与eureka server交互的地址查询服务和注册服务都需要这个地址
# defaultZone: http://peer1:7001/eureka/,http://peer2:7002/eureka/,http://peer3:7003/eureka/
2、打包
3、写dockers配置
Dockerfile :::tips FROM openjdk:17
ENV wokdir=/home/springcloud/eureka-server
COPY . ${wokdir}
WORKDIR ${wokdir}
EXPOSE 8761
CMD [“java”,”-jar”,”server01-0.0.1-SNAPSHOT.jar”] :::run.sh :::tips cd .. && docker build ./eureka-server -t eureka-server:1.0 :::
4、linux操作
上传并赋予权限 :::tips chmod 777 run.sh :::
开启docker服务
docker run --name eureka-server -p 8761:8761 -e REGISTER_WITH_EUREKA=false -d eureka-server:1.0
四、RestTemplate
1、