上一篇博客完成注册中心的搭建,接下来搭建一下服务提供者。
注册服务提供者
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
然后,我们先创建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
但是,关闭自我保护机制后,还是会弹出红色警告信息。所以建议了解自我保护即可,不需要关闭。