SpringCloud 之 注册中心

概述

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安装略

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值