🍅程序员小王的博客:程序员小王的博客  ​​​​​​                                                                         

 🍅 欢迎点赞 👍 收藏 ⭐留言 📝                                                                                         

 🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕 

 🍅java自学的学习路线:java自学的学习路线

一、什么是SpringCloud

1、定义

  • 官方定义: springcloud为开发人员提供了在分布式系统中快速构建一些通用模式的工具(例如配置管理(配置管理组件)、服务发现(服务注册中心)、断路器(服务熔断)、集成路由(网关)、微代理、控制总线(完成自动配置刷新))

  • 通俗定义:springcloud是一个含概多个子项目的开发工具集,集合了众多的开源框架

2、微服务

  • 基于单体业务进行拆分,每个服务都是独立应用,独立部署 运行在自己计算机进程,对于这些服务都是分布式管理

二、SpringCloud版本命名和SpringBoot版本选择

1、SpringCloud命名 数字命名

定义:SpringCloud涵盖众多子项目工具集 服务发现,服务注册,负载均衡,子项目版本使用数字

  • 早期命名:选择伦敦的地铁站名称作为发布版本的命名

                  ` Angel、Brixton、Camden、Dalston、Edgware、Finchley、Greenwich、Hoxton,敦地铁站的名称(“天使”是第一个版本,“布里斯顿”是第二个版本,"卡姆登"是第三个版本)`
    
  • 后期改为: 2021.0.0

2、SpringCloud和SpringBoot的版本对应关系

1. Angel                     版本基于springboot1.2.x版本构建与1.3版本不兼容

2. Brixton                    版本基于springboot1.3.x版本构建与1.2版本不兼容
  `2017年Brixton and Angel release官方宣布报废
  
3. Camden                    版本基于springboot1.4.x版本构建并在1.5版本通过测试
  `2018年Camden release官方宣布报废
  
