一、理论知识

二、SpringCloud导学

1、微服务技术栈

SpringCloud学习文档 - 图1
9c289f43577a90b8f58592467b972ec.png

2、认识微服务

2.1、微服务架构演变

  1. 单体架构:将所有的功能集中在一个项目中开发,打成一个包部署
    1. 架构简单
    2. 部署成本低

缺点:耦合度高,扩展性差

  1. 分布式架构:根据业务对功能进行拆分,每个业务模块作为独立项目开发,称为一个服务
  • 优点:
    • 降低服务耦合
    • 有利于服务升级扩展
  • 需要考虑的问题
    • 拆分粒度
    • 集群维护
    • 实现远程调用的方式
    • 健康状态的维护
  1. 微服务:是一种经过良好架构设计的分布式架构方案
  • 单一职责:微服务拆分粒度更小,每一个服务都对应的一个业务能力
  • 面向服务:微服务对外暴露业务接口
  • 自治:团队独立,技术独立,数据独立,部署独立
  • 隔离性强:服务调用做好隔离、容错、降级、避免出现级联问题

3.2、微服务技术对比

d456ab5657c1362593e60b96f857b4f.png

3、SpringCloud

  • SpringCloud 是目前国内使用最广泛的微服务框架
  • 集成了各种微服务功能组件,并基于SpringBoot实现了组件的自动装配,从而提供了良好的开箱即用的体验。

SpringCloud学习文档 - 图4

4、服务拆分及远程调用

4.1、注意事项

  • 不同微服务,不要重复开发相同业务
  • 微服务数据独立,不要访问其他微服务的数据库
  • 微服务可以将自己的业务暴露为接口,供其他的微服务调用

3.2、总结

  1. 微服务需要根据业务模块拆分,做到单一职责,不要重复开发相同业务
  2. 微服务可以将业务暴露为接口,供其他微服务使用
  3. 不同微服务都应该有自己的数据库

    三、Eureka

    1、基本含义:

    本义是希腊语”发现了“,是NetFix公司开源的一个服务注册于发现的组件,并贡献给SpringCloud。

    2、与 Zookeeper的区别

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    2.1、CAP原则

    CAP原则又称CAP定理,指的是在一个分布式系统中
  • 一致性(Consistency)
    • 集群中所有机器数据一致
  • 可用性(Availability)
    • 当有一个节点挂掉,集群仍然可以对外服务
  • 分区容错性(Partition tolerance)
    • 由于一些原因会导致机器中的数据不一样

CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。

2.2、分布式集群特征

SpringCloud学习文档 - 图5

  • ZK侧重 CP 注重数据的一致性
  • Eureka 侧重 AP 注重服务的可用性

3、Spring Cloud其他注册中心

3.1、Spring Cloud Consul

https://spring.io/projects/spring-cloud-consul

3.2、Nacos

https://nacos.io/zh-cn/docs/what-is-nacos.html

4、快速入门

SpringCloud学习文档 - 图6

4.1、步骤(jdk 8,spring boot:2.3.12.RELEASE)

1、创建Eureka-Server

  • 修改Pom文件 :::info 2.3.12.RELEASE 修改版本号 ::: :::info Hoxton.SR12 修改配置 :::

  • 更改启动类

image.png
image.png

  • 配置文件中设置端口与名称 :::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、查看启动情况

  1. 进入http://localhost:8761/

image.png

4.3、为单个服务创建集群

image.png
直接复制配置信息,更改端口之后启动:
image.png
查看:
image.png

4.4、相关配置

1、问题引出

SpringCloud学习文档 - 图13

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 #服务实例心跳频率,要远小于检测时间

  1. - **client**
  2. ```java
  3. server:
  4. port: 8080 #客户端 端口没有要求
  5. spring:
  6. application:
  7. name: erueka-client-a
  8. #注册就是将一些信息发送过去 -- > What ? Where ?
  9. eureka:
  10. client:
  11. service-url: # 注册地址
  12. defaultZone: http://localhost:8761/eureka
  13. register-with-eureka: true #注册开关,默认false,开启后服务可以不在eureka中注册
  14. fetch-registry: true # 应用是否拉去注册列表-fetch
  15. registry-fetch-interval-seconds: 10 #拉取列表时间,时间短可以避免脏读
  16. instance:
  17. hostname: localhost # 应用的主机名称
  18. instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
  19. prefer-ip-address: true
  20. lease-renewal-interval-in-seconds: 10

5、构建eureka的集群

1、server的配置

集群中的每一台机器都互相注册:
修改系统|host文件映射
image.png
然后使用peer在本地环境中测试开发

  1. server:
  2. port: 7001
  3. eureka:
  4. instance:
  5. hostname: eureka7001.com #eureka服务端的实例名称
  6. client:
  7. register-with-eureka: false #表示不向eureka服务端注册自己
  8. fetch-registry: false #false表示自己就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
  9. service-url:
  10. #设置与eureka server交互的地址查询服务和注册服务都需要这个地址
  11. defaultZone: http://peer1:7001/eureka/,http://peer2:7002/eureka/,http://peer3:7003/eureka/

2、深入理解分布式概念

2.1、问题引出

不同于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、基本概念

SpringCloud学习文档 - 图15

2、运行原理特点

  • 对外提供Restful风格的服务
    • 以http动词的形式url的资源进行操作 get,post,put,delete

3、源码解析

有点难,后续补上

7,服务发现

定义:两个Client通过服务的应用名称找到服务的具体实例的过程

  1. @RestController
  2. public class TestController {
  3. @Autowired
  4. private DiscoveryClient discoveryClient; //SpringCloud 的接口
  5. @GetMapping("/test")
  6. public String discover(String serviceName){
  7. //通过名称找到对应的实例,
  8. //因为一个名称可能会对应多个实例,因此需要用到集合
  9. List<ServiceInstance> instances = discoveryClient.getInstances(serviceName);
  10. instances.forEach(System.out::println);
  11. return instances.toString();
  12. }
  13. }

8、基于docker进行部署server

1、配置文件

  1. server:
  2. port: 8761
  3. eureka:
  4. instance:
  5. hostname: eureka-server #eureka服务端的实例名称
  6. client:
  7. register-with-eureka: ${REGISTER_WITH_EUREKA:true} #表示不向eureka服务端注册自己
  8. fetch-registry: true #false表示自己就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
  9. service-url:
  10. defaultZone: ${EUREKA_SERVER_URL:http://localhost:8761/eureka}
  11. #设置与eureka server交互的地址查询服务和注册服务都需要这个地址
  12. # defaultZone: http://peer1:7001/eureka/,http://peer2:7002/eureka/,http://peer3:7003/eureka/

2、打包

image.png

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服务

    1. docker run --name eureka-server -p 8761:8761 -e REGISTER_WITH_EUREKA=false -d eureka-server:1.0

    image.png

四、RestTemplate

1、