3.1Eureka
3.1.1什么是Eureka
什么是服务治理:Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务治理。在传统的rpc远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务于服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册。
什么是服务注册与发现:Eureka采用了CS的设计架构,Eureka Server 作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用 Eureka的客户端连接到 Eureka Server并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。
在服务注册与发现中,有一个注册中心。当服务器启动的时候,会把当前自己服务器的信息,比如服务地址通讯地址等以别名方式注册到注册中心上。另一方(消费者|服务提供者),以该别名的方式去注册中心上获取到实际的服务通讯地址,然后再实现本地RPC调用RPC远程调用框架
核心设计思想在于注册中心,因为使用注册中心管理每个服务与服务之间的一个依赖关系(服务治理概念)。在任何rpc远程框架中,都会有一个注册中心(存放服务地址相关信息(接口地址))
Eureka包含两个组件:Eureka Server和Eureka Client
Eureka Server提供服务注册服务
各个微服务节点通过配置启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观看到。
EurekaClient通过注册中心进行访问
是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)
3.1.2单机Eureka构建
第一步:生成EurekaServer端服务注册中心
(1)新建eureka-server7001模块,写eureka-server7001的pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>cloudtest</artifactId>
<groupId>com.taotao.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>eureka-server7001</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<!--eureka-server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>com.taotao.springcloud</groupId>
<artifactId>api-commons</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
</project>
(2)写yml、主启动
(3)启动eureka-server7001、访问http://localhost:7001/
第二步:将provider-payment8001注册进EurekaServer
(1)在provider-payment8001的pom中添加依赖
<!--eureka-clint-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
(2)在yml中添加eureka的相关配置
(3)在主启动类上添加注解
(4)先启动eureka-server7001,再启动provider-payment8001,访问http://localhost:7001/
第三步:将consumer-order80注册进EurekaServer
(1)在consumer-order80的pom中添加依赖
<!--eureka-clint-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
(2)在yml中添加eureka的相关配置
(3)在主启动类上添加注解
(4)先启动eureka-server7001,再启动provider-payment8001,再启动consumer-order80,访问http://localhost:7001/
访问http://localhost/consumer/payment/selectById/2
3.1.3集群Eureka构建——搭建三个节点的集群为例
第一步:建三个节点模块,
(1)新建eureka-server7001、eureka-server7002、eureka-server7003(参考3.1.2节)
(2)修改映射配置
(3)分别写三个节点模块的yml,三个节点互相注册
(4)启动三个节点,分别访问localhost:7001/、localhost:7002/、 localhost:7003/(或http://eureka7001.com:7001/)
第二步:构建provider-payment集群环境(以两个为例),发布到3个eureka节点
(1)按照2.3.1节创建provider-payment8002模块
(2)将两个provider-payment发布到eureka集群
(3)修改两个provider-payment的controller
第三步:将consumer-order发布到eureka集群
第四步:负载均衡
(1)修改consumer-order中controller的PaymentSrv_URL
(2)使用@LoadBalanced注解赋予RestTemplate负载均衡的能力
第五步:测试,
(1)依次启动eureka集群、provider集群、consumer
(2)访问其中一个eureka节点
(3)多次访问http://localhost/consumer/payment/selectById/2测试轮询
3.1.4actuator微服务信息完善
在yml文件中添加以下配置,修改服务名称,使访问信息有IP提示:
3.1.5Eureka自我保护
某时刻某一个微服务不可用了,eureka不会立刻清理,依旧会对该服务的信息进行保存
3.2Zookeeper
Zookeeper是一个分布式协调工具,可以实现注册中心功能
3.2.1服务提供者
第一步:新建provider-payment8003模块
(1)zookeeper的依赖
<!--zookeeper-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>
(2)yml
(3)主启动类
(4)controller
第二步:启动zokeeper
第三步:测试
(1)启动provider-payment8003,在zookeeper中查看是否注册成功
(2)访问http://localhost:8003/payment/zk
(3)在zookeeper中查看当前访问的编码,查看该编码,得到json,解析该json
3.2.2服务消费者
第一步:新建consumerzk-order80
(1)pom、yml、主启动类
<!--zookeeper-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>
(2)config
(3)controller
第二步:测试
(1)启动consumerzk-order80
(2)在zookeeper中查看
(3)访问http://localhost/consumer/payment/zk
3.3Consul
3.3.1Consul简介
提供HTTP和DNS两种发现方式;支持多种健康监控;KV存储;支持多数据中心;可视化web界面
下载地址:https://www.consul.io/downloads.html
使用手册:https://www.springcloud.cc/spring-cloud-consul.html
3.3.2安装并运行Consul
下载解压之后只有一个exe文件,可以进入到cmd查看consul的版本
使用consul agent -dev启动consul
启动成功之后访问localhost:8500/进入到可视化界面
3.3.3服务提供者
第一步:新建provider-payment8004
<!--consul-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
第二步:测试
3.3.4服务消费者
第一步:新建consumerconsul-order80
<!--consul-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
第二步:测试
3.4对比三个注册中心
CAP理论:C——Consistency(强一致性);A——Availability(可用性);P——Partition tolerance(分区容错性)
Eureka:AP
Zookeeper、Consul:CP