概述
Spring Cloud为开发人员提供了工具,以快速构建分布式系统中的某些常见模式(例如,配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁,领导选举,分布式会话,群集状态)。分布式系统的协调导致了样板式样,并且使用Spring Cloud开发人员可以快速站起来实现这些样板的服务和应用程序。它们可以在任何分布式环境中正常工作,包括开发人员自己的笔记本电脑,裸机数据中心和Cloud Foundry等托管平台。
环境搭建
①在原有的SpringBoot的依赖中导入以下依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR9</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Spring Boot项目的搭建参考
https://blog.csdn.net/weixin_38231448/article/details/111254296
服务注册中心
Eureka
Spring Cloud Eureka 是 Spring Cloud Netflix 微服务套件中的一部分, 它基于 Netflix Eureka 做了二次封装, 主要负责完成微服务架构中的服务治理功能。 Spring Cloud 通过为Eureka 增加了 Spring Boot 风格的自动化配置,我们只需通过简单引入依赖和注解配置就能让 Spring Boot构建的微服务应用轻松地与 Eureka 服务治理体系进行整合。
Eureka注册中心担任三种角色:instance、server、client因此用户在使用Eureka的时候需要注意这三种角色的区别。
- instance - 可以将Eureka理解为一个普通的服务的实例
- server - 可以将Eureka理解为一个注册中心服务,用于接收其他服务实例信息
- client - 理解为客户端信息,用于向注册中心进行注册信息或者是抓取服务列表信息等。
在上述的架构中我们可以看到Eureka在架构设计上遵循AP的设计原则,因此需要知道即使在Eureka不能正常工作的时候,会开启所谓的自我保护机制
继而不再管理和剔除无效服务,但是服务的消费者依旧可以注册和访问现有的服务。这个时候如果服务消费者恰巧引用的是一个已经下线的服务
的时候,可能会调用失败。
单机构建
1、添加额外依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2、配置Eureka服务
server.port=8761
# Eureka服务实例
eureka.instance.hostname=localhost
# 服务注册中心检测,要求接受的心跳达到85%,否则认定注册中心故障
eureka.server.renewal-percent-threshold=0.85
# 期望服务提供者,每分钟发送5次心跳参数过来60s/30s
eureka.server.expected-client-renewal-interval-seconds=30
# 设置当注册中心检测核实进入到自我保护机制
eureka.server.wait-time-in-ms-when-sync-empty=1000
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
3、编写cloud启动配置类
@SpringBootApplication
@EnableEurekaServer
public class EurekaSpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaSpringBootApplication.class,args);
}
}
4、访问http://主机:8761
端口查看
通过上面的截图我们不难发现,很快系统就提示出来EMERGENCY
的提示,大概是提醒用户可能出现了大量的服务实例不可用导致了Renews (last min)
>Renews threshold
.
R
e
n
e
w
s
t
h
r
e
s
h
o
l
d
=
取
整
[
(
心
跳
数
/
每
分
钟
∗
实
例
个
数
)
∗
百
分
比
]
Renews threshold=取整[(心跳数/每分钟 * 实例个数)* 百分比]
Renewsthreshold=取整[(心跳数/每分钟∗实例个数)∗百分比]
集群构建
1、服务实例1- 部署CentOSA
server.port=8761
spring.application.name=eureka-server
# Eureka服务实例
eureka.instance.instance-id=eureka-01
eureka.instance.hostname=CentOSA
## 服务刷新时间配置,每隔这个时间会主动心跳一次
eureka.instance.lease-renewal-interval-in-seconds= 5
## 服务提供者被认定为丢失心跳超时,失效多久后被删除
eureka.instance.lease-expiration-duration-in-seconds=15
# 服务注册中心检测,要求接受的心跳达到85%,否则认定注册中心故障
eureka.server.renewal-percent-threshold=0.85
# 期望服务提供者,每分钟发送5次心跳参数过来60s/30s
eureka.server.expected-client-renewal-interval-seconds=30
# 设置当注册中心检测核实进入到自我保护机制
eureka.server.wait-time-in-ms-when-sync-empty=30000
## 启用注册中心主动失效,并且每次主动失效检测间隔为5s 默认值60s
eureka.server.eviction-interval-timer-in-ms= 5000
## 设置eureka注册中心的响应更新时间
eureka.server.responseCacheUpdateIntervalMs=3000
eureka.server.responseCacheAutoExpirationInSeconds=60
## 配置定时获取|抓取注册中心的数据时间
eureka.client.registry-fetch-interval-seconds= 5
eureka.client.instance-info-replication-interval-seconds= 5
## 配置集群中其他eureka实例,用于本eureka实例的注册方。
eureka.client.region=beijing
eureka.client.availability-zones.beijing=zone-2,zone-3
eureka.client.service-url.zone-2=http://CentOSB:8761/eureka/
eureka.client.service-url.zone-3=http://CentOSC:8761/eureka/
2、服务实例2- 部署CentOSB
server.port=8761
spring.application.name=eureka-server
# Eureka服务实例
eureka.instance.instance-id=eureka-02
eureka.instance.hostname=CentOSB
## 服务刷新时间配置,每隔这个时间会主动心跳一次
eureka.instance.lease-renewal-interval-in-seconds= 5
## 服务提供者被认定为丢失心跳超时,失效多久后被删除
eureka.instance.lease-expiration-duration-in-seconds=15
# 服务注册中心检测,要求接受的心跳达到85%,否则认定注册中心故障
eureka.server.renewal-percent-threshold=0.85
# 期望服务提供者,每分钟发送5次心跳参数过来60s/30s
eureka.server.expected-client-renewal-interval-seconds=30
# 设置当注册中心检测核实进入到自我保护机制
eureka.server.wait-time-in-ms-when-sync-empty=30000
## 启用注册中心主动失效,并且每次主动失效检测间隔为5s 默认值60s
eureka.server.eviction-interval-timer-in-ms= 5000
## 设置eureka注册中心的响应更新时间
eureka.server.responseCacheUpdateIntervalMs=3000
eureka.server.responseCacheAutoExpirationInSeconds=60
## 配置定时获取|抓取注册中心的数据时间
eureka.client.registry-fetch-interval-seconds= 5
eureka.client.instance-info-replication-interval-seconds= 5
## 配置集群中其他eureka实例,用于本eureka实例的注册方。
eureka.client.region=beijing
eureka.client.availability-zones.beijing=zone-2,zone-3
eureka.client.service-url.zone-1=http://CentOSA:8761/eureka/
eureka.client.service-url.zone-3=http://CentOSC:8761/eureka/
3、服务实例3-部署CentOSC
server.port=8761
spring.application.name=eureka-server
# Eureka服务实例
eureka.instance.instance-id=eureka-03
eureka.instance.hostname=CentOSC
## 服务刷新时间配置,每隔这个时间会主动心跳一次
eureka.instance.lease-renewal-interval-in-seconds= 5
## 服务提供者被认定为丢失心跳超时,失效多久后被删除
eureka.instance.lease-expiration-duration-in-seconds=15
# 服务注册中心检测,要求接受的心跳达到85%,否则认定注册中心故障
eureka.server.renewal-percent-threshold=0.85
# 期望服务提供者,每分钟发送5次心跳参数过来60s/30s
eureka.server.expected-client-renewal-interval-seconds=30
# 设置当注册中心检测核实进入到自我保护机制
eureka.server.wait-time-in-ms-when-sync-empty=30000
## 启用注册中心主动失效,并且每次主动失效检测间隔为5s 默认值60s
eureka.server.eviction-interval-timer-in-ms= 5000
## 设置eureka注册中心的响应更新时间
eureka.server.responseCacheUpdateIntervalMs=3000
eureka.server.responseCacheAutoExpirationInSeconds=60
## 配置定时获取|抓取注册中心的数据时间
eureka.client.registry-fetch-interval-seconds= 5
eureka.client.instance-info-replication-interval-seconds= 5
## 配置集群中其他eureka实例,用于本eureka实例的注册方。
eureka.client.region=beijing
eureka.client.availability-zones.beijing=zone-1,zone-2
eureka.client.service-url.zone-1=http://CentOSA:8761/eureka/
eureka.client.service-url.zone-2=http://CentOSB:8761/eureka/
5、访问任意一台机器查看机器
注册服务
1、在现有的SpringBoot项目中引入如下依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR9</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2、在原始的application.properties添加如下配置
spring.application.name=USER-SERVICE
eureka.instance.instance-id=001
eureka.instance.prefer-ip-address=true
eureka.instance.lease-expiration-duration-in-seconds=20
eureka.instance.lease-renewal-interval-in-seconds=10
# 仅仅注册服务,无需引用服务
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=false
eureka.client.healthcheck.enabled=true
eureka.client.service-url.defaultZone=http://CentOSA:8761/eureka/,http://CentOSB:8762/eureka/,http://CentOSC:8763/eureka/
服务引用
1、在现有的SpringBoot项目中引入如下依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2、在原始的application.properties添加如下配置
eureka.client.fetch-registry=true
eureka.client.register-with-eureka=false
eureka.client.service-url.defaultZone=http://CentOSA:8761/eureka/,http://CentOSB:8762/eureka/,http://CentOSC:8763/eureka/
3、在项目中添加如下Bean即可
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
Zookeeper
服务注册
1、在现有的SpringBoot的项目下添加如下依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR9</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
<exclusions>
<!--先排除自带的zookeeper3.5.3-->
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--添加zookeeper3.4.6版本 -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
<exclusions>
<exclusion>
<artifactId>slf4j-log4j12</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
2、在项目工程的application.properties中添加如下配置
spring.application.name=USER-SERVICE
spring.cloud.zookeeper.connectString=CentOS7:2181
spring.cloud.zookeeper.discovery.instanceHost=CentOSA
spring.cloud.zookeeper.discovery.instancePort=8080
服务引用
服务注册
1、在现有的SpringBoot的项目下添加如下依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR9</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
<exclusions>
<!--先排除自带的zookeeper3.5.3-->
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--添加zookeeper3.4.6版本 -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
<exclusions>
<exclusion>
<artifactId>slf4j-log4j12</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
2、在项目工程的application.properties中添加如下配置
spring.application.name=USER-CONSUMER
spring.cloud.zookeeper.connectString=CentOS7:2181
spring.cloud.zookeeper.discovery.instanceHost=CentOSB
spring.cloud.zookeeper.discovery.instancePort=8088
3、在入口类中添加如下
@SpringBootApplication
public class UserDefineSpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(UserDefineSpringBootApplication.class,args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
Consul
服务注册
1、在现有的SpringBoot的项目下添加如下依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR9</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2、在application.proeprties添加如下配置
spring.cloud.consul.discovery.service-name=USER-SERVICE
spring.cloud.consul.discovery.instance-id=user-service-01
spring.cloud.consul.host=CentOSA
spring.cloud.consul.port=8500
服务引用
1、在现有的SpringBoot的项目下添加如下依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR9</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2、在application.proeprties添加如下配置
spring.cloud.consul.discovery.service-name=USER-SERVICE
spring.cloud.consul.discovery.instance-id=user-service-01
spring.cloud.consul.host=CentOSA
spring.cloud.consul.port=8500
3、在入口类中添加如下
@SpringBootApplication
public class UserDefineSpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(UserDefineSpringBootApplication.class,args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
consul安装略