作者的其他平台:
| CSDN:blog.csdn.net/qq_41153943
| 知乎:www.zhihu.com/people/1024…
| GitHub:github.com/JiangXia-10…
本文一共4950字,预计阅读13分钟
前言
在分布式系统中,服务注册中心充当着重要角色,是服务发现、客户端负载均衡中不可缺少的一员。注册中心除了能够实现基本的功能外,它的稳定性、可用性和健壮性对整个分布式系统的流畅运行影响重大。
什么是服务注册中心
在以前小型的单体应用中,各个组件之间的调用只需要通过有规范约束的接口进行即可。然而在微服务的架构中,原本的很大的应用通常就会按照业务被分割成相对独立的、提供特定功能的服务,每一个微服务都可以通过集群或者其他方式进行动态的扩展,每一个微服务实例的网络地址都可能动态变化。微服务架构中,服务跨度大,数量多,所以需要架构建立一个去中心化的组件对各个微服务实例的信息进行登记和管理,同时提供能力让各个微服务实例之间能够互相发现,从而达到互相调用的结果。
所以可以认为服务注册与发现包括两部分,一个是Server端,另一个是Client。Server端是一个公用的组件,为Client端提供服务注册和发现的功能,维护着注册到自身的客户端的相关信息,同时提供接口给客户端获取到注册表中其他服务的信息,使得动态变化的客户端在服务地址稳定的时间节点能够进行服务间调用。客户端将自己的服务信息通过一定的方式登记到服务端上,并在正常范围内维护自己信息的一致性,方便其他服务发现自己,同时可以通过服务端获取到自己依赖的其他服务信息,完成服务调用。
所以服务注册中心总结起来指的是在整个微服务架构中单独提出一个服务,这个服务不完成系统任何业务功能,仅仅用来完成整个微服务系统的服务注册和服务发现,以及对服务健康状态的监控和管理功能。
服务注册中心的功能可以总结为:
1、对所有的微服务信息进行存储,比如微服务的名称、ip、端口等;
2、在进行服务调用的时候通过服务发现查询可用的微服务列表以及网络地址进行服务调用;
3、对所有的微服务进行心跳检测,如发现某些实例长时间无法访问,就会从服务注册表中移除该实例。
常见的服务注册与发现组件有:netflix的eureka、zookeeper(关于zk可以参考之前的文章:zookeeper教程:入门篇)、consul、以及阿里的nacos(nacos作为注册中心可以参考之前的文章:SpringCloud:搭建Nacos服务以及服务发现)
什么是Eureka
Eureka来源于古希腊语,意为“我找到了!我发现了!”,据传,阿基米德在洗澡时发现浮力原理,高兴得来不及穿上裤子,跑到街上大喊:“Eureka(我找到了)!” 。在Netflix中,Eureka是一个REST风格的服务注册与发现的基础服务组件,主要是应用在AWS中定位中间层服务的负载均衡和故障转移。Eureka由两部分组成,一个是Eureka Server,提供服务注册和发现的功能;另一个是Java客户端,称为Eureka Client,是为了使得与服务端交互更加简单,Eureka Client会定时将自己的信息注册到Eureka Server中,并从Server中发现其他服务。客户端中有一个内置的负载均衡器,用来进行基本的循环负载均衡。
所以Eureka主要包含两个组件:Eureka Server和Eureka Client。
今天这篇文章主要一起学习如何开发eureka server作为服务注册中心。
实战开发
我的项目结构如下:
首先需要创建一个springcloud项目。我这里为了后续的学习创建了一个maven的聚合工程作为父项目使用。父项目主要就是用于进行依赖管理和版本控制。所以需要在父项目中添加一些项目相关的依赖。完整的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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.jiangxia</groupId>
<artifactId>springcloud_parent</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>springcloud01_eureka_server</module>
</modules>
<!--继承springboot的父项目-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
</parent>
<!--父项目不写代码,只维护依赖和版本-->
<!--自定义properties属性-->
<properties>
<!--具体的springcloud版本-->
<spring.cloud-version>Hoxton.SR6</spring.cloud-version>
</properties>
<!--维护版本-->
<dependencyManagement>
<dependencies>
<!--维护springcloud版本依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud-version}</version>
<!--父项目类型都是pom类型-->
<type>pom</type>
<!--当前项目也要导入一个父项目-->
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
然后创建一个子工程springcloud01_eureka_server,也就是这里的使用eureka-server进行服务注册中心的项目。由于子工程继承了父项目的依赖, 所以只需要在子项目的pom文件中添加下面的依赖即可:
<dependencies>
<!--引入springbootweb依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--引入eurekaserver依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
接着还需要添加一个入口启动类,除了使用@springbootapplication注解之外,还需要添加@enableEurekaServer注解,表示当前的项目是一个服务注册中心。
/**
* @author jiangxia
* @date 2022年05月18日 21:02
*/
@SpringBootApplication
//开启eurekaserver注解:表示当前应用是一个服务注册中心
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class,args);
}
}
最后一步就是配置文件中做一些配置,在application.properties文件中可以配置服务端口、服务名称、注册中心地址等配置,具体如下:
#eureka默认端口就是8761,这里和默认保持一致
server.port=8761
#指定服务名称,唯一标识,服务名不能出现下划线,如果不指定名称,显示的就是unknown
spring.application.name=eurekaserver
#指定服务注册中心的地址,暴露服务地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
# 关闭eureka立即注册,默认事true
eureka.client.fetch-registry=false
#让当前应用仅仅是服务注册中心,即开启不自己注册自己,默认是true
eureka.client.register-with-eureka=false
至此eureka server开发服务注册中心就开发完成了。启动项目:
在地址栏输入:
http://localhost:8761/
即可看到eureka server的管理界面:
可以发现这里并没有任何应用,是因为还没有应用注册进来。上面的有个配置:
# 关闭eureka立即注册,默认是true
eureka.client.fetch-registry=false
#让当前应用仅仅是服务注册中心,即开启不自己注册自己,默认是true
eureka.client.register-with-eureka=false
如果把上述的配置改为true,或者不设置(默认值就是true)。那么eureka server就会在启动的时候将自己注册到注册中心中去,如下:
并且在上述的启动过程中在控制台有报错信息输出:
这是因为eureka是包含了server和client两个组件的,当在项目中引入eureka server组件的时候,同时会将eureka client引入到项目中,因此启动时会将自己作为一个服务中心启动,同时将自己作为客户端在注册中心进行注册,而我们注释了配置文件中的两条配置,所以默认是启动时就立即注册,(如果前面的配置设置为true也是一样),但是注册时服务还没有准备完成,所以报错!所以将上面的两个配置设置为false即可。
总结
上述就是使用eureka server进行服务注册中心的开发,主要步骤就是创建相应的springcloud项目,然后导入springcloud和eureka server相关依赖,最后在配置文件中进行eureka server的配置,入口类上使用@EnableEurekaServer注解开启服务注册中心即可。
后续文章将继续eureka client的开发。