《自学SpringCloud微服务架构》之第 6 篇 —— 注册服务提供者、搭建高可用注册中心、Eureka自我保护机制

 

上一篇博客完成注册中心的搭建,接下来搭建一下服务提供者。

注册服务提供者

1、对着 MyProject 鼠标右键,New 一个 Module 模块。

 

服务提供者的名字:eureka-client

OK。我们修改 eureka-client 模块的 pom.xml 配置文件。需要增加 <dependencies> 和 <build> 节点的配置

<?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>MyProject</artifactId>
        <groupId>com.study</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>eureka-client</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <version>2.1.2.RELEASE</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    
</project>

注意!

spring-cloud-starter-netflix-eureka-client 没有指定依赖的版本号,需要手动指定其版本号。我们这里选择 2.1.2.RELEASE

更多版本可以查看官网:https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-eureka-client

 

然后,我们先创建1个package,再创建 SpringBoot 的启动类:EurekaClientApplication,注意结构(看上一篇博客)

EurekaClientApplication 类的内容如下,增加一个测试方法,和获取客户端配置文件的服务名。

package com.study;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author biandan
 * @signature 让天下没有难写的代码
 * @create 2019-10-15 下午 11:30
 */
@SpringBootApplication
@EnableEurekaClient //表明此类是一个客户端
@RestController
public class EurekaClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaClientApplication.class, args);
    }

    //从 yml 配置文件里获取客户端的名字
    @Value("${spring.application.name}")
    private String clientName;

    //测试方法:向调用者返回一句签名
    @RequestMapping("/say")
    public String sayHello() {
        return clientName + " 说:让天下没有难写的代码";
    }
}

新建一个 application.yml 配置文件,内容如下:

# 这是客户端服务的配置节点
server:
  port: 9000

# 客户端配置,hostname指向本机
eureka:
  instance:
    hostname: 127.0.0.1
  client:
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:8000/eureka/

# 服务的名字
spring:
  application:
    name: eureka-client-biandan

说明:

1、服务提供者我们的设置的端口号是 9000(注册中心的端口是8000)

2、defaultZone:这里的配置是注册中心的全路径,因为是本机测试,所有都是相同的IP,端口号暂时写固定。

3、我们给服务起了一个名字:eureka-client-biandan

 

OK,我们启动服务提供者,做测试(先启动注册中心的程序,再起服务提供者的程序):

看到我们的服务起来了。先去 http://127.0.0.1:8000/ 这个地址看下相关信息。

说明我们的服务已经注册上去了(Application名称都变大写了)。

接着,我们在浏览器地址输入如下地址,即调用服务提供者的 sayHello()方法:http://127.0.0.1:9000/say

说明我们在程序里获取到了配置文件里的相关信息(以后工作中基本都是使用这样的方式获取配置文件里的值),并且接口调用成功,实际工作中,这就是一个简单的 RESTful 接口了。

 

 高可用注册中心

问什么是“高可用”?

答:高可用性H.A.(High Availability)指的是通过尽量缩短因日常维护操作(计划)和突发的系统崩溃(非计划)所导致的停机时间,以提高系统和应用的可用性。HA系统是目前企业防止核心计算机系统因故障停机的最有效手段。

在分布式的环境中,要充分考虑到各种故障对生产造成的影响。实际生产环境,必须对各个组件进行高可用部署。否则造成的损失不可估量。所以我们需要构建高可用的注册中心来增强系统的可用性。

Eureka Server的高可用性,实际上就是将自己作为服务,向气他注册中心注册自己。这就形成相互注册的服务注册中心,这就可以实现服务清单的互相同步,达到高可用效果。简单来说,就是使用集群。

接下来,我们再创建一个 Eureka Server,作为备份服务的。一般公司里,都是一主一备,视情况会创建更多的备份服务。

创建过程跟之前的一样。

 

cluster 模块的 pom.xml 配置文件增加与 EurekaServer 的一样。

<?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>MyProject</artifactId>
        <groupId>com.study</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>eureka-server-cluster</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>
    
</project>

新建SpringBoot 启动类 EurekaServerClusterApplication,跟之前一致,记得创建 com.study 包,不建议使用默认的包。

package com.study;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

/**
 * @author biandan
 * @signature 让天下没有难写的代码
 * @create 2019-10-16 下午 11:04
 */
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerClusterApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaServerClusterApplication.class,args);
    }
}

新建 application.yml 配置文件,内容如下:

# 这是服务配置的节点
server:
  port: 8001

