Spring Cloud系列(一):服务注册中心
阅读原文时间:2023年07月10日阅读:1

一、Spring Cloud简介

Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线)。分布式系统的协调导致了样板模式, 使用Spring Cloud开发人员可以快速地支持实现这些模式的服务和应用程序。他们将在任何分布式环境中运行良好,包括开发人员自己的笔记本电脑,裸机数据中心,以及Cloud Foundry等托管平台。

https://www.springcloud.cc/spring-cloud-dalston.html

Spring Cloud需要基于Spring Boot项目来构建,而Spring Boot是在spring上封装了大量的注解和自动配置,增加了许多优秀的中间件的一个优秀的框架,如果不了解Spring Boot的使用,建议先去了解Spring Boot。

二、注册中心的介绍

在介绍注册中心之前先说一下单应用的架构。在单应用架构中,我们把所有的业务功能都放在了同一个项目中,如果有其中一个接口需要改动,那么就需要重新部署整个项目。当请求量大的时候,往往会在服务的前端增加一个负载均衡的组件,比如Nginx。这样,请求会先到达Nginx,再由Nginx把请求按照一定的策略分发给不同的节点(这里的一个节点就是一个tomcat服务),然后再处理返回结果。

在Spring Cloud这样的分布式架构中,我们会把服务进行拆分。比如说一个电商系统,我们可以粗略地把系统拆分为商品详情服务、订单服务、会员服务等等。这样,每个系统会有自己的数据库,只做自己的事。这时假如说一个用户想看一下订单详情,按道理说他需要请求订单系统的相关接口,但是订单详情应该显示这个订单的商品简略信息,比如商品名、商品缩略图等,但商品相关的信息应该是放在商品服务中的,这时候就需要一个地方,让商品服务把自己提供的服务放进去,让订单服务去调用,这个地方就是注册中心。

可以有多个服务提供者把自己提供的服务注册到注册中心,当服务消费者需要调用服务时,不用首先知道服务在哪里,而是直接去找注册中心就行了,从注册中心那里拿到所有可用的服务,然后自己再通过一定的策略来决定调用哪一个。另外,一个服务节点,既可以是服务提供者,也可以是服务消费者。

Spring Cloud支持的注册中心可以有多种,比如Eureka、Zookeeper、Consul等等。在这里我们使用Eureka作为我们的注册中心。

三、准备工作

我们使用IDEA作为开发工具,因为Spring Cloud是需要多个微服务协同工作的,在IDEA中,我们需要一个主项目(相当于Eclipse的一个Workspace),然后在主项目中每一个module(相当于Eclipse中的一个project)都是其中的一个服务。

3.1、创建一个Empty Project

然后填写好名称,完成后会弹出提供你创建module的对话框,先关闭。

3.2 创建Eureka模块作为服务注册中心

选择File->New->Module…,然后选择Spring Initializr。

然后填写好module的名称,接下来再选择相关的依赖——选择Spring Cloud Discovery下的Eureka Server依赖,Spring Boot的版本我们选择2.1.10,最后根据导向完成创建工作。创建好的module的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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.10.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example.springcloud</groupId>
    <artifactId>eureka</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>eureka</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR4</spring-cloud.version>
    </properties>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

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

</project>

如果你使用的是没有Spring Initializr的IDEA Community版本,你也可以先创建一个maven的module,再到https://start.spring.io/选择Eureka,然后点击Explore-Ctrl + Space按钮,把相关的依赖复制到pom文件中。

3.3、配置eureka的参数

在application.properties文件中(如果习惯使用yml可以自行做调整)添加以下的配置

server.port=8761
spring.application.name=eureka

eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/

事实上,eureka会把自身作为一个服务注册到自身当中,而eureka.client.register-with-eurekaeureka.client.fetch-registry这两个属性的值设置为false表明不需要把自己注册进去。

3.4、开启服务注册功能

在启动的主类上加上@EnableEurekaServer开启eureka服务功能

@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {

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

}

到此注册中心微服务就完成了,可以启动了。

3.5、服务注册中心后台

启动成功后,在浏览器访问http://localhost:8761/,就可以看到Eureka的管理后台了,在这里我们可以看到向注册中心所注册的服务,目前我们还没有任何的服务注册,所以显示No instances available。

四、注册中心集群

我们的服务都需要注册到注册中心,如果只有一个节点,万一注册中心宕机了,整个系统就瘫痪了,注册中心作为服务的中枢,我们不能只用一个节点。如果有使用ZooKeeper的经验的人一定知道集群这个概念,这就是为了系统的高可用性而把数据切割成几个部分放到不同的节点中,就算有其中一个甚至几个节点出了问题,整个系统还是不受影响的。这里也介绍一下Eureka集群。

4.1、修改hosts文件

为了可以在windows上搭建集群,首先需要修改hosts文件,在hosts文件添加以下内容

127.0.0.1  eureka-1
127.0.0.1  eureka-2
127.0.0.1  eureka-3

4.2、修改配置文件

然后在resources目录下创建application-eureka1.properties、application-eureka2.properties、application-eureka3.properties

其中application-eureka1.properties的配置如下:

server.port=8761
spring.application.name=eureka

eureka.instance.hostname=eureka-1
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
eureka.client.serviceUrl.defaultZone=http://eureka-2:8762/eureka/,http://eureka-3:8763/eureka/

节点1的端口是8761,主机名是eureka-1,那么defaultZone的值就配置另外两个节点的地址,地址用逗号分开;然后节点2的端口是8762,然后配置节点1和3的地址,以此类推。值得说明的是register-with-eureka和fetch-registry的值需要设置为true或者不配置(默认是true),因为搭建集群的时候需要把自己作为一个服务注册到注册中心,这样另外两个eureka服务才能发现它。

4.3、启动服务

点击启动配置下拉菜单,选择创建三个Spring Boot的启动配置,填写好名称、启动类和所用的配置文件:

填写好配置的名称(EurekaApplication-1)、选择启动类作为Main class,Active profile其实就是使用的配置文件,只需要写application-后面的那一段就行了。

然后如法炮制添加节点2和3。

到此集群方式的Eureka注册中心就完成了,如果上一步的单节点的应用还在运行的话先停止,不然会引起端口冲突。依次启动这三个节点,当启动第一个或者前两个时会报异常,这是因为我们的eureka集群是三个节点的,当第一个节点8761启动后,会去找8762和8763,但是此时另外两个节点还没启动,所以出现异常信息,这是正常的,当三个都启动成功后在浏览器访问http://eureka-1:8761/,也可以访问http://eureka-2:8762/http://eureka-3:8763/,此时在eureka后台可以看到另外两个节点

图片下方Application这一项是根据配置文件中spring.application.name属性的值来显示的,就是应用的名称,因为我们把三个节点的名称都写成了一样,这里就会合并在一起显示,然后在Status中以各自的端口号区分,然后应用名不相同,就会分别显示。(但是同样的服务的服务名要写成一致)

另外我们需要注意一下后台下面的General Info的信息,如果其它两个节点可用,就会显示在available-replicas中,否则就会显示在unavailable-replicas中,这一点可以帮助我们检查注册中心的节点的健康状况。

五、总结

到此,eureka注册中心的使用就介绍完毕,下一篇介绍服务注册。

源码已经上传到github:https://github.com/spareyaya/spring-cloud-demo/tree/master/chapter1