4. Dalston、Edgware          版本基于springboot1.5.x版本构建目前不能再springboot2.0.x版本中使用
  `Dalston(达尔斯顿)将于2018年12月官方宣布报废。Edgware将遵循Spring Boot 1.5.x的生命周期结束。
  
5. Finchley                   版本基于springboot2.0.x版本进行构建,不能兼容1.x版本

6. Greenwich                  版本基于springboot2.1.x版本进行构建,不能兼容1.x版本

7. Hoxton                      版本基于springboot2.2.x版本进行构建

8. 2020.0.x aka Ilford         版本基于springboot 2.4.x, 2.5.x (Starting with 2020.0.3)

9. 2021.0.x aka Jubilee       版本基于springboot 2.6.x


三、SpringCloud的环境搭建

1、微服务

  • 定义:基于单个应用围绕业务进行拆分,拆分出来每一个服务独立项目 ,单独部署,运行自己计算机进程(不是部署在一台计算机上面),基于分布式管理2

2、SpringCloud工具集

  • 定义:用来帮助开发人员快速构建一套分布式应用 微服务工具集(服务注册,发现,负载均衡,路由组件,统一配置管理)

3、环境搭建

  • SpringCloud+SpringBoot

(1)版本选择

-SpringCloud H.SR6(目前已经达到10了)
-SpringBoot    2.2.5版本
-JDK1.8
-maven 3.x
-idea:2021

(2)创建SpringCloud项目父项目,管理版本

  • SpringCloud_parent 管理维护依赖

  • 选择maven,跳过骨架

  • 选择稳定版本

  • 在父项目中继承SpringBoot父项目, 指定版本为 2.2.5版本

 <!--1.在父项目中继承SpringBoot父项目-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
    </parent>
  • 引入springcloud的版本管理

<!--维护SpringCloud的依赖,定义springcloud使用版本号-->
    <properties>
        <java.version>1.8</java.version>
        <spring-Cloud.version>Hoxton.SR6</spring-Cloud.version>
    </properties>

    <!--全局管理springcloud版本,并不会引入具体依赖-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-Cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>-  
  • 注意:dependency为什么会有typepom,默认的值是什么?

dependency中type默认为jar即引入一个特定的jar包。那么为什么还会有type为pom呢?<br />当我们需要引入很多jar包的时候会导致pom.xml过大,我们可以想到的一种解决方案是定义一个父项目,但是父项目只有一个,也有可能导致父项目的pom.xml文件过大。这个时候我们引进来一个type为pom,意味着我们可以将所有的jar包打包成一个pom,然后我们依赖了pom,即可以下载下来所有依赖的jar包

四、服务注册中心

1、什么服务注册中心

所谓服务注册中心就是在整个的微服务架构中单独提出一个服务,这个服务不完成系统的任何的业务功能,仅仅用来完成对整个微服务系统的服务注册和服务发现,以及对服务健康状态的监控和管理功能。

定义:服务注册中心就是在整个微服务中单独抽取一个服务,这个服务不完成项目中任何业务功能,只用来在微服务中记录微服务以及对整个系统微服务进行健康状态检查,以及服务元数据信息存储

# 1.服务注册中心
- 可以对所有的微服务的信息进行存储,如微服务的名称、IP、端口等

- 可以在进行服务调用时通过服务发现查询可用的微服务列表及网络地址进行服务调用

- 可以对所有的微服务进行心跳检测,如发现某实例长时间无法访问,就会从服务注册表移除该实例

2、常用的服务注册中心

常用注册中心组件:eureka(netfix),zookeeper(java),consul(Go),nacos(java阿里巴巴)

五、开发服务注册中心eureka(易瑞卡 )server

# 0.简介
- https://github.com/Netflix/eureka/wiki
- Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务。
SpringCloud将它集成在其子项目spring-cloud-netflix中,    
以实现SpringCloud的服务注册和发现功能。
  Eureka包含两个组件:`Eureka Server和Eureka Client。`

1、

1、创建项目并引入eureka server依赖

 <parent>
        <artifactId>SpringCloud_Parent</artifactId>
        <groupId>com.tjcu</groupId>
        <version>1.0-RELEASE</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>eurekaServe</artifactId>

  

    <dependencies>
        <!--1、引入SpringBootWeb-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <!--2、引入 eureka server-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

    </dependencies>

2、编写配置application.properties

#执行服务端口
server.port=8761
#服务注册中心名称 唯一标识
spring.application.name=EUREKASERVER
#指定服务中心地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka

3、开启Eureka Server,入口类加入注解

@SpringBootApplication
@EnableEurekaServer  //开启Eureka Server
public class EurekaServeApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServeApplication.class,args);
    }
}

4、访问Eureka的服务注册页面

5、注意事项

  • 在项目启动成功后默认在eureka server管理界面出现UNKNOWN 一个未知应用

注意:在微服务架构中服务名称代表服务唯一标识,至关重要,服务名称必须唯一

  • 在eureka server启动过程中报错

出现上述问题原因:eureka组件包含 eurekaserver 和 eurekaclient。server是一个服务注册中心,用来接受客户端的注册。client的特性会让当前启动的服务把自己作为eureka的客户端进行服务中心的注册,当项目启动时服务注册中心还没有创建好,所以找我不到服务的客户端组件就直接报错了,当启动成功服务注册中心创建好了,日后client也能进行注册,就不再报错啦!

6、关闭Eureka自己注册自己

#执行服务端口
server.port=8761
#服务注册中心名称 唯一标识
spring.application.name=EUREKASERVER
#指定服务中心地址
eureka.client.service-url.defaultZone=http://localhost:8
#不再将自己作为客户端注册,只作为服务注册中心
eureka.client.register-with-eureka=false
#关闭作为客户端时从eureka server 获取服务信息
eureka.client.fetch-registry=false

六、开发Eureka Client

1.创建项目并引入eureka client依赖

    <parent>
        <artifactId>SpringCloud_Parent</artifactId>
        <groupId>com.tjcu</groupId>
        <version>1.0-RELEASE</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>eurekaClient</artifactId>

   <dependencies>
       <!--引入springBoot web依赖-->
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-web</artifactId>
       </dependency>
       <!--引入eureka client-->
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
       </dependency>

   </dependencies>

2.编写配置application.properties

#服务端口号
server.port=8989
#服务名称唯一标识
spring.application.name=eurekaClient8888
#eureka服务注册中心地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka

3.开启eureka客户端加入注解

@SpringBootApplication
@EnableEurekaClient
public class EurekaClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaClientApplication.class, args);
    }
}

4.启动之前的8761的服务注册中心,在启动eureka客户端服务

5.查看eureka server的服务注册情况

6.eureka自我保护机制

  • 服务频繁启动时 EurekaServer出现错误

EMERGENCY! 
EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE 
UP WHEN THEY'RE NOT. 
RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE
 INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.

  • eureka自我保护机制

- 官网地址: https://github.com/Netflix/eureka/wiki/Server-Self-Preservation-Mode


- 默认情况下,如果Eureka Server在一定时间内(默认90秒)没有接收到某个微服务实例的心跳,
Eureka Server将会移除该实例。但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,
而微服务本身是正常运行的,此时不应该移除这个微服务,所以引入了自我保护机制。
Eureka Server在运行期间会去统计心跳失败比例在 15 分钟之内是否低于 85%,
如果低于 85%,Eureka Server 会将这些实例保护起来,让这些实例不会过期。
这种设计的哲学原理就是"宁可信其有不可信其无!"。
自我保护模式正是一种针对网络异常波动的安全保护措施,
使用自我保护模式能使Eureka集群更加的健壮、稳定的运行。
  • 在eureka server端关闭自我保护机制

eureka.server.enable-self-preservation=false  #关闭自我保护
eureka.server.eviction-interval-timer-in-ms=3000 #超时3s自动清除
  • eureka client微服务修改减短服务心跳的时间

 eureka.instance.lease-expiration-duration-in-seconds=10 #用来修改eureka server默认接受心跳的最大时间 默认是90s
eureka.instance.lease-renewal-interval-in-seconds=5     #指定客户端多久向eureka server发送一次心跳 默认是30s
  • 尽管如此关闭自我保护机制还是会出现警告

- THE SELF PRESERVATION MODE IS TURNED OFF.
    THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.
    
- `官方并不建议在生产情况下关闭
  • eureka 停止更新

官方停止更新说明
- https://github.com/Netflix/eureka/wiki
- 在1.x版本项目还是活跃的,但是在2.x版本中停止维护,出现问题后果自负!!!

7、Eureka server集群搭建

  • 不再推荐使用eureka服务注册中心:

    1. 最新版本停止更新

  1. 每次必须通过手动代码形式开发服务注册中心

七、Consul 服务注册中心

1、consul 简介

基于go语言进行开发服务注册中心 轻量级服务注册中心 google

  • consul是一个可以提供服务发现,健康检查,多数据中心,Key/Value存储等功能的分布式服务框架,用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案,使用起来也较为简单。Consul用Golang实现,因此具有天然可移植性(支持Linux、Windows和Mac OS X);安装包仅包含一个可执行文件,方便部署。

2、安装consul及部署运行

(1)下载consul

(2)安装consul

解压之后发现consul只有一个脚本文件

(3)根据解压缩目录配置环境变量

在path里面配置路径

(4)查看consul环境变量是否配置成功,执行命令出现如下信息代表成功

consul -v

(5) 启动consul服务

consul agent -dev

(6)访问consul的web服务端口

  • dc1:datacenter1 数据中心 默认为dc1 指定数据中心启动 consul agent -dev -datacenter aa

  • service:当前consul中服务注册中注册服务列表 默认:client server同时启动自己注册一个 会出现一个consul服务

  • nodes:用来查看consul的集群节点

3、开发consul 客户端即微服务

(1)创建项目并引入consul客户端依赖

<parent>
        <artifactId>SpringCloud_Parent</artifactId>
        <groupId>com.tjcu</groupId>
        <version>1.0-RELEASE</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>consulClient</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--引入consul依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>
    </dependencies>

(2)编写properties配置

server.port=8889
spring.application.name=consulClient8889
#注册consul服务的主机
spring.cloud.consul.host=localhost
#注册consul服务的端口号
spring.cloud.consul.port=8500
#关闭consul服务的健康检查 【不推荐】
spring.cloud.consul.discovery.register-health-check=false
#指定注册的服务名称默认就是应用名
spring.cloud.consul.discovery.service-name=${spring.application.name}

(3)启动服务查看consul界面服务信息(没有开启健康检查的)

(4)consul 开启健康监控检查

默认情况consul监控健康是开启的,但是必须依赖健康监控依赖才能正确监控健康状态所以直接启动会显示错误,引入健康监控依赖之后服务正常

  • 健康检查的依赖

<!-- 这个包是用做健康度监控的-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

4、不同注册中心区别

(1)CAP定理

  • CAP定理:CAP定理又称CAP原则,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。 一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本) 可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性) 分区容忍性(P),就是高可用性,一个节点崩了,并不影响其它的节点(100个节点,挂了几个,不影响服务,越多机器越好)

(2)Eureka特点

  • Eureka中没有使用任何的数据强一致性算法保证不同集群间的Server的数据一致,仅通过数据拷贝的方式争取注册中心数据的最终一致性,虽然放弃数据强一致性但是换来了Server的可用性,降低了注册的代价,提高了集群运行的健壮性。

(3)Consul特点

  • 基于Raft算法,Consul提供强一致性的注册中心服务,但是由于Leader节点承担了所有的处理工作,势必加大了注册和发现的代价,降低了服务的可用性。通过Gossip协议,Consul可以很好地监控Consul集群的运行,同时可以方便通知各类事件,如Leader选择发生、Server地址变更等。

(4)zookeeper特点

  • 基于Zab协议,Zookeeper可以用于构建具备数据强一致性的服务注册与发现中心,而与此相对地牺牲了服务的可用性和提高了注册需要的时间。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