eureka:
  instance:
    # 备份机自己所在的域名
    hostname: cluster.study.com
  client:
    # 注册中心也会将自己作为客户端来尝试注册自己,我们禁用它的客户端注册行为
    registerWithEureka: false
    # 注册中心的职责就是去维护服务实例,不需要去检索服务,这里设置 false
    fetchRegistry: false
    serviceUrl:
      # 单机的时候使用的是自己所在的路径,集群的时候是其它机器所在的路径
      defaultZone: http://main.study.com:8000/eureka/

spring:
  application:
    name: eureka-server-cluster

说明:

1、端口号:我们这里使用 8001

2、hostname:我们这里配置 cluster.study.com,是备份服务的域名,在电脑的 host 文件做本机域名映射,可以查看博客:https://blog.csdn.net/BiandanLoveyou/article/details/103742805

3、defaultZone:对应主服务的 URL 全路径,包括端口号,如果需要配置多个注册中心,需要用逗号隔开

4、eureka-server-cluster:是备份服务的名字。

接下来,我们需要修改主服务的 application.yml 配置文件,即图中的文件:

# 这是服务配置的节点
server:
  port: 8000

# 这是注册中心的节点配置
eureka:
  instance:
    hostname: main.study.com
  client:
    # 注册中心也会将自己作为客户端来尝试注册自己,我们禁用它的客户端注册行为
    registerWithEureka: false
    # 注册中心的职责就是去维护服务实例,不需要去检索服务,这里设置 false
    fetchRegistry: false
    serviceUrl:
      # 单机的时候使用的是自己所在的路径,集群的时候是其它机器所在的路径
      defaultZone: http://cluster.study.com:8001/eureka/

spring:
  application:
    name: eureka-server-main

说明:

1、端口号:主服务还是使用 8000

2、hostname:配置的是主服务所在的域名,在电脑的 host 文件做本机域名映射,可以查看博客:https://blog.csdn.net/BiandanLoveyou/article/details/103742805

3、defaultZone:配置的是备份服务 cluster 的 URL 全路径,包括端口。如果需要配置多个注册中心,需要用逗号隔开

4、主服务名字:eureka-server-main

 

万事俱备,我们先启动主的注册中心,再启动集群注册中心。

1、先启动主注册中心的服务

2、启动集群注册中心的服务

3、在浏览器打开如下地址:http://main.study.com:8000/ ,可以看到备份服务的信息

打开:http://cluster.study.com:8001/ 可以看到主服务的信息

至此,说明我们高可用注册中心搭建成功!

题外话:如果我们不想用主机名来定义注册中心的地址,也可以使用 IP 的形式。

只需要在配置文件中增加配置参数:eureka.instance.prefer-ip-address = true,该值默认是false。

还有件事,就是我们修改了 hosts 映射文件,我们需要相对应的修改 client 的 application.yml 配置文件:

配置内容如下:

# 这是客户端服务的配置节点
server:
  port: 9000

# 客户端配置,hostname指向本机
eureka:
  instance:
    hostname: main.study.com
  client:
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:8000/eureka/

# 服务的名字
spring:
  application:
    name: eureka-client-biandan

我们启动 client 服务,然后到 主注册中心、备份注册中心 看下:

主注册中心:http://main.study.com:8000/  和备份注册中心: http://cluster.study.com:8001/

我们看到已经注册上去了,而且主、备的注册中心的服务清单里都有我们的服务提供者信息。

注意到上方多了一段红色的字体。这是 Eureka 的自我保护。

之后我们的配置文件,就采用域名的方式,而不是使用 localhost 或者 IP 地址了。

 

Eureka 自我保护机制

在本地开发调试的时候,经常会碰到如上图的红色警告信息。这就是 Eureka的自我保护机制。

问:产生 Eureka 自我保护机制的原因?

答:服务注册到 Eureka Server 的注册中心后,会与注册中心维护一个心跳连接。默认情况下,Eureka Server 会统计心跳失败的比例在 15 分钟之内是否低于 85%的服务,我们经常重启服务,容易导致心跳失败率低于此值。Eureka Server 会将当前的实例信息保护起来,让这些服务实例不会过期。这就是 Eureka 的自我保护机制。

但是在保护期间,客户端的消费者很容易拿到实际上已经不存在的服务实例,就会出现调用失败的情况。所以“请求重试”、“断路器”的技术实现应运而生。

问:如何关闭 Eureka 自我保护机制?

答:我们在本地开发调试的时候,可以关闭 Eureka 的自我保护机制。在配置文件加上以下一行代码即可(注意节点的位置)

eureka.server.enable-self-preservation = false

# 这是注册中心的节点配置
eureka:
  instance:
    hostname: main.study.com
  # 关闭 Eureka 的自我保护机制
  server:
    enable-self-preservation: false

但是,关闭自我保护机制后,还是会弹出红色警告信息。所以建议了解自我保护即可,不需要关闭。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